#четкая концепция
- Каждый входной файл записи называется чанк (entry chunk)
- Асинхронная загрузка каждого входного файла также называется чанк (дочерний чанк).
- Извлеченный с помощью commonChunkPlugin также называется чанком (общим чанком).
#сцены для использования
- Когда файл с несколькими записями необходимо извлечь общую часть.
- Файл с одной записью, но поскольку маршрутизация асинхронно загружается в несколько дочерних фрагментов, он извлекает части, общие для каждого дочернего элемента.
- Сторонние зависимости извлекаются из всех зависимостей в node_modules в отдельные части.
- Смешанное использование, необходимо извлекать как сторонние зависимости, так и публичные части.
#реализация часть Структура проекта
// a.js
import { common1 } from './common'
import $ from 'jquery';
console.log(common1, 'a')
//b.js
import { common1 } from './common'
import $ from 'jquery';
console.log(common1, 'b')
//common.js
export const common1 = 'common1'
export const common2 = 'common2'
Результаты упаковки без использования плагинов следующие:
случай 1 извлекает запись с несколькими входами в common.js
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: "common",
filename: "common.js"
})
]
Результат выполнения следующий:
case 2 Извлечь common.js из дочернего фрагмента
// 单入口文件 main.js
const component1 = function(resolve) {
return require(['./a'], resolve)
}
const component2 = function(resolve) {
return require(['./b'], resolve)
}
console.log(component1, component2, $, 'a')
Результат выполнения без commonChunk следующий:
//使用commonChunk 配置如下
plugins: [
new webpack.optimize.CommonsChunkPlugin({
children: true,
async: 'children-async',
name: ['main']
})
]
// Результат выполнения следующий
case 3 node_modules все сторонние зависимости извлекаются как vendor.js
//webpack 配置
...
entry : {
main: './src/main.js',
vendor: ['jquery']
}
...
...
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor', // 这里是把入口文件所有公共组件都合并到 vendor模块当中
filename: '[name].js'
})
...
Результат выполнения следующий:
Смешанное использование случая 4, случая 2 и случая 3
....
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
filename: '[name].js'
}),
new webpack.optimize.CommonsChunkPlugin({
children: true,
async: 'children-async',
name: ['main']
})
]
....
Результат выполнения следующий:
#Примечания
- имя: Если и имя записи, и CommonsChunkPlugin имеют поставщика, извлеченная общедоступная часть объединяется с файлом записи поставщика. Если в записи нет поставщика, файл записи извлекается и помещается в поставщика.
- minChunks: это может быть число, функция или бесконечность. Число: сколько общих фрагментов ссылается на модуль, прежде чем он будет извлечен как общий фрагмент. Функция: принимает два параметра (модуль, количество) и возвращает логическое значение.Вы можете выполнить указанную вами логику в функции, чтобы решить, следует ли извлечь модуль и стать частью общего доступа.Бесконечность: вступает в силу только в том случае, если входные фрагменты> = 3, используемые для разделения пользовательских общедоступных модулей в сторонних библиотеках.
- Common.js после commonChunk может продолжать извлекаться до тех пор, пока может быть достигнута конфигурация name: в новом CommonsChunkPlugin.
- Вышеупомянутый метод используется только с webpack 4 и ниже.