使用vite-node运行服务端目录下的数据库迁移脚本时遇到导入错误的求助
使用vite-node运行服务端目录下的数据库迁移脚本时遇到导入错误的求助
看起来你遇到的问题是Vite的环境上下文限制导致的——vite-node默认会以客户端环境来执行脚本,而你的$lib/server/migrate.ts属于服务端专属文件(比如在SvelteKit这类框架中,server目录下的文件会被Vite标记为仅服务端可导入),所以触发了框架的保护机制,禁止客户端代码导入它。
下面给你几个可行的解决方案:
方案一:用vite-node的SSR模式运行脚本
vite-node自带了--ssr参数,能强制脚本在服务端(SSR)上下文中执行,这样就能绕过客户端的导入限制。直接修改你的运行命令即可:npx vite-node --ssr src/lib/server/migrate.ts这是最直接的解决办法,适配大多数基于Vite的服务端框架(比如SvelteKit、Nuxt)。
方案二:自定义Vite配置文件指定服务端环境
如果方案一没有解决问题,你可以创建一个专门用于迁移的Vite配置,明确声明以服务端模式运行:- 在项目根目录新建
vite.migrate.config.ts文件:
import { defineConfig } from 'vite'; // 如果你用的是SvelteKit,需要导入对应的Vite插件 import { sveltekit } from '@sveltejs/kit/vite'; export default defineConfig({ plugins: [sveltekit()], // 非SvelteKit项目可以移除这一行 ssr: { enabled: true, // 启用服务端渲染模式 noExternal: true // 确保所有依赖都能被服务端正确处理 }, resolve: { // 确保$lib别名在服务端环境下能正确解析 alias: { '$lib': './src/lib' } } });- 运行脚本时指定这个配置文件:
npx vite-node --config vite.migrate.config.ts src/lib/server/migrate.ts- 在项目根目录新建
方案三:临时替换别名为相对路径(权宜之计)
如果你只是临时需要运行迁移,可以暂时把脚本里的$lib别名换成相对路径,比如把import { foo } from '$lib/utils'改成import { foo } from '../utils'。不过这只是应急方案,不推荐长期使用,因为会破坏项目的别名统一配置。
额外注意事项
- 如果你使用的是SvelteKit,要确认
src/lib/server目录确实是服务端专属路径,没有被误配置为客户端可访问; - 运行脚本时可以指定环境变量,避免环境不匹配的问题:
NODE_ENV=development npx vite-node --ssr src/lib/server/migrate.ts
备注:内容来源于stack exchange,提问作者Elijah M
相关产品推荐
相关产品推荐

