Миграция Webpack 4 CommonsChunkPlugin

Мне нужна помощь в переносе следующего кода из webpack 3 в 4.

new webpack.optimize.CommonsChunkPlugin({
    minChunks: module => module.context && module.context.indexOf("node_modules") !== -1,
    name: "vendor",
    chunks: ["main"]
})

У меня есть два входных файла, и я хочу, чтобы только зависимости первого из них были включены в фрагмент поставщика. Зависимости второй записи должны оставаться в отдельном пакете.


person Erik Bender    schedule 27.02.2018    source источник


Ответы (4)


У меня есть два входных файла, и я хочу, чтобы только зависимости первого из них были включены в фрагмент поставщика. Зависимости второй записи должны оставаться в отдельном пакете.

Предполагая, что ваши точки входа main и secondary:

entry: {
    main: 'path-to/main.js',
    secondary: 'path-to/secondary.js'
}

Используя webpack-4, вы можете извлечь только vendors модули из main чанка, но оставьте другие сторонние модули, указанные в secondary внутри этого чанка, используя функцию test cacheGroups, которую вы хотите создать.

optimization: {
    splitChunks: {
        cacheGroups: {
            vendors: {
                name: 'vendors',
                chunks: 'all',
                reuseExistingChunk: true,
                priority: 1,
                enforce: true,
                test(module, chunks) {
                    const name = module.nameForCondition && module.nameForCondition();
                    return chunks.some(chunk => {
                        return chunk.name === 'main' && /[\\/]node_modules[\\/]/.test(name);
                    });
                }
            },
            secondary: {
                name: 'secondary',
                chunks: 'all',
                priority: 2,
                enforce: true,
                test(module, chunks) {
                    return chunks.some(chunk => chunk.name === 'secondary');
                }
            }
        }
    }
}
person Carloluis    schedule 25.03.2018
comment
Я сделал аналогичное решение, и в результате код никогда не запускается - среда выполнения не добавляется. - person kvetis; 17.05.2018
comment
Чтобы добавить отдельный скрипт для среды выполнения веб-пакета, вам необходимо установить свойство среды выполнения в объекте optimization: runtimeChunk: 'single'. Можешь поделиться своим конфигом. а подробнее? Ознакомьтесь также с этой демонстрацией Webpack-4. Надеюсь, поможет! - person Carloluis; 17.05.2018
comment
У меня была конфигурация, как в вашем ответе - несколько точек входа и chunkDef с тем же именем, что и у вторичной точки входа. Независимо от того, что я настроил в чанке времени выполнения, я никогда не мог запустить вторичный чанк, если я не запускал чанк поставщика, который не должен был зависеть от вторичного. Я потратил на это несколько дней, и я сдаюсь. В моем случае мультиконфигурация была бы лучшим решением. - person kvetis; 17.05.2018
comment
@kvetis Я решаю эту проблему, изменяя фрагменты на «асинхронные» вместо «все», и я делаю «основную» запись «асинхронной», используя оператор «import (xx)», предоставленный веб-пакетом. Просто оставьте «вторичную» запись нетронутой, чтобы она не рассматривалась как «асинхронный» фрагмент. - person 小广东; 21.05.2019

Мне потребовалось некоторое время, чтобы понять это, но ключевым моментом для меня стало то, что аргумент chunks в веб-пакете 4 теперь принимает функцию, которая позволяет вам включать только определенную запись. Я предполагаю, что это недавнее изменение, потому что на момент публикации его не было в официальной документации.

splitChunks: {
  cacheGroups: {
    vendor: {
      name: 'vendor',
      chunks: chunk => chunk.name == 'main',
      reuseExistingChunk: true,
      priority: 1,
      test: module =>
        /[\\/]node_modules[\\/]/.test(module.context),
      minChunks: 1,
      minSize: 0,
    },
  },
},
person Nick B.    schedule 18.05.2018

Обратите внимание, что я исправил проблему, изменив это в моем webpack.common.js:

  plugins: [
    new webpack.optimize.CommonsChunkPlugin({
      name: ['vendor']
    })
    ]

К этому:

  optimization: {
      runtimeChunk: "single", // enable "runtime" chunk
      splitChunks: {
          cacheGroups: {
              vendor: {
                  test: /[\\/]node_modules[\\/]/,
                  name: "vendor",
                  chunks: "all"
              }
          }
      }
  },
person user8128167    schedule 15.05.2020

person    schedule
comment
Так что, в основном, потому что webpack 4 работает как по волшебству, мне не нужно ничего делать, чтобы разделить мои куски? - person Joe Eifert; 03.04.2018
comment
Если у вас довольно маленькое приложение то смысла нет, так как оно должно выплевывать оптимальные комплекты. Я бы посоветовал вам начать новый проект webpack 4, но начать с малого. Добавьте зависимости и скомпилируйте пакет. - person Legends; 04.04.2018