Node+TS+TypeORM项目:Babel构建生产包运行报import语句模块外错误
核心问题修复
1. 修正Babel构建配置,消除import语法残留
原Babel配置未显式指定模块转换规则,容易在构建后残留TypeScript的import语法,导致Node运行时报错。修改babel.config.js如下:
module.exports = { presets: [ [ '@babel/preset-env', { targets: { node: 'current' }, // 强制将所有ESM语法转换为Node兼容的CommonJS格式 modules: 'commonjs' } ], '@babel/preset-typescript', ], plugins: [ 'babel-plugin-transform-typescript-metadata', ['@babel/plugin-proposal-decorators', { legacy: true }], ['@babel/plugin-proposal-class-properties', { loose: true }], ], };
2. 动态适配TypeORM环境路径
原ormconfig.js写死文件路径导致开发/生产环境不能共存,直接通过环境变量判断当前运行环境,动态匹配对应资源路径,无需手动修改。修改ormconfig.js如下:
const isDevelopment = process.env.NODE_ENV === 'development'; // 开发环境加载环境变量配置 if (isDevelopment) { require('dotenv').config(); } module.exports = { name: 'default', type: 'postgres', host: process.env.DBHOST, port: process.env.DBPORT, username: process.env.DBUSER, password: process.env.DBPASSWORD, database: process.env.DBNAME, synchronize: false, logging: isDevelopment, // 按环境匹配实体文件路径 entities: isDevelopment ? ['src/modules/**/infra/typeorm/models/*.ts'] : ['dist/modules/**/infra/typeorm/models/*.js'], // 按环境匹配迁移文件路径 migrations: isDevelopment ? ['src/shared/typeorm/migrations/*.ts'] : ['dist/shared/typeorm/migrations/*.js'], cli: { // 按环境匹配迁移文件存放目录 migrationsDir: isDevelopment ? 'src/shared/typeorm/migrations' : 'dist/shared/typeorm/migrations', }, };
3. 补全脚本环境变量配置
原package.json的脚本未显式设置NODE_ENV,会导致ormconfig的环境判断失效。修改脚本配置如下:
"scripts": { "start": "NODE_ENV=production node dist/server.js", "dev": "NODE_ENV=development ts-node-dev --transpile-only --no-notify --ignore-watch node_modules .", "typeorm": "NODE_ENV=development ts-node-dev -r tsconfig-paths/register ./node_modules/typeorm/cli.js", "build": "NODE_ENV=production babel src --extensions \".ts\" --out-dir dist --copy-files" }
注意:如果团队存在Windows系统的协作成员,上述直接写
NODE_ENV=xxx的写法在Windows CMD环境下无法识别,可安装cross-env作为开发依赖,将脚本中的环境变量配置替换为cross-env NODE_ENV=xxx格式实现跨系统兼容。
验证流程
- 开发环境验证:执行
npm run dev,确认服务能正常启动,TypeORM可以正确加载src目录下的.ts实体、迁移文件 - 生产构建验证:执行
npm run build,检查dist目录下输出的js文件,确认无残留import语法,全部为Node兼容的require格式 - 生产运行验证:执行
npm start,确认服务正常启动,TypeORM可以正确加载dist目录下的.js实体、迁移文件,不再抛出模块语法错误
避坑提示:不要在
package.json中添加"type": "module"配置,当前项目基于CommonJS体系构建,添加该配置会导致Node将dist下的js文件识别为ESM模块,重复触发Cannot use import statement outside a module报错。
内容的提问来源于stack exchange,提问作者Bruno Mello
相关产品推荐
相关产品推荐

