webpack 4 - плагин для разделения фрагментов для нескольких записей
Использование плагина split chunks со следующей конфигурацией:
{
entry: {
entry1: [entry1.js],
entry2: [entry2.js],
entry3: [entry3.js],
...
}
optimization: {
splitChunks: {
chunks: "all"
}
}
}
Код будет идеально разделен на:
vendors-entry1-entry2-entry3.js // common for all
vendors-entry1-entry3.js // vendors only required by both entry1, entry3
entry1-entry2.js // common code of entry1 and entry2
entry1.js // unique entry code
entry2.js
entry3.js
Вопрос в том, как теперь я использую конкретных поставщиков для каждой записи в моем html (или ejs в моем конкретном случае)?
Используя HtmlWebpackPlugin в соответствии с рекомендациями, просто создайте index.html, который загружает все вышеперечисленное, хотя пример использования явно:
При рендеринге entry1 page - load:
vendors-entry1-entry2-entry3.js
vendors-entry1-entry3.js
entry1-entry2.js
entry1.js
При рендеринге entry2 page - load:
vendors-entry1-entry2-entry3.js
entry1-entry2.js
entry2.js
так далее..
Ответы
Ответ 1
Версия 4 HtmlWebpackPlugin (которая на данный момент является альфа-версией) автоматически включает в себя созданные сгенерированные фрагменты записей. Так что настройка chunks: 'entry1'
должна работать:
new HtmlWebpackPlugin({
template: 'entry1.ejs',
filename: 'entry1.html',
chunks: ['entry1']
}),
... и приводит к внедрению всех зависимых блоков в html файл:
<script src="/vendors-entry1-entry2-entry3.js">
<script src="/vendors-entry1-entry3.js">
<script src="/entry1-entry2.js">
<script src="/entry1.js">
Вы можете установить его с помощью
npm install --save-dev [email protected]
Ответ 2
У меня есть аналогичная проблема, и у меня был небольшой успех, используя конфигурационную настройку, которую я нашел здесь. Не уверен, что это применимо к вашему конкретному варианту использования, но я думал, что поделюсь.
Хэш оптимизации в конфигурации webpack выглядит так:
optimization: {
splitChunks: {
cacheGroups: {
commons: {
name: "commons",
chunks: "initial",
minChunks: 2,
minSize: 0
}
}
},
occurrenceOrder: true
},
Таким образом, используя эти точки входа:
entry: {
app: './src/app.js',
home: './src/home.js',
product: './src/product.js'
}
И это как моя установка HtmlWebpackPlugin:
// base template common to all pages
new HtmlWebpackPlugin({
hash: true,
inject: true,
template: './src/jinja-templates/base.html.j2',
filename: '${templates}/base.html.j2',
chunks: ['commons', 'app']
}),
// JUST the homepage
new HtmlWebpackPlugin({
hash: true,
inject: true,
template: './src/jinja-templates/index.html.j2',
filename: '${templates}/index.html.j2',
chunks: ['home']
}),
// JUST the product template
new HtmlWebpackPlugin({
hash: true,
inject: true,
template: './src/jinja-templates/product.html.j2',
filename: '${templates}/product.html.j2',
chunks: ['product']
}),
Я успешно получаю куски "commons" и "app", добавленные ко всем страницам, и на домашней странице добавляется "домашний" фрагмент (только), а на странице продукта добавляется "товарный" кусок (только). Вот пример источника "домашней" страницы:
<body>
...
<script type="text/javascript" src="/static/commons.7ca91fd78182a8eb23f6.js?7ca91fd78182a8eb23f6"></script>
<script type="text/javascript" src="/static/app.7ca91fd78182a8eb23f6.js?7ca91fd78182a8eb23f6"></script>
<script type="text/javascript" src="/static/home.7ca91fd78182a8eb23f6.js?7ca91fd78182a8eb23f6"></script>
</body>
Я не знаю, можно ли разделить модули поставщика с помощью этой настройки. Я предполагаю, что это возможно, но если это так, секретная эскалация веб-пакетов хранит эту информацию хорошо охраняемой: P
Но, учитывая, что он уже разбивает код на несколько очень маленьких кусков, я не уверен, что это необходимо (для меня, во всяком случае).