npm run build编译转译App.js失败 疑似ES6与CommonJS不匹配
报错根因
这个冲突本质是模块规范不匹配导致的:你当前使用的前端构建工具(Vite/Rollup/5.x以上版本Webpack)默认要求输入源码遵循ES Module规范做静态分析,但你的tsconfig配置将TS转译输出的模块格式设为了CommonJS。TS转译CommonJS模块时会自动注入__esModule标识属性,构建工具做根节点导出聚合时,会检测到同名的__esModule导出标记,直接触发命名冲突报错。
修复方案
按优先级依次操作即可:
- 修改tsconfig.json的模块输出配置,把
compilerOptions.module的值从commonjs改为ESNext,让TS输出符合构建工具预期的ES Module格式代码。如果你使用React17及以上版本,可以顺便把jsx配置从react改为react-jsx,省去每个组件文件手动导入React的冗余代码。修改后的核心配置段如下:
"compilerOptions": { "jsx": "react-jsx", "target": "es6", "lib": ["dom", "esnext"], "module": "ESNext", "moduleResolution": "node", "allowSyntheticDefaultImports": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true }
- 检查项目入口或路由聚合文件,是否存在
export * from './src/App'这类全量转发App模块导出的写法。如果有,替换为明确的具名导出或默认导出转发,不要做全量通配符导出,避免把转译过程注入的内置标记属性也一并向外转发。 - 清理构建缓存后重新执行构建:删除项目下的
node_modules/.cache目录,再运行npm run build即可。
特殊兼容场景处理
如果项目有特殊需求必须保留TS输出CommonJS格式(比如需要兼容存量Node侧脚本逻辑),不要提前用tsc把TS文件编译成CommonJS规范的中间JS文件再交给构建工具处理:
- 用Vite的场景:移除package.json构建脚本中tsc提前编译输出JS的步骤,直接执行
vite build,Vite内部会通过esbuild完成TS转译,默认输出ES Module格式,不会触发冲突。 - 用Webpack的场景:调整构建流程,让ts-loader在Webpack编译链路中直接处理TS文件,不要提前跑tsc生成CommonJS格式的中间JS文件供Webpack消费。
内容的提问来源于stack exchange,提问作者Aaron Ang
相关产品推荐
相关产品推荐

