You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NX工作区:如何将Migration TypeScript文件编译并复制到构建目录

解决NX+Webpack构建NestJS时迁移文件编译问题

针对你遇到的迁移文件无法被编译到dist目录、NX构建会清理预生成文件的问题,给你几个实用解决方案:

方案1:修改Webpack配置,主动编译迁移文件

Webpack默认只处理被显式导入的模块,所以我们需要手动把迁移文件加入构建流程,同时保证输出路径和src结构一致:

  1. 先安装依赖工具:
npm install glob ts-loader --save-dev
  1. 修改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,让构建流程依赖它:

  1. 修改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"
      }
    }
  }
}
  1. 创建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迁移:

  1. 安装ts-node:
npm install ts-node --save-dev
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 07:45:19