NX工作区:如何将Migration TypeScript文件编译并复制到构建目录
解决NX+Webpack构建NestJS时迁移文件编译问题
针对你遇到的迁移文件无法被编译到dist目录、NX构建会清理预生成文件的问题,给你几个实用解决方案:
方案1:修改Webpack配置,主动编译迁移文件
Webpack默认只处理被显式导入的模块,所以我们需要手动把迁移文件加入构建流程,同时保证输出路径和src结构一致:
- 先安装依赖工具:
npm install glob ts-loader --save-dev
- 修改
apps/backend/webpack.config.js:
const path = require('path'); const glob = require('glob'); const { NxWebpackPlugin } = require('@nx/webpack'); // 匹配所有迁移TS文件,生成对应的编译入口 const migrationEntries = glob.sync('./src/database/migrations/**/*.ts').reduce((acc, filePath) => { // 生成输出路径映射:src/database/migrations/X.ts → database/migrations/X.js const outputKey = filePath.replace('./src/', '').replace('.ts', ''); acc[outputKey] = filePath; return acc; }, {}); module.exports = { entry: { main: './src/main.ts', // 保留原有主入口 ...migrationEntries, // 追加迁移文件入口 }, output: { path: path.join(__dirname, 'dist'), filename: '[name].js', libraryTarget: 'commonjs', // 适配Umzug的CommonJS模块加载 }, module: { rules: [ { test: /\.ts$/, use: 'ts-loader', exclude: /node_modules/, }, ], }, resolve: { extensions: ['.ts', '.js'], }, plugins: [ new NxWebpackPlugin({ target: 'node', compiler: 'tsc', }), ], target: 'node', };
这样Webpack会自动把所有迁移TS编译成JS,输出到dist/database/migrations/目录,和src结构完全匹配,Umzug可以正常动态加载。
方案2:用NX自定义Target单独编译迁移
如果不想改动主Webpack配置,可以给backend项目加一个专门处理迁移的编译Target,让构建流程依赖它:
- 修改
apps/backend/project.json的targets节点:
{ "targets": { "build": { "dependsOn": ["compile-migrations"], // 让build先执行迁移编译 // 保留原有build的其他配置 }, "compile-migrations": { "executor": "nx:run-commands", "options": { "command": "tsc --project ./apps/backend/tsconfig.migrations.json" } } } }
- 创建
apps/backend/tsconfig.migrations.json:
{ "extends": "./tsconfig.json", "include": ["src/database/migrations/**/*.ts"], "compilerOptions": { "outDir": "./dist/apps/backend/database/migrations", "module": "CommonJS", "target": "ES2020", "strict": true, "esModuleInterop": true } }
执行nx build backend时,会先编译迁移文件到指定路径,且NX不会清理这个属于build流程的产物。
方案3:开发环境快速适配(不推荐生产用)
如果只是开发阶段想快速验证,可以用CopyPlugin复制TS文件,再通过ts-node让Node直接加载TS迁移:
- 安装ts-node:
npm install ts-node --save-dev
- 修改Umzug配置:
import { Umzug } from 'umzug'; import { Sequelize } from 'sequelize'; import * as tsNode from 'ts-node'; // 注册ts-node,让Node能解析TS文件 tsNode.register({ project: './apps/backend/tsconfig.json', }); const umzug = new Umzug({ migrations: { glob: 'src/database/migrations/*.ts', }, context: sequelize.getQueryInterface(), storage: 'sequelize', storageOptions: { sequelize }, });
这个方案跳过编译步骤,仅适合开发调试,生产环境还是建议编译成JS。
注意事项
- 生产环境中,Umzug的路径要指向dist下的JS文件,比如
dist/database/migrations/*.js - 所有生成的产物必须通过NX的build流程生成,避免被NX的清理机制删除
内容的提问来源于stack exchange,提问作者Scorpion
相关产品推荐
相关产品推荐

