Svelte执行setupTypeScript.js报MODULE_NOT_FOUND错误排查
问题现象
- VS Code编辑器内无任何TypeScript语法报错提示,但执行
npm run dev --启动开发服务时,所有TypeScript语法均被标记为错误,服务无法正常启动 - 项目此前可正常运行,疑似误触快捷键改动了项目文件;对比Git版本差异,仅发现
package.json中部分TypeScript相关依赖版本被意外升级
排查过程遇到的典型报错
1. 缺失TS初始化脚本报错
删除node_modules目录重装全部依赖后,执行node scripts/setupTypeScript.js触发模块找不到错误:
node:internal/modules/cjs/loader:936 throw err; ^ Error: Cannot find module 'C:\(...)\my-app\scripts\setupTypeScript.js' at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15) at Function.Module._load (node:internal/modules/cjs/loader:778:27) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) at node:internal/main/run_main_module:17:47 { code: 'MODULE_NOT_FOUND', requireStack: [] }
注:全局安装最新版TypeScript(执行npm install typescript@latest -g)完全无法解决该问题,无需浪费时间尝试
排查确认该报错直接原因是项目根目录下原本存在的./scripts/目录被意外删除。最初尝试通过以下命令从官方模板拷贝脚本重建目录:
mkdir tmp cd tmp npx degit sveltejs/template svelte-typescript-app cp -r svelte-typescript-app/scripts ../ cd ../ rm -r tmp
重建完成后执行脚本触发第二个报错。
2. 入口文件重命名失败报错
> node scripts/setupTypeScript.js node:internal/fs/utils:344 throw err; ^ at Object.renameSync (node:fs:980:3) at Object.<anonymous> (C:\(...)\my-app\scripts\setupTypeScript.js:44:4) at Module._compile (node:internal/modules/cjs/loader:1101:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10) at Module.load (node:internal/modules/cjs/loader:981:32) at Function.Module._load (node:internal/modules/cjs/loader:822:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) at node:internal/main/run_main_module:17:47 { errno: -4058, syscall: 'rename', code: 'ENOENT', path: 'C:\(...)\my-app\src\\main.js', dest: 'C:\(...)\my-app\src\\main.ts' }
报错原因是TS初始化脚本默认会将JS格式入口main.js重命名为TS格式的main.ts,但项目此前已经完成过TS转换,src目录下入口文件已经是main.ts,导致重命名的源文件不存在触发错误。临时将入口文件改回main.js后脚本可正常执行,但启动服务时触发第三个报错。
3. sveltePreprocess重复声明报错
执行npm run dev --时抛出错误:Error: Identifier 'sveltePreprocess' has already been declared
排查根因为rollup.config.js中sveltePreprocess被重复声明,删除冗余的重复配置项即可解决,清理时注意同步检查配置文件中其他重复配置行,避免后续触发同类问题。
根因说明与完整修复步骤
走完上述流程后TypeScript语法报错问题仍然存在,且手动重建的scripts/目录会再次自动消失,核心原因是意外升级TypeScript相关依赖后,Svelte模板的版本校验逻辑误将当前已完成TS初始化的项目判定为原生JS项目,自动清理了scripts目录;同时升级后的svelte-preprocess版本和现有构建配置不匹配,导致构建阶段完全无法识别TS语法,才会出现编辑器无报错、启动时全量报TS错的现象。
按以下步骤操作即可彻底修复:
- 回退
package.json到Git记录的可正常运行版本,删除node_modules目录和对应锁文件(package-lock.json/yarn.lock/pnpm-lock.yaml)后重新执行依赖安装,不要保留意外升级的高版本TS相关依赖。Svelte官方模板对依赖版本匹配度要求很高,跨大版本升级依赖极易出现兼容问题 - 从Git历史恢复被误删的
./scripts/整个目录,不要直接从最新版官方模板拷贝脚本,不同版本模板的脚本逻辑存在差异,会触发重命名失败、配置覆写等各类异常 - 检查构建配置文件(使用Rollup则打开
rollup.config.js,使用Vite则打开vite.config.js),全局搜索sveltePreprocess,删除重复声明、重复传入的配置项,仅保留一份有效配置;顺便扫描整个配置文件,清理其他重复的配置行 - 确认
src目录下入口文件为main.ts,无需为了执行初始化脚本刻意改回main.js。如果存在TS配置文件缺失,直接从Git历史拉取对应版本的tsconfig.json、svelte.config.js即可,不需要重复执行TS初始化脚本 - 删除
node_modules/.cache目录清理旧构建缓存,再执行npm run dev --启动服务即可恢复正常
内容的提问来源于stack exchange,提问作者vinalti

