TypeScript+ESM项目导入CJS文件遇Unexpected token export错误及解决
问题解决方法及原因分析
快速解决
- 修改
tsconfig.json中compilerOptions的module配置项为Node16:
{ "compilerOptions": { // ...其他配置 "module": "Node16" // ...其他配置 } }
问题原因
你的TypeScript+ESM项目引入CJS模块时,当前配置module: "es2020"会导致ts-node在处理.cjs文件时,错误注入export {}语句(该语句并非手动添加)。Node.js的CJS模块加载器无法识别ESM的export语法,因此抛出语法错误。
切换到Node16模块模式后,TypeScript会严格遵循Node.js的ESM与CJS交互规则,正确处理CJS模块的导入逻辑,避免对CJS文件进行不必要的ESM转换操作。
提问场景还原
我有一个结构简单的TypeScript+ESM项目,依赖一个CJS模块,代码如下:
index.ts
import myFunc from "./myfile.cjs" (...)
已在tsconfig.json的compilerOptions中设置allowSyntheticDefaultImports和esModuleInterop,但使用ts-node执行项目(命令:node --loader ts-node/esm --experimental-specifier-resolution=node src/index.ts)时,出现语法错误,提示CJS文件myfile.cjs存在意外的export token(export {};)。
完整错误日志:
export {}; ^^^^^^ SyntaxError: Unexpected token 'export' at Object.compileFunction (node:vm:352:18) at wrapSafe (node:internal/modules/cjs/loader:1027:15) at Module._compile (node:internal/modules/cjs/loader:1063:27) at Module.m._compile (/Users/cjg/Git/ast/node_modules/ts-node/src/index.ts:1618:23) at Module._extensions..js (node:internal/modules/cjs/loader:1153:10) at Object.require.extensions.<computed> [as .js] (/Users/cjg/Git/ast/node_modules/ts-node/src/index.ts:1621:12) at Module.load (node:internal/modules/cjs/loader:975:32) at Function.Module._load (node:internal/modules/cjs/loader:822:12) at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:170:29) at ModuleJob.run (node:internal/modules/esm/module_job:198:25)
tsconfig.json配置:
{ "compilerOptions": { "moduleResolution": "node", "baseUrl": "./src", "module": "es2020", "outDir": "./dist", "allowJs": true, "target": "es2020", "allowSyntheticDefaultImports": true, "esModuleInterop": true, }, "include": [ "./src/**/*" ] }
环境版本:
- ts-node版本:10.9.1
- node版本:17.9.0
- tsc版本:4.7.4
内容的提问来源于stack exchange,提问作者Carlos Gonçalves
相关产品推荐
相关产品推荐

