предисловие
В настоящее время автор занимается обустройствомwebpack
Соответствующие точки знаний, с одной стороны, потому что точки знаний, которые я освоил, относительно фрагментарны и недостаточно систематизированы, иногда я не знаю, с чего начать, сталкиваясь с проблемами, с другой стороныwebpack5.0
Уже на подходе, это действительно голая новость.
Так что это побудило меня сделать систематический обзорwebpack4.0
все очки знаний, включаяwebpack
Происхождение, использование различных конфигураций, оптимизация производительности,Webpack
Базовый принцип и анализ конфигурации связанных лесов, рассмотрели волну, общий каталог выглядит следующим образом:
На этот склад автор закинул серию статей:Webpack учится организовывать документы, Заинтересованные студенты могут посмотреть волну.
Сегодняшняя статья также является авторской разборкой и обзором оптимизации производительности в учебном документе.
Ссылка на код кейса, использованный в статье, размещена внизу, и ее может поднять каждый.
Зачем оптимизировать
Прежде всего, почему мы должны оптимизировать? Конечно, если ваш проект небольшой и быстро собирается, вам не нужно уделять особое внимание вопросам производительности.
Однако по мере того, как в проект вовлекается все больше и больше страниц, функций и бизнес-кодов будет все больше.webpack
Время сборки будет все больше и больше, и в это время мы должны учитывать оптимизацию производительности.
Потому что это время сборки тесно связано с нашей повседневной разработкой, когда начинается наша локальная разработка.devServer
илиbuild
Если время слишком велико, это значительно снизит эффективность нашей работы.
Представьте себе сценарий, в котором мы внезапно сталкиваемся с чрезвычайной ситуацией.bug
, затраты на запуск проекта3/4
минут, после изменения проектаbuild
онлайн тоже3/4
Минуты, на этот раз мозг?duang
,duang
,duang
...
Тогда давайте посмотрим, как оптимизироватьwebpack
производительность, улучшитьwebpack
скорость построения.
инструмент для анализа
Прежде чем начать оптимизацию, нам нужен количественный показатель, чтобы знать, где проблема, влияющая на время сборки.chunk
Файл слишком большой или какойloader
илиplugin
Слишком долго пришлось ждать.
Мы можем использовать некоторые инструменты для выполнения соответствующего проектаобъема такжескоростьАнализ, а потом назначит нужное лекарство.
Анализ объема
первичный анализ
можно через официальнуюstat.json
Файл помогает нам анализировать результаты упаковки,stat.json
Файл можно быстро сгенерировать с помощью следующего оператора:
webpack --profile --json > stats.json
Затем предоставляем через официальный сайтинструмент анализа stats.jsonанализировать, загрузитьstats.json
После файла вы можете получить результаты анализа, как показано на следующем рисунке:
которая включает в себяwebpack
версия, время упаковки, процесс упаковкиhash
стоимость, количество модулей (modules
),chunk
Количество, статические файлы упакованных слоевassets
И количество предупреждений и пакетов ошибок.
Мы можем проанализировать контент, который он предоставляет, и определить общую проблему.
сторонние инструменты
webpack-bundle-analyzerЭто артефакт анализа упаковки, интерфейс которого очень красив, и он может интуитивно указать размер каждого упакованного файла и его соответствующих зависимостей, что может помочь нам более удобно анализировать проект.
Используйте следующим образом:
// config/webpack.common.js
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
const commonConfig = {
// ...
plugins: [
new BundleAnalyzerPlugin({
analyzerPort: 8889, // 指定端口号
openAnalyzer: false,
}),
]
// ...
}
webpack-bundle-analyzer
Нижний слой также зависитstat.json
файл, черезstat.json
Анализ, в результате чего в результате окончательного анализа страницы
Благодаря анализу инструмента анализа мы можем узнать, какие файлы занимают больше времени, а упакованный объем относительно велик, чтобы оптимизировать проблемные файлы.
анализ скорости
мы можем пройтиspeed-measure-webpack-pluginЭтот плагин помогает нам проанализировать общее время, затрачиваемое на весь пакет, а также на каждыйloader
и каждыйplugins
Время, необходимое для сборки, что помогает нам быстро определить, где мы можем оптимизироватьWebpack
Конфигурация.
Как показано на рисунке выше, время, требующее времени, будет отмечено красным цветом.
использовать
Внедрите этот плагин, чтобы создатьplugins
Примерsmp
пакетwebpack
Файла конфигурации достаточно, давайте его модифицируемwebpack
общедоступный файл конфигурацииwebpack.common.js
:
// config/webpack.common.js
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");
const smp = new SpeedMeasurePlugin();
// ...
module.exports = (production) => {
if (production) {
const endProdConfig = merge(commonConfig, prodConfig);
return smp.wrap(endProdConfig);
} else {
const endDevConfig = merge(commonConfig, devConfig);
return smp.wrap(endDevConfig);
}
};
Файлы конфигурации кода, продемонстрированные авторской статьей, делятся на три, а именно:Файл конфигурации среды разработки,Файл конфигурации рабочей среды,так же какОбщий файл конфигурации, совместно используемый первыми двумя,следующим образом:
webpack.dev.js
: файл конфигурации, используемый средой разработки.webpack.prod.js
: файл конфигурации, используемый рабочей средой.webpack.common.js
: общедоступный файл конфигурации
После упаковки можно увидеть следующие рендеры:
Уведомление:
speed-measure-webpack-plugin
дляwebpack
Апгрейд недостаточно совершенен, и пока его нельзя установить на собственное крепление.html-webpack-plugin
который предоставилhooks
обычай наPlugin
(add-asset-html-webpack-plugin
Вот оно) сосуществование, кто-то уже упоминал об этом на githubissue, но, похоже, это не решено.
Стратегия оптимизации
После соответствующего анализа объема и анализа скорости мы можем приступить к оптимизации.
использовать новую версию
Этоwebpack
Универсальная штукатурка с оптимизированными характеристиками, модернизированная версия, безусловно, принесет улучшение производительности, и улучшение очевидно.
Мы можем увидеть сравнительную таблицу:
Из приведенного выше рисунка мы видим, что,
webpack4.0
строится намного быстрее, чемwebpack3.0
,официал так же сказал,что после апгрейда,после апгрейд версии,можно уменьшить время сборки60% - 98%
о.
В каждом обновлении версииwebpack
Определенно будет много внутренней оптимизации, в то время какwebpack
зависитNode
изjs
Запустите среду, обновите их соответствующие версии,webpack
Скорость определенно можно улучшить.
может быть в
webpack5.0
После его выхода большинство методов оптимизации производительности, о которых мы говорили сегодня, будут интегрированы вwebpack
Само по себе нам нужно всего несколько простых конфигураций для завершения настройки производительности.
В то же время новая версия инструмента управления пакетами (Npm
,Yarn
) также может помочь нам быстрее анализировать зависимости и внедрять некоторые пакеты, тем самым повышая скорость упаковки.
Оптимизации, внесенные webpack 4.0
-
v8
Оптимизации, внесенные движком (for of
заменятьforEach
,Map
а такжеSet
заменятьObject
,includes
заменятьindexOf
) - Быстрее используется по умолчанию
md4 hash
алгоритм -
webpack AST
непосредственно изloader
Перейти кAST
, сокращение времени разбора - Используйте строковые методы вместо регулярных выражений
мы можемgithub
Вверхwebpack
библиотекаИтерация релизовПроверьте оптимизацию производительности, которую он приносит на странице:
Одинv8
Пример оптимизации производительности:
Мы можем посмотреть на пример и сравнить использованиеincludes
заменятьindexOf
После того, как ускорение принесено, создайтеcompare-includes-indexof.js
файл, создайте10000000
Массив длин для записи времени, затраченного двумя функциями:
const ARR_SIZE = 10000000;
const hugeArr = new Array(ARR_SIZE).fill(1);
// includes
const includesTest = () => {
const arrCopy = [];
console.time('includes')
let i = 0;
while (i < hugeArr.length) {
arrCopy.includes(i++);
}
console.timeEnd('includes');
}
// indexOf
const indexOfTest = () => {
const arrCopy = [];
console.time('indexOf');
for (let item of hugeArr) {
arrCopy.indexOf(item);
}
console.timeEnd('indexOf');
}
includesTest();
indexOfTest();
Его можно найтиincludes
намного быстрее, чемindexOf
:
-
includes
:12.224ms
-
indexOf
:147.638ms
Так что используйте более новые как можно больше в проектеwebpack
,Node
,Npm
,Yarn
Версия — это наш первый шаг к повышению скорости упаковки.
оптимизация объема
webpack
Это инструмент упаковки проекта. Как правило, после упаковки проекта его необходимо опубликовать на сервере для использования пользователями. Для удобства пользователей размер нашего проекта должен быть как можно меньше, поэтомуwebpack
Упакованный томwebpack
важная часть.
сжатие js
webpack4.0
По умолчанию сжатие кода поддерживается в производственной среде, т.е.mode=production
режим.
Фактическиwebpack4.0
По умолчанию используетсяterser-webpack-pluginЭтот плагин сжатия, ранее использовавшийсяuglifyjs-webpack-plugin, разница между ними в том, что последний не очень хорош для сжатия ES6, и мы можем включитьparallel
параметр для использования многопроцессорного сжатия для ускорения сжатия.
// config/webpack.common.js
const TerserPlugin = require('terser-webpack-plugin');
// ...
const commonConfig = {
// ...
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
parallel: 4, // 开启几个进程来处理压缩,默认是 os.cpus().length - 1
}),
],
},
// ...
}
CSS-сжатие
Сжать CSS
мы можем использоватьoptimize-css-assets-webpack-plugin
плагин для сжатияcss
, по умолчанию используется механизм сжатияcssnano
. Конкретное использование заключается в следующем:
// config/webpack.prod.js
const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
// ...
const prodConfig = {
// ...
optimization: {
minimizer: [
new OptimizeCSSAssetsPlugin({
assetNameRegExp: /\.optimize\.css$/g,
cssProcessor: require('cssnano'),
cssProcessorPluginOptions: {
preset: ['default', { discardComments: { removeAll: true } }],
},
canPrint: true,
})
]
},
}
стереть бесполезноCSS
использоватьPurgeCSS
чтобы завершить бесполезноеcss
стирания, требуется иmini-css-extract-plugin
С использованием.
// config/webpack.common.js
const PurgecssPlugin = require('purgecss-webpack-plugin');
// ...
const PATHS = {
src: path.join(__dirname, './src')
};
const commonConfig = {
// ...
plugins: [
// ...
new PurgecssPlugin({
paths: glob.sync(`${PATHS.src}/**/*`, { nodir: true }),
}),
]
// ...
}
Например, до использования этого плагина мы использовали толькоnavcontact
Этот класс, остальные не используются, упаковываем перед введением и находим неиспользуемыеcss
Он по-прежнему будет упакован в:
После внедрения плагина перепаковываем его и обнаруживаем, что он не используется.css
все стерты:
Для большего использования вы можете обратиться кPurgeCSS-документация.
Сжатие изображения
Вообще говоря, после упаковки размер некоторых файлов изображений намного больше, чемjs
илиcss
Файл будет большим, поэтому первое, что нам нужно сделать, это оптимизировать изображение, мы можем вручную использовать онлайн-инструмент сжатия изображений, напримерtiny pngПомогите нам сжать изображения.
Но это довольно громоздко. В проекте мы надеемся, что сможем еще немного автоматизировать и автоматически помочь нам в сжатии изображений. В настоящее время мы можем воспользоваться помощьюimage-webpack-loaderПомогите нам это сделать. это основано наimageminЭта библиотека Node реализует сжатие изображений.
Очень прост в использовании, пока мыfile-loader
присоединиться послеimage-webpack-loader
Только что:
// config/webpack.common.js
// ...
module: {
rules: [
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'file-loader',
options: {
name: '[name]_[hash].[ext]',
outputPath: 'images/',
}
},
{
loader: 'image-webpack-loader',
options: {
// 压缩 jpeg 的配置
mozjpeg: {
progressive: true,
quality: 65
},
// 使用 imagemin**-optipng 压缩 png,enable: false 为关闭
optipng: {
enabled: false,
},
// 使用 imagemin-pngquant 压缩 png
pngquant: {
quality: '65-90',
speed: 4
},
// 压缩 gif 的配置
gifsicle: {
interlaced: false,
},
// 开启 webp,会把 jpg 和 png 图片压缩为 webp 格式
webp: {
quality: 75
}
}
}
]
},
]
}
// ...
Давайте пока не будем использовать этоloader
Упакуйте его, размер изображения2.1MB
:
использоватьimage-webpack-loader
После этого размер изображения666KB
:
Эффект сжатия очевиден.
сплит-код
Иногда некоторые модули, которые мы пишем, вообще не используются, но все равно упакованы, что на самом деле тормозит.webpack
Скорость упаковки , и это также увеличит размер упакованного файла, поэтому мы можем использоватьtree-shaking
Удалите эти коды.
или вы также можете использоватьsplitChunksPlugin
Разделение большого файла на несколько небольших файлов также может эффективно улучшитьwebpack
Скорость упаковки, подробное введение в конфигурацию, вы можете прочитать письмо автораНастройка плагина SplitChunks, в котором подробно описано, как настроитьsplitChunks
, а использование и значение каждого параметра здесь обсуждаться не будет.
Оптимизация скорости
Поговорив об оптимизации объема упаковки, давайте взглянем на оптимизацию с точки зрения скорости.
Отдельные две конфигурации
Вообще говоря, при разработке проекта мы будем различать два набора конфигураций, среду разработки и рабочую среду, и выполнять соответствующие обязанности.
В процессе разработки: нам нужноwebpack-dev-server
помочь нам в быстром развитии, нуждаясь вГорячее обновление HMRПомогите нам сделать не требующие обновления изменения на странице, которые находятся вПроизводственная средане требуются.
На этапе производства: нам нужносжатие кода,очистка каталога,Рассчитать хэш,Извлечь CSSтак далее;
Это очень просто реализовать.Как мы уже упоминали ранее, мы создадим три новых.webpack
Файл конфигурации сделает:
-
webpack.dev.js
: файл конфигурации для среды разработки -
webpack.prod.js
: Файл конфигурации для производственной среды. -
webpack.common.js
: общедоступный файл конфигурации
пройти черезwebpack-merge
для интеграции общей конфигурации двух файлов конфигурацииwebpack.common.js
, подробности см. в исходном коде.
Сократите процесс поиска
правильноwebpack
изresolve
Настройте параметры разумно, используйтеresolve
поле рассказываетwebpack
Как искать файлы.
добросовестное использованиеresolve.extensions
Если оператор импорта не имеет суффикса файла,webpack
Он автоматически добавит суффикс, чтобы попытаться узнать, существует ли файл Порядок запроса соответствует нашей конфигурации.resolve.extensions
Ищите по порядку спереди назад,webpack
Поддерживаемые суффиксы по умолчанию:js
а такжеjson
.
Например 🌰: если мы настроимresolve.extensions= ['js', 'json']
,Такwebpack
найдет первымxxx.js
Если нет, ищите сноваxxx.json
, поэтому мы должны писать часто используемые файловые суффиксы впереди илиКогда будем импортировать модуль, попробуем ввести суффикс файла.
несмотря на то что
extensions
Сначала будет искаться значение в массиве, но мы не хотим вставлять в него все суффиксы, что вызовет многократный поиск файлов, что замедлит скорость упаковки.
оптимизацияresolve.modules
Это свойство говоритwebpack
Каталог, который следует искать при разборе модулей, можно использовать как абсолютные, так и относительные пути. Использование абсолютных путей будет искать только в заданном каталоге, уменьшая иерархию поиска для модулей:
// config/webpack.common.js
// ...
const commonConfig = {
// ...
resolve: {
extensions: ['.js', '.jsx'],
mainFiles: ['index', 'list'],
alias: {
alias: path.resolve(__dirname, '../src/alias'),
},
modules: [
path.resolve(__dirname, 'node_modules'), // 指定当前目录下的 node_modules 优先查找
'node_modules', // 将默认写法放在后面
]
},
// ...
}
// ...
использоватьresolve.alias
Сократите процесс поиска
alias
означаетпсевдоним, который может сопоставить исходный путь импорта с новым путем импорта.
Например, в нашем проекте могут быть какие-то относительные пути, мы можем использоватьalias
настройка для сокращения процесса поиска;
Также как мы часто используемreact
библиотеку, на самом деле, мы можем напрямую использовать ееdist
Упакованный каталогreact.min.js
, чтобы можно было пропустить трудоемкий синтаксический анализ модуля Конкретный пример конфигурации выглядит следующим образом:
// config/webpack.common.js
// ...
const commonConfig = {
// ...
resolve: {
// ...
alias: {
react: path.resolve(__dirname, './node_modules/react/dist/react.min.js'),
@alias: path.resolve(__dirname, '../src/alias'),
},
},
// ...
}
// ...
Автор не пробовал это в реальном проекте, но это тоже идея, и каждый может попробовать, если у него есть возможность.
Минимизировать цель сборки
исключатьWebpack
Модули, которые не нужно разрешать, т.е. использоватьloader
При его использовании используйте его в как можно меньшем количестве модулей.
мы можем использоватьinclude
а такжеexclude
Эти два параметра определяютloader
Только в тех модулях это применяется и в каких модулях это не.
Модифицируем публичный файл конфигурацииwebpack.common.js
:
// config/webpack.common.js
// ...
const commonConfig = {
// ...
module: {
rules: [
{
test: /\.js|jsx$/,
exclude: /node_modules/,
include: path.resolve(__dirname, '../src'),
use: ['babel-loader']
},
// ...
]
},
}
// ...
Сначала не добавляемexclude
а такжеinclude
Два параметра, упакуйте егоnpm run build
, время упаковки3350ms
о:
Затем мы добавляем эти два параметра, что означает:
-
exclude: /node_modules/
:исключатьnode_modules
файл ниже -
include: path.resolve(__dirname, '../src')
: Толькоsrc
Следующие файлы используют
Переупакуйте его, время упаковки становится1400ms
о:
Увеличьте скорость сборки с помощью многопоточности
из-за бегаNode.js
надwebpack
является однопоточной моделью, поэтомуwebpack
Вещи, которые нужно решать по очереди, не более, а делайте вместе.
еслиwebpack
Может справляться с несколькими задачами одновременно и играть в многоядерные игрыCPU
Мощность компьютера, то улучшение его скорости упаковки должно иметь большой эффект.
HappyPack
Принцип: каждый разwebapck
разбор модуля,HappyPack
назначит его и его зависимостиworker
в теме. После завершения обработки верните обработанные ресурсы вHappyPack
основной процесс для ускорения упаковки.
существует
webpack4.0
используется вhappypack
нужно использовать его5.0
Версия.
мы будемHappyPack
Представляя общедоступный файл конфигурации, его использование состоит в том, чтобы поместить соответствующийloader
заменитьhappypack/loader
, при заменеloader
в свой плагинloaders
вариант, давайте заменим его покаbabel-loader
:
// config/webpack.common.js
// ...
const makePlugins = (configs) => {
const plugins = [
// ...
new HappyPack({
loaders: ['babel-loader']
}),
];
// ...
return plugins;
}
// ...
const commonConfig = {
entry: {
main: "./src/index.js",
entry2: "./src/entry2.js",
entry3: "./src/entry3.js",
entry4: "./src/entry4.js",
entry5: "./src/entry5.js",
entry6: "./src/entry6.js",
},
// ...
module: {
rules: [{
test: /\.jsx?$/,
// exclude: /node_modules/,
// include: path.resolve(__dirname, '../src'),
use: [
'happypack/loader'
// 'babel-loader'
]
}]
},
// ...
}
// ...
Чтобы сделать эффект более очевидным, добавим в проект еще несколько входных файлов.happypack
В случае с пакетом время составляет около8s
много:
включиhappypack
После этого мы можем увидеть из консоли,happypack
Он у нас включен по умолчанию3
процесс, время упаковки становится6.5s
о:
Уведомление:
HappyPack
Авторы этого плагина практически больше не поддерживают этот плагин, так как интерес автора к проекту ослабевает. Он также рекомендовал нам использоватьwebpack
официальныйthread-loader.
Для получения дополнительных параметров вы можете обратиться кОфициальный сайт HappyPack
thread-loader
webpack
Официально запущено многопроцессное решение для заменыHappyPack
.
принцип иHappyPack
аналогичный,webpack
Разбирать по одному модулю за раз,thread-loader
назначит его и его зависимостиworker
В потоке, чтобы достичь цели мультипроцессной упаковки.
Он очень прост в использовании, прямо вloader
добавить передthread-loader
Хорошо, нам нужно сначала закомментироватьHappyPack
Код:
// config/webpack.common.js
// ...
const commonConfig = {
// ...
module: {
rules: [{
test: /\.jsx?$/,
// exclude: /node_modules/,
// include: path.resolve(__dirname, '../src'),
use: [
{
loader: 'thread-loader',
options: {
workers: 3, // 开启几个 worker 进程来处理打包,默认是 os.cpus().length - 1
}
},
'babel-loader'
]
}]
},
// ...
}
// ...
Запустим еще раз, это почти то же самое6.5s
о:
Предварительно скомпилированные модули ресурсов (DllPlugin)
Когда мы упаковываем, вообще говоря, сторонний модуль не изменится, поэтому мы хотим упаковать сторонний модуль только тогда, когда мы упаковываем его в первый раз, и упаковываем сторонний модуль в определенный файл. времяwebpack
При упаковке вам не нужно идтиnode_modules
Внедряйте сторонние модули, но напрямую используйте файлы сторонних модулей, которые мы впервые упаковали.
webpack.DllPlugin
Это подключаемый модуль для решения этой проблемы.С его помощью он может генерировать неизмененный код для других модулей, на который можно ссылаться после первой компиляции и упаковки, чтобы при следующей сборке можно было сэкономить время компиляции и упаковки. во время разработки.
Добавить файл конфигурации
Мы находимся в каталоге файла конфигурацииconfig
создать новыйwebpack.dll.js
, этот файл используется для упаковки файлов наших сторонних пакетов вdll
Перейдите в папку:
// config/webpack.dll.js
const path = require('path');
const webpack = require('webpack');
module.exports = {
mode: 'production', // 环境
entry: {
vendors: ['lodash'], // 将 lodash 打包到 vendors.js 下
react: ['react', 'react-dom'], // 将 react 和 react-dom 打包到 react.js 下
},
output: {
filename: '[name].dll.js', // 输出的名字
path: path.resolve(__dirname, '../dll'), // 输出的文件目录
library: '[name]' // 将我们打包出来的文件以全部变量的形式暴露,可以在浏览器变量的名字进行访问
},
plugins: [
// 对生成的库文件进行分析,生成库文件与业务文件的映射关系,将结果放在 mainfest.json 文件中
new webpack.DllPlugin({
name: '[name]', // 和上面的 library 输出的名字要相同
path: path.resolve(__dirname, '../dll/[name].manifest.json'),
})
]
}
- над
library
на самом деле означает, чтоdll
Файл экспортируется в виде глобальной переменной, удобной для последующего обращения, как показано на следующем рисунке: -
mainfest.json
Файл — это отношение отображения, его роль — помочьwebpack
Используйте наши ранее упакованные***.dll.js
файл вместо повторного переходаnode_modules
найти в.
Давайте упакуем его в командной строкеdll
файл, вы можете видеть, что корневой каталог генерируетdll
папка, и соответствующие файлы генерируются ниже, иloader
упакованныйvendor.dll.js
середина,react
а такжеreact-dom
упакованныйreact.dll.js
бинго:
Затем нам нужно изменить общедоступный файл конфигурацииwebpack.common.js
, который мы сгенерировали ранееdll
импорт файла вhtml
посередине, если мы не хотим вручнуюhtml
файл для добавленияdll
файл, мы можем использовать плагинadd-asset-html-webpack-plugin
, этот плагин, как следует из названия, предназначен для добавления некоторых файлов вhtml
входить.
При этом нам нужно использоватьwebpack
автономныйDllReferencePlugin
пара плагиновmainfest.json
Файлы карты для анализа.
// config/webpack.common.js
const webpack = require('webpack');
const AddAssetHtmlWebpackPlugin = require('add-asset-html-webpack-plugin');
// ...
const commonConfig = {
// ...
plugins: [
// ...
new AddAssetHtmlWebpackPlugin({
filepath: path.resolve(__dirname, '../dll/vendors.dll.js')
}),
new AddAssetHtmlWebpackPlugin({
filepath: path.resolve(__dirname, '../dll/react.dll.js')
}),
new webpack.DllReferencePlugin({
manifest: require(path.resolve(__dirname, '../dll/vendors.dll.mainfest.json'))
}),
new webpack.DllReferencePlugin({
manifest: require(path.resolve(__dirname, '../dll/react.dll.mainfest.json'))
}),
],
// ...
}
// ...
Код здесь тоже можно оптимизировать, за подробностями можно обратиться к составленным автором заметкам.оптимизация dllэта секция.
Мы осуществляем упаковку, и мы видим, что время упаковки составляет1450ms
Слева и справа одновременно видно, что файлы библиотеки упакованы вvendors.chunk.js
для1.22MB
.
мы комментируем правоdll
После эталонного анализа переупаковки время упаковки составляет1950ms
влево и вправо, глядяvendors.chunk.js
для5.28MB
.
Связанный с кешем
Мы можем включить соответствующийloader
илиplugin
cache для повышения скорости вторичной сборки. Как правило, мы можем сделать следующее:
-
babel-loader
включить кеш -
terser-webpack-plugin
включить кеш - использовать
cache-loader
илиhard-source-webpack-plugin
Если в проекте есть кеш, вnode_modules
Будет соответствующее.cache
каталог для хранения соответствующего кеша.
babel-loader
Сначала мы включаемbabel-loader
кеш, модифицируемbabel-loader
параметр, параметрcacheDirectory
Установить какtrue
:
// config/webpack.common.js
// ...
module: {
rules: [
{
test: /\.jsx?$/,
// exclude: /node_modules/,
// include: path.resolve(__dirname, '../src'),
use: [
{
loader: 'babel-loader',
options: {
cacheDirectory: true,
}
},
]
},
]
}
// ...
Время первой упаковки8.5s
или так, после завершения упаковки, мы можем обнаружить, что вnode_modules
сгенерировал.cache
каталог, в котором хранятсяbabel
Кэш-файл:
Мы перепаковываем один раз и обнаруживаем, что время становится6s
о:
TerserPlugin
Мы проходимTerserPlugin
серединаcache
установить какtrue
, вы можете включить кэширование:
// config/webpack.common.js
const TerserPlugin = require('terser-webpack-plugin');
// ...
const commonConfig = {
// ...
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
parallel: 4, // 开启几个进程来处理压缩,默认是 os.cpus().length - 1
cache: true,
}),
],
},
// ...
}
Время первой упаковки8-9s
вокруг, в то же время.cache
создается в каталогеterser-webpack-plugin
Каталог кэша:
Мы перепаковываем один раз и обнаруживаем, что время становится5s
о:
HardSourceWebpackPlugin
Этот плагин на самом деле используется для обеспечения промежуточного кеша для модулей.
Используйте следующее, мы можем напрямую ввести его в плагин, и это нормально:
// config/webpack.common.js
const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
// ...
const plugins = [
// ...
new HardSourceWebpackPlugin(),
];
// ...
Давай упакуем, это видно, когда мы упаковываем в первый разHardSourceWebpackPlugin
Просто помогите нам начать генерировать файлы пакетов, и в то же время.cache
каталог созданhard-source
каталог, требуется время для упаковки в первый раз6.6s
о:
Мы перепаковываем один раз и обнаруживаем, что время становится2.7s
о:
Разумное использование sourceMap
Мы говорили об этом раньше, до того, как упаковали и сгенерировалиsourceMap
Когда информация более подробная, скорость упаковки будет ниже.
Поэтому нам нужно использовать соответствующий код в соответствующей среде в процессе упаковки кода.sourceMap
Очень важный.
разное
В дополнение к общим методам, которые мы упоминали выше, существуют и другие методы, такие как:
- использовать
ES6 Modules
Грамматика, чтобы обеспечитьTree-Shaking
ворваться
потому что
tree-shaking
только правильноES6 Modules
Статический импорт вступает в силу для чего-то вродеCommonJs
Недопустимый метод динамического импорта
- добросовестное использование
Ployfill
Если мы представим
polyfill
Если не разобраться,Webpack
положит всеPolyfill
загружаются, в результате чего выходной файл получается слишком большим. Рекомендуемое использование@babel/preset-env
изuseBuiltIns='usage'
схема, этот элемент конфигурации поможет нам ввести необходимые прокладки по мере необходимости в соответствии с совместимостью браузера; кроме того, мы также можем использовать динамическиеpolyfill
службы, каждый раз в соответствии с браузеромUser Agent
, отправить разныеPolyfill
, вы можете обратиться кpolyfill.io
.
- Предварительно загрузить ресурсы
webpackPrefetch
использовать
webpackPrefetch
для предварительной загрузки некоторых ресурсов заранее, что означаетВ будущем могут потребоваться некоторые ресурсы модуля, и код модуля, который необходимо использовать, будет загружен, когда пропускная способность будет свободна после загрузки кода ядра.
-
icon
использование изображения классаcss Sprite
объединить фотографии
если
icon
Если изображений классов слишком много, используйте изображение спрайта для синтеза одного изображения, чтобы уменьшить сетевые запросы, или используйте файлы шрифтов.
html-webpack-externals-plugin
Этот плагин может извлекать некоторые общедоступные пакеты для использования.
cdn
Знакомьтесь, не входитеbundle
, тем самым уменьшая размер упакованного файла и ускоряя упаковку.
- Разумная конфигурация
chunk
хэш-значение
Упаковка в производственной среде, обязательно настроить файл
hash
, который помогает браузеру кэшировать наши файлы. Когда наш файл кода не изменяется, пользователю нужно только прочитать файл, кэшированный браузером.Вообще говоряjavascript
использование файла[chunkhash]
,css
использование файла[contenthash]
, другие ресурсы (такие как изображения, шрифты и т. д.)[hash]
.
Больше методов оптимизации производительности автор перечислять не будет, т.к.webpack
Существует слишком много методов оптимизации производительности, и вы можете сформулировать соответствующие схемы оптимизации в соответствии с реальными возникающими проблемами.
резюме
Сегодняшняя статья знакомитwebpack
Для некоторых упакованных решений по оптимизации, от объема проекта до скорости проекта, мы предложили некоторые решения по оптимизации, которые вы можете практиковать в конкретных проектах.
Конечно, я также хочу упомянуть, что если ваш проект построен быстрее, вам на самом деле вам на самом деле не нужно использовать метод, упомянутый в статье для оптимизации проекта, и эффект может быть контрпродуктивным.
Некоторое содержание статьи вы можете найти в моемWebpack учится организовывать документыНайдите соответствующее введение.
Честно говоря, я хочу комплимент!
Ссылки по теме
- Webpack учится организовывать документы
- оптимизация веб-пакета - удвоит скорость вашей эффективности сборки
- Позвольте вам подробно разблокировать серию веб-пакетов (оптимизация)
- Резюме стратегий оптимизации производительности сборки webpack
- Время гиков поиграть с webpack
- 30 минут, чтобы освоить оптимизацию производительности веб-пакета
- Используйте webpack для настройки среды разработки переднего плана
- официальный инструмент упаковки webpack
образец кода
Пример кода можно найти здесь: