nuxt3 + prisma 打包后运行报错:Uncaught TypeError: Failed to resolve module specifier ".prisma/client/index-browser". Relative references must start with either "/", "./", or "../".
最近使用 `Nuxt3+prisma` 搭建开发全站应用时,打包后访问Web页面一直报错: ```c
渲染中...
最近使用 `Nuxt3+prisma` 搭建开发全站应用时,打包后访问Web页面一直报错:
```console
Uncaught TypeError: Failed to resolve module specifier ".prisma/client/index-browser". Relative references must start with either "/", "./", or "../".
```
看的人时一愣一愣的,通过搜索可以发现,该问题还是很常见的,在 `prisma` 官方仓库有很多关于该问题的反馈和讨论,总结一下讨论比较多的导致出现问题的原因及解决办法:
<!-- more -->
## 1. 引用了 `prisma` 提供的枚举类型
如:[issue-4444](https://github.com/sveltejs/kit/issues/4444) 中的回复,有兴趣可自行点击查看。
### 解决办法:
去掉所有引用了 `prisma` 枚举类型数据的代码!
> 老狗遇到的不是这个问题,且没有引用任何枚举类型,所以不确定是否真的如讨论所说,请自行验证。
## 2. `prisma` 构建问题(开发环境)
有用户评论指导说到:将 `.prisma` 下的一些文件移动到 `@prisma` 中可以解决该问题,并贴出脚本如下:
```json
// 放到 package.json 中,用于快速运行。
"prisma:inline": "cp ./node_modules/.prisma/client/*.js ./node_modules/@prisma/client",
"prisma:migrate": "prisma migrate deploy && npm run prisma:inline",
"prisma:migrate:dev": "prisma migrate dev && npm run prisma:inline",
"prisma:generate": "prisma generate && npm run prisma:inline"
```
> 老狗遇到的也不是这个问题,起初以为是这个问题,但经过修改测试后,发现并没有解决,因此老狗认为,这个用户提到的解决办法是在开发环境时出现的问题,而我是在打包后运行时出现的问题。
## 3. `prisma` 构建问题(生产环境)
详情可前往阅读上下文:https://github.com/prisma/prisma/issues/12504#issuecomment-2505171223
通过内容可知,配置一个别名可以解决该问题:
```ts
import { defineNuxtConfig } from 'nuxt'
export default defineNuxtConfig({
modules: [
'@prisma/nuxt',
],
...其他配置
// nuxt3架构,可以在nuxt.config.ts文件中使用如下配置解决
// additional config
vite: {
resolve: {
alias: {
'.prisma/client/index-browser': './node_modules/.prisma/client/index-browser.js',
},
},
},
})
```
## 总结
通过一翻搜集资料和解决,结合问题的描述,老狗对该问题有以下猜想:
1. `prisma` 打包后,引用 `index-browser.js` 文件时,使用的是相对 `.prisma` 为开头的路径;
2. 且默认认为 `.prisma` 文件夹应该在主进程的根目录;
然而这两个相对写死的配置,都是错误的!
1. 使用 `.prisma` 作为引用路径开头,与 `vite` 规范(也有可能是其他规范)不符,规范规定路径开头应该是 `./`、`/`、`../` 这类路径开头;
2. 在 `nuxt3` 中,实际打包后的 `.prisma` 文件夹是在 `node_modules` 内部!
### 解决的思路整理
1. `Nuxt3` 构建后,`.prisma` 的默认路径是 `.output/server/node_modules/.prisma`;
2. 而打包后我们的主进程是 `.output/server/index.mjs` ;
3. 相对于主进程,默认的路径 `.prisma/client/index-browser` 显然少了一层 `node_modules`;
4. 为了加上这一层,并且解决路径规范问题,得到了上面提到的配置:
```ts
vite: {
resolve: {
alias: {
'.prisma/client/index-browser': './node_modules/.prisma/client/index-browser.js',
},
},
},
```
END
评论
登录后查看和发表评论
前往登录