Оригинальный адрес:webpack 4: Code Splitting, chunk graph and the splitChunks optimization
Оригинальный автор:Tobias Koppers
Переводчик:arzh
Рекомендуемая причина: отwebpack3
обновитесь доwebpack4
Внесены важные изменения
webpack4
правильноchunk
График имеет несколько значительных улучшений, иchunk
Split добавляет новую оптимизацию (это дляCommonsChunkPlugin
улучшение)
Давайте взглянем на некоторые недостатки унаследованной диаграммы.
На старой схемеchunks
через детско-родительские отношения иchunks
Содержит модули для подключения другихchunks
когдаchunk
Если есть несколько родительских узлов, мы можем думать, что когда этоchunk
При загрузке уже загружен как минимум один родительский узел.Эту информацию можно использовать для оптимизации, например, когдаchunk
, когда все родители доступны, к нему можно получить доступ изchunk
, потому что он должен быть успешно загружен.
Опорная точка на входе или асинхронной точке разделенияchunk
список, этиchunks
будет загружаться параллельно.
Этот тип диаграммы делает разделениеchunks
становится очень трудным, например, использованиеCommonsChunkPlugin
Будет такая проблема при удалении одного или несколькихchunks
модули и поместите их в новыйchunk
, этот новыйchunk
Нужно переподключиться к схеме, но как? Как родитель старого куска или как ребенок?CommonsChunkPlugin
Добавить его в качестве родителя, но это технически неправильно, а также негативно влияет на другие оптимизации (информация о родителях неточна).
новыйchunk
На диаграмме вводится новый объект:ChunkGroup
,ОдинChunkGroup
содержит несколькоchunk
Ссылка на одиночную точку входа или асинхронную точку разделенияChunkGroup
, а это значит, что всеChunkGroup
включеныchunk
Все загружаются параллельно. Одинchunk
можно ссылаться на несколькоChunkGroup
in (но не загружается несколько раз)
Теперь больше не используйте отношения родитель-потомок для связыванияchunk
, но черезChunkGroup
ассоциировать
Сейчасchunks
Сегментацию можно понять, недавно добавленныйchunks
будут добавлены ко всем, содержащим оригинальныеchunk
изChunkGroups
, это не оказывает негативного влияния на родительскую иерархию.
Теперь, когда это исправлено, мы можем начать использовать его большеchunk
Разделенные, мы можем разделить по желаниюchunk
не волнуйсяchunk
изображение будет уничтожено
CommonsChunkPlugin
Есть много вопросов:
- загрузит код, который нам не нужен
- в асинхронном режиме
chunks
неэффективен - будет сложнее использовать
- Трудно понять на практике
Так родились новые плагины:SplitChunksPlugin
это может пройтиheuristics
Автоматически определяйте модули, которые должны быть разбиты на части, используя количество повторов модулей и категории модулей (например,node_modules
), разделятьchunks
Вот метафора для обоих.CommonsChunkPlugin
Например: «Создайтеchunk
и будет соответствоватьminChunks
чтобы переместить все модули в новый блок",SplitChunksPlugin
Типа: "Этоheuristics
, убедитесь, что вы их удовлетворяете» (вот эвристики, убедитесь, что вы их выполнили) (разница между императивным и декларативным)
SplitChunksPlugin
Есть также несколько замечательных свойств:
- Он никогда не загружает нежелательные модули (пока вы не применяете по имени
chunk
сливаться) - в асинхронном режиме
chunks
также эффективен - Асинхронный по умолчанию
chunks
сегментация шаблона - проще в использовании
- Это не зависит от
chunk
картина - В основном автоматизированная конфигурация
Ниже приведеныSplitChunksPlugin
Несколько примеров для вас. Эти примеры показывают только поведение по умолчанию, дополнительные параметры конфигурации доступны для большей персонализации.
Примечание: вы можете пройтиoptimization.splitChunks
настроить. Эти примеры иллюстрируют некоторыеchunk
контент, по умолчанию он работает только для асинхронногоchunk
, но используяoptimization.splitChunks.chunks:"all"
настроить для всех типов файлов (синхронизация, асинхронностьchunk
)
ПРИМЕЧАНИЕ. Мы предполагаем, что каждая внешняя библиотека, используемая здесь, больше, чем30kb
, потому что оптимизация кода вступает в силу только за пределами этого размера.
Vendors
chunk-a: react
, react-dom
, some components
chunk-b: react
, react-dom
, some other components
chunk-c: angular
, some components
chunk-d: angular
, some other components
webpack автоматически создаст дваvendors chunks
, результат следующий:
vendors~chunk-a~chunk-b: react
, react-dom
vendors~chunk-c~chunk-d: angular
chunk-a to chunk-d: Only the components
Поставщики пересекаются
chunk-a: react
, react-dom
, some components
chunk-b: react
, react-dom
, lodash
, some other components
chunk-c: react
, react-dom
, lodash
, some components
webpack также создает дваvendors chunks
, результат следующий:
vendors~chunk-a~chunk-b~chunk-c: react
, react-dom
vendors~chunk-b~chunk-c:lodash
chunk-a to chunk-c: Only the components
общий модуль
chunk-a: vue
, some components
, some shared components
chunk-b: vue
, some other components
, some shared components
chunk-c: vue
, some more components
, some shared components
Предположим, что размер общего компонента больше, чем30kb
,webpack
создастvendors chunk
с однимcommons chunk
, результат следующий:
vendors~chunk-a~chunk-b~chunk-c: vue
commons~chunk-a~chunk-b~chunk-c: some shared components
chunk-a to chunk-c: Only the components
когда этиshared components
меньше чем30kb
час,webpack
намеренно скопирует модуль вchunk-a chunk-b chunk-c
в трех файлах. Они утверждают, что общее уменьшение размера нагрузки за счет разделения не так хорошо, как стоимость запроса на дополнительную нагрузку.
несколько общих модулей
chunk-a: react
, react-dom
, some components
, some shared react components
chunk-b: react
,react-dom
, angular
, some other components
chunk-c: react
,react-dom
, angular
, some components
, some shared react components
, some shared angular components
chunk-d: angular
, some other components
, some shared angular components
webpack создаст дваvendors chunk
и дваcommons chunk
, результат следующий:
vendors~chunk-a~chunk-b~chunk-c: react
, react-dom
vendors~chunk-b~chunk-c~chunk-d: angular
commons~chunk-a~chunk-c: some shared react components
commons~chunk-c~chunk-d: some shared angular components
chunk-a to chunk-d: Only the components
Примечание: из-заchunk
имя включает в себя все оригинальныеchunk
имя, поэтому рекомендуется не включать в долговременные кешированные производственные сборки[name]
, или поoptimization.splitChunks.name:false
Отключите генерацию имен, чтобы новые ссылки добавлялись при последующей разработке без изменения имени файла.
Если у вас есть какие-либо предложения по оптимизации этой статьи, вы можете отсканировать приведенный ниже QR-код для совместного обсуждения.В то же время я надеюсь, что вы будете уделять больше внимания и будете время от времени присылать оригинальные статьи.