如何配置Webpack移除生成代码中的exports变量使TypeORM迁移正常运行
问题原因
TypeORM 迁移执行器会直接读取迁移文件的 CommonJS 导出内容,识别导出的迁移类。当前Webpack配置默认采用自包含的IIFE模块化封装,将模块内的exports重定向到了Webpack内部的__webpack_exports__变量,导致TypeORM无法读取到正确的迁移类导出,因此执行typeorm migration:run无响应。
解决方案
方案1:调整Webpack输出配置(推荐)
针对迁移文件单独编写Webpack配置,做以下调整即可直接生成符合TypeORM要求的代码:
- 设置编译目标为Node环境,规避浏览器兼容相关的封装逻辑
- 输出标准CommonJS2格式的模块,关闭不必要的IIFE封装
- 排除node_modules依赖打包,避免冗余代码干扰
const nodeExternals = require('webpack-node-externals'); module.exports = { // entry配置为你的迁移TS文件路径 target: 'node', externals: [nodeExternals()], // 排除所有node_modules依赖不打包 output: { // 自定义你的迁移文件输出路径 library: { type: 'commonjs2' // 输出符合CommonJS2规范的导出格式 }, iife: false, // 关闭外层Webpack自执行函数封装 }, optimization: { runtimeChunk: false, // 关闭单独的runtime代码生成 minimize: false // 迁移文件无需压缩,方便排查问题 } // 保留你原有的ts-loader等TS编译相关loader配置 }
调整后重新编译,生成的代码不会出现重写exports的冗余行,TypeORM可以正常识别导出的迁移类。
方案2:后置脚本自动处理
如果调整Webpack配置后仍有兼容问题,可以编写简单的后置处理脚本,自动移除生成代码中的冗余行:
- 项目根目录新建
scripts/fix-migration.js,内容如下:
const fs = require('fs'); const path = require('path'); // 替换为你的迁移文件实际输出目录 const MIGRATION_DIR = path.resolve(__dirname, '../dist/migrations'); fs.readdirSync(MIGRATION_DIR).forEach(file => { if (file.endsWith('.js')) { const content = fs.readFileSync(path.join(MIGRATION_DIR, file), 'utf8'); // 匹配并移除冗余的exports重写行 const fixedContent = content.replace(/^var exports = __webpack_exports__;$/m, ''); fs.writeFileSync(path.join(MIGRATION_DIR, file), fixedContent, 'utf8'); } });
- 在
package.json的编译命令后追加脚本执行,实现自动处理:
{ "scripts": { "build:migrations": "webpack --config webpack.migration.config.js && node scripts/fix-migration.js" } }
内容的提问来源于stack exchange,提问作者Andries
相关产品推荐
相关产品推荐

