Когда webpack собирает пакет, он иногда сталкивается с проблемой долгого времени упаковки Вот решение, позволяющее сделать упаковку гладкой как шелк~
1. Введение
При упаковке с помощью WebPack для некоторых сторонних библиотек, которые редко обновляются, напримерreact
,lodash
,vue
Мы хотим отделиться от собственного кода, у сообщества Webpack есть два варианта
- CommonsChunkPlugin
- DLLPlugin
дляCommonsChunkPlugin
, webpack фактически должен иметь дело с этими сторонними библиотеками каждый раз, когда он упакован, но после упаковки он может отделить сторонние библиотеки от нашего собственного кода. а такжеDLLPlugin
Он может полностью отделять сторонний код, то есть каждый раз упаковывается только код самого проекта. Концепция Dll заимствована из dll системы Windows. Пакет dll — это чистая зависимая библиотека, которая не может работать сама по себе и используется для ссылки на ваше приложение.
2. Простое использование шаблона webpack
нужно использоватьDLLPlugin
, необходимо создать дополнительный файл конфигурации. Таким образом, для проектов, упакованных таким образом, обычно существуют следующие два файла конфигурации.
- webpack.config.js
- webpack.dll.config.js
Создайте новый файл webpack.dll.config.js в корневом каталоге проекта.
const path = require('path');
const webpack = require('webpack');
module.exports = {
entry: {
vendor: ['vue-router','vuex','vue/dist/vue.common.js','vue/dist/vue.js','vue-loader/lib/component-normalizer.js','vue']
},
output: {
path: path.resolve('./dist'),
filename: '[name].dll.js',
library: '[name]_library'
},
plugins: [
new webpack.DllPlugin({
path: path.resolve('./dist', '[name]-manifest.json'),
name: '[name]_library'
})
]
};
Это нужно для добавления используемых сторонних плагинов в вендор.Затем добавьте код в WebPack.config.js
plugins: [
new webpack.DllReferencePlugin({
manifest: require('./dist/vendor-manifest.json')
})
]
<script type="text/javascript" src="./../vendor.dll.js"></script>
Затем добавьте команду быстрого доступа (build:dll) в файл package.json.
"scripts": {
"dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
"build": "cross-env NODE_ENV=production webpack --progress --hide-modules",
"build:dll": "webpack --config webpack.dll.config.js"
},
При выполнении последнего пакета сначала выполняется команда npm run build:dll, которая будет сгенерирована в каталоге пакета.vendor-manifest.json
файл сvendor.dll.js
документ.
При упаковке dll Webpack сделает индекс всех включенных библиотек и запишет его в файл манифеста, а код, который ссылается на dll (пользователь dll), должен только прочитать файл манифеста, когда он упакован.
повторно выполнитьnpm run build
Установлено, что текущая скорость упаковки веб-пакетов составляет около 2-3 секунд, что намного быстрее, чем предыдущие 20 секунд.
3. Использование веб-пакета шаблона
Создайте webpack.dll.config.js в процессе сборки
содержание:
const path = require('path')
const webpack = require('webpack')
module.exports = {
entry: {
vendor: [
'vue-router',
'vuex',
'vue/dist/vue.common.js',
'vue/dist/vue.js',
'vue-loader/lib/component-normalizer.js',
'vue',
'axios',
'echarts'
]
},
output: {
path: path.resolve('./dist'),
filename: '[name].dll.js',
library: '[name]_library'
},
plugins: [
new webpack.DllPlugin({
path: path.resolve('./dist', '[name]-manifest.json'),
name: '[name]_library'
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
})
]
}
Рекомендуется добавить плагин сжатия кода, иначе пакет dll будет относительно большим.
Добавить конфигурацию после плагина в webpack.prod.conf.js
new webpack.DllReferencePlugin({
manifest: require('../dist/vendor-manifest.json')
})
Добавьте ссылку на запись index.html в корневой каталог.
<script type="text/javascript" src="./vendor.dll.js"></script>
Добавьте команды быстрого доступа в скрипт package.json.
"build:dll": "webpack --config build/webpack.dll.config.js"
запустить, когда dll должна быть сгенерированаnpm run build:dll
, то есть сгенерировать два файла в каталоге distvender-manifest.json
а такжеvender.dll.js
.
Затем официально сгенерируйте продуктnpm run build:prod
В дополнение к генерацииwebpack.dll.config.js
Упакованные файлы, отличные от указанных в .
пытаясьvue-element-admin
Когда DllPlugin был представлен в , было добавлено 20 упакованных элементов, и результаты тестирования были следующими:
Оригинальное время упаковки:
Время упаковки после внедрения DllPlugin:
Видно, что время упаковки значительно сократилось~
4. Другой способ внешнего варианта
Вы также можете использовать внешние файлы, чтобы веб-пакет не упаковывал определенную часть, а затем импортировать файл js в cdn в другом месте и использовать кеш для загрузки файла cdn, чтобы сократить время упаковки.Настройте параметры внешних:
// webpack.prod.config.js
// 多余代码省略
module.exports = {
externals: {
'vue': 'window.Vue',
'vuex': 'window.Vuex',
'vue-router': 'window.VueRouter'
...
}
}
// 配置externals之后,webpack不会把配置项中的代码打包进去,别忘了需要在外部引入cdn上的js文件
// html
<body>
<script src="XXX/cdn/vue.min.js"></script>
......
</body>
Большинство сообщений в Интернете имеют разную глубину и даже некоторые несоответствия. Следующие статьи являются кратким изложением процесса обучения. Если вы найдете какие-либо ошибки, пожалуйста, оставьте сообщение, чтобы указать ~
Ссылаться на:
PS: Всех приглашаю обратить внимание на мой публичный аккаунт [Front End Afternoon Tea], давайте работать вместе~
Кроме того, вы можете присоединиться к группе WeChat «Front-end Afternoon Tea Exchange Group», нажмите и удерживайте, чтобы определить QR-код ниже, чтобы добавить меня в друзья, обратите вниманиеДобавить группу, я заберу тебя в группу~