TS应用动态导入.js文件提示MODULE_NOT_FOUND模块未找到
问题复现
- 小型TypeScript应用内存在
en.js文件,内容如下:
export default { name: "test" }
- 执行动态导入语句
await import("./en.js")时抛出异常,错误码为code: 'MODULE_NOT_FOUND' - 将文件替换为
en.json格式,内容如下:
{ "name": "test" }
- 执行动态导入语句
await import("./en.json")可正常运行,无报错。
故障原因
- TypeScript默认编译逻辑只会处理被静态引用的TS/JS文件,未被静态导入、仅靠动态路径引入的
.js文件不会被自动拷贝到编译输出目录,运行时程序在输出路径下找不到对应文件,就会触发模块不存在的错误。 - JSON是TypeScript和Node.js原生支持的导入资源类型,编译阶段会被正确识别、纳入输出资源列表,所以动态导入JSON文件不会出现找不到文件的问题。
- 如果项目
package.json中未配置"type": "module",运行环境默认使用CommonJS规范解析JS文件,就算en.js被放到了正确的输出路径,ESM标准的export default语法也无法被CommonJS环境识别,会额外抛出模块语法解析错误。
修复方案
- 若要保留JS格式的配置文件:
- 调整编译配置,在
tsconfig.json或所用构建工具(tsup、vite、webpack等)的配置中添加静态资源拷贝规则,保证动态导入的JS文件会被同步输出到运行时对应的路径下。 - 匹配运行环境的模块规范:如果要使用ESM的
export default语法,就在package.json中添加"type": "module";如果沿用默认CommonJS规范,就把en.js的导出写法改为CommonJS格式:module.exports = { name: "test" }
- 调整编译配置,在
- 若文件仅存放固定静态配置(比如多语言词条、常量映射),直接使用JSON格式即可,不需要额外做编译配置和模块规范适配,是兼容性最稳定的方案。
内容的提问来源于stack exchange,提问作者Ilijanovic
相关产品推荐
相关产品推荐

