В webpack, как я могу использовать разные выходные каталоги для нескольких точек входа?

У меня есть следующая конфигурация веб-пакета с несколькими точками ввода...

module.exports = {
 entry: {
  somePage: "./scripts/someDir/somePage.js",
  anotherPage: "./scripts/someDir/someSubDir/anotherPage.js"
 },
 output: {
   path: path.resolve(__dirname, 'out'),
   filename: '[name].js'
 },
 ...

Можно ли установить другой выходной путь для каждой записи?

Вместо получения вывода...

/out/somePage.js /out/anotherPage.js

Я хочу...

/out/someDir/somePage.js /out/someDir/someSubDir/anotherPage.js

Идеальное решение для меня было бы для output.path принять функцию. Например...

...
output: {
   path: function (name, hash) {
       return path.resolve(__dirname, myMapOfFilenamesToDirs[name]);
   },
   filename: '[name].js'
},

Кто-нибудь знает, возможно ли это, или есть ли существующий плагин, который может это сделать?

EDIT Я не хочу использовать несколько записей конфигурации (мультикомпилятор), потому что я больше не буду создавать общий файл среди точек входа с CommonsChunkPlugin

Ответ 1

Немного взломанный, но это должно сделать трюк.

module.exports = {
 entry: {
  "somePage": "./scripts/someDir/somePage.js",
  "someSubDir/anotherPage": "./scripts/someDir/someSubDir/anotherPage.js"
 },
 output: {
   path: path.resolve(__dirname, 'out/someDir'),
   filename: '[name].js'
 },
 // Etc.
}

Вы не можете установить путь к функции, веб-пакет не вызовет его для вас.

Ответ 2

Вы можете вернуть массив конфигураций для выполнения webpack. Я думаю, что это даст вам достаточно контроля над выходным путем для достижения того, что вам нужно.

Ответ 3

У меня была та же самая проблема сегодня, добавляя к ответу от @quentin-roy, fooobar.com/info/454878/...

Вы также можете создать сопоставления выходного пути для входных файлов, используя glob и следующий обратный вызов. Настройте шаблон glob в соответствии с вашими потребностями. Следующий шаблон и обратный вызов, если он применяется к структуре каталогов

- src
   - file01.ts
   lib
     - file02.ts

приведет к

- dist
   - file01.js
   lib
     - file02.js
config = {
    entry: () => {
        const entries = {};
        glob.sync("./src/**/*.ts").forEach(filePath => {
            entries[
                path
                    .relative("./src", filePath)
                    .replace(path.extname(filePath), "")
            ] = filePath;
        });
        console.debug(
            'Entries created:\n${JSON.stringify(entries, undefined, 4)}',
        );
        return entries;
    },
    output: {
        filename: "[name].js",
        path: path.resolve(__dirname, "dist"),
    },
}