webpack 捆绑后如何解析迁移文件夹的路径

How to resolve path to migrations folder after webpack bundling

我需要将迁移文件夹的路径传递给 Umzug 配置,但它正在被 webpack 压缩,可以这样做吗?

我试图分别捆绑每个迁移文件,但 Umzug 说它找不到方法 up()

    let umzug = new Umzug({
      storage: 'sequelize',

      storageOptions: {
        sequelize: sequelize
      },

      migrations: {
        params: [
          sequelize.getQueryInterface(),
          Sequelize
        ],
        path: './../db/migrations/*')
      }
    })

当我尝试 运行 它们只是从 webpack 手动编译时,它说没有方法 up()

自从你 7 个月前问过这个问题以来,我参加聚会可能有点晚了,但我刚刚遇到了同样的问题,所以我想 post 我的解决方案。

我通过在 Webpack 中为每次迁移创建一个入口点来解决这个问题。我使用 glob 动态获取文件然后将它们附加到入口点参数,使用文件名作为入口点名称。

然后在 output.filename 函数中,我检查之前列表中的任何入口点。然后在 migrations 目录中创建这些入口点文件,以将它们干净地放置在我的其余入口点文件之外,这样您的迁移器就不会尝试遍历它们。

webpack.config.js

const migrationFiles = glob.sync('./src/migrations/*');
const migrationEntries = migrationFiles.reduce((acc, migrationFile) => {
    const entryName = migrationFile.substring(
        migrationFile.lastIndexOf('/') + 1,
        migrationFile.lastIndexOf('.')
    );
    acc[entryName] = migrationFile;
    return acc;
}, {});

modules.exports {
    entry: {
        index: './src/index.ts',
        ...migrationEntries,
    },

    ...

    output: {
        libraryTarget: 'commonjs',
        filename: chunkData => {
            if (Object.keys(migrationEntries).includes(chunkData.chunk.id)) {
                return `migrations/${chunkData.chunk.id}.js`;
            }

            return '[name].js';
        },
    },
}

现在,您的所有迁移都可以作为 /dist/migrations 目录中的 .js 文件直接访问。

现在加载Umzug,只需指定迁移目录路径即可

let umzug = new Umzug({
    storage: 'sequelize',

    storageOptions: {
        sequelize: sequelize
    },

    migrations: {
        params: [
            sequelize.getQueryInterface(),
            Sequelize
        ],
        path: path.join(__dirname, 'migrations')
    }
})

我确信有更好的解决方案,但这个解决方案花费的时间比我愿意承认的要长,而且它解决了我所有的问题,所以我的搜索就此结束。希望这对某人有所帮助。