node.js - migration şema dosyalarını webpack derlemesine nasıl dahil edilir


Sorun

Uygulamayı Webpack ile tek bir paket halinde oluştururken, migrate-mongo kütüphanesi örneğin migrations/[bazı-numara]-[bazı-isim]-migration.js gibi göç şeması modülünü bulamıyor. Bu muhtemelen kütüphanenin kendisi tarafından göç modülünün dinamik olarak içe aktarılmasından ve Webpack’in require ile modülleri yükleme şeklini değiştirmesinden kaynaklanıyor.

Webpack'i, göç dosyalarını derlemesine kaydedecek şekilde nasıl yapılandırabilirim, böylece kütüphane require çağrısını yaptığında modülleri alabilir.

Kütüphane, modülü aşağıdaki mutlak yol stratejisi ile gerektirir:

// Roughly
path.join(pwd(), migrationsDir, fileName)

Hata alındı

Could not migrate up [file-name]-migration.js. Cannot find module [absolute-path]/migrations/[file-name]-migration.js

Dosya mevcut olmasına rağmen, emin olmak için birden fazla göreli konumu denedim.

Eyalet

Nest.js uygulamasını oluşturmak için Webpack kullanıyorum ve NX projesi içinde göçler için migrate-mongo kullanıyorum. Göç dosyaları migrations/ dizininde bulunuyor ve göç yükseltme uygulama başlatıldığında tetikleniyor. Uygulama geliştirme modunda başlatıldığında, göç normal şekilde çalışıyor.

göç.ts

// This function is executed on app bootstrap
export const migrate = async (): Promise<void> => {
  Logger.log('[Migration]: Started');
  config.set(createConfig());
  const {db, client} = await database.connect();
  const migrated = await up(db, client);
  migrated.forEach((fileName) => {
    Logger.log(`[Migration]: migrated ${fileName}`);
  });
  Logger.log('[Migration]: End');
};

webpack.config.js

module.exports = {
  mode: 'development',
  target: 'node',
  entry: './src/main.ts',
  module: {
    rules: [
      {
        test: /\.ts?$/,
        use: 'ts-loader',
        exclude: [/node_modules/, /other-app/],
      }
    ],
  },
  resolve: {
    extensions: ['.ts', '.js'],
    plugins: [
      new TsconfigPathsPlugin({
        configFile: path.resolve(__dirname, '../../tsconfig.json'),
      }),
    ],
  },
  output: {
    path: path.resolve(__dirname, '../../dist/apps/my-backend'),
    filename: 'src/main.js',
  },
  externals: [
    nodeExternals(),
  ],
  plugins: [/* ... */],
}

Denenen çözümler

  • Göçleri kopyalamak için CopyPlugin kullanmayı denedim, ancak anlaşıldığı gibi tüm modüller derlenmiş paket içinde yer alıyor.
  • Göçleri içeren dizini eklemek için externals güncellemeyi denedim
  • Modülleri kaydetmek için uygulamada dosya ve dizini require etmeyi veya import etmeyi denedi