1. Сотрясение дерева
Роль: Если в нашем проекте представлен пакет lodash, но у меня есть только один из методов. Являются ли другие неиспользуемые методы излишними? На этом этапе встряхивание дерева может удалить бесполезные вещи, чтобы уменьшить окончательный размер пакета.
usedExports : true, помечать неиспользуемые листья
минимизировать: правда, стряхнуть эти бесполезные листья
// webpack.config.js中
module.exports = {
optimization: {
usedExports: true, //只导出被使用的模块
minimize : true // 启动压缩
}
}
Поскольку встряхивание дерева поддерживает только esmodule, если вы упаковываете commonjs, встряхивание дерева будет недействительным. Однако в настоящее время все используют vue, react и другие фреймворки.Все они скомпилированы с помощью babel-loader.Следующая конфигурация может гарантировать, что это должен быть esmodule
Mode="production" webpack5 автоматически включает встряхивание дерева.
2. Сжатый код
1.webpack4
Плагин terser-webpack-plugin необходимо загрузить и установить на webpack4, и требуется следующая конфигурация:
const TerserPlugin = require('terser-webpack-plugin')
module.exports = {
// ...other config
optimization: {
minimize: !isDev,
minimizer: [
new TerserPlugin({
extractComments: false,
terserOptions: {
compress: {
pure_funcs: ['console.log']
}
}
}) ]
}
2.webpack5
У него есть собственная внутренняя функция сжатия js, а также встроенный подключаемый модуль terser-webpack-plugin, поэтому нам не нужно его загружать и устанавливать. И когда режим = «производство», функция сжатия js будет автоматически включена.
Если вы хотите использовать его в среде разработки, используйте следующее:
// webpack.config.js中
module.exports = {
optimization: {
usedExports: true, //只导出被使用的模块
minimize : true // 启动压缩
}
}
3.js проблема сбоя сжатия
Когда вы загрузите оптимизацию-css-assets-webpack-plugin и выполните сжатие css, вы обнаружите, что функция сжатия js по умолчанию для webpack5 недействительна. Поговорим о настройке оптимизации-css-assets-webpack-plugin:
npm install optimize-css-assets-webpack-plugin -D
module.exports = {
optimization: {
minimizer: [
new OptimizeCssAssetsPlugin()
]
},
}
В настоящее время плагин сжатия optimize-css-assets-webpack-plugin можно настроить в плагинах или в оптимизации, как показано на рисунке. Разница заключается в следующем:
Настроил в плагинах, тогда плагин будет работать в любом случае. И конфигурация в оптимизации означает, что она будет работать только тогда, когда для минимизации установлено значение true.
После установки плагина optim-css-assets-webpack-plugin вы обнаружите, что файлы js, которые раньше можно было сжать, теперь нельзя сжать. Причина в том, что указанный вами компрессор
Оптимизация-css-assets-webpack-plugin приводит к сбою terser-webpack-plugin по умолчанию. Решение выглядит следующим образом:
npm install terser-webpack-plugin -D
optimization: {
minimizer: [
new TerserPlugin({
extractComments: false,
terserOptions: {
compress: { pure_funcs: ['console.log'] },
},
}),
new OptimiazeCssAssetPlugin(),
]
},
Даже в webpack5 вы должны использовать минификацию js, как в webpack4.
4. Меры предосторожности
Использование optimise-css-assets-webpack-plugin в webpack5 снова сообщит об ошибке, потому что официальный сайт планировал отменить его, пожалуйста, используйте альтернативу:
npm i css-assets-webpack-plugin -D
3. Объединить модули
Обычная упаковка просто заканчивается тем, что модуль превращается в одну немедленную функцию, если у вас много модулей, то есть много немедленных функций. concatenateModules может объединять все модули в одну функцию.
optimization.concatenateModules = true
Конфигурация выглядит следующим образом:
module.exports = {
optimization: {
usedExports: true,
concatenateModules: true,
minimize: true
}
}
В это время с встряхиванием дерева вы обнаружите, что размер пакета будет значительно уменьшен.
4. Побочные эффекты
В webpack4 добавлена функция sideEffects, которая позволяет нам настраивать, имеет ли наш код побочные эффекты или нет.
Эта функция используется только при разработке пакетов npm.
Объяснение побочных эффектов: В папке utils есть файл index.js, который используется для того, чтобы система экспортировала другие файлы в utils.Эффект в том, чтобы писать меньше.Независимо от того, сколько методов в utils, мне нужно только импортные утилиты.
// utils/index.js
export * from './getXXX.js';
export * from './getAAA.js';
export * from './getBBB.js';
export * from './getCCC.js';
// 在其他文件使用 getXXX 引入
import {getXX} from '../utils'
Что делать, если файл getBBB не используется во внешнем мире и древовидная тряска не может избавиться от него? Это getBBB является побочным эффектом. Вы можете спросить, почему встряхивание деревьев ничего не может с ним сделать? Причина в том, что он использует его в utils/index.js. Можно включить только функцию побочных эффектов. следующим образом:
// package.json中
{
name:“项目名称”,
....
sideEffects: false
}
// webpack.config.js
module.exports = {
mode: 'none',
....
optimization: {
sideEffects: true
}
}
Включены побочные эффекты:
(1) Optimization.sideEffects = true включает побочные эффекты
(2) Установите sideEffects: false в package.json, чтобы пометить все модули без побочных эффектов.
Примечание: перед упаковкой webpack проверит флаг sideEffects в файле package.json, к которому относится проект, если побочных эффектов нет, неиспользуемые модули не нужно упаковывать, и наоборот. На этом этапе включите sideEffects в webpack.config.js.
5. кеш веб-пакета
1. конфигурация кеша webpack4
Поддержка кэширования в памяти
npm install hard-source-webpack-plugin -D
const HardSourceWebpackPlugin = require('hard-source-webpack-plugin')
module.exports = {
plugins: [
// 其它 plugin...
new HardSourceWebpackPlugin(),
] }
2. конфигурация кеша webpack5
webpack5 имеет встроенный механизм кэширования кеша. Вы можете настроить его напрямую.
Кэш будет установлен на тип: память в режиме разработки и отключена в рабочем режиме.
// webpack.config.js
module.exports= {
// 使用持久化缓存
cache: {
type: 'filesystem',
cacheDirectory: path.join(__dirname, 'node_modules/.cac/webpack')
}
}
Необязательные значения для типа: память использует кэширование содержимого, файловая система использует кэширование файлов.
Настройка cacheDirectory вступает в силу только в том случае, если type=filesystem. Где кеш для настройки нужных вещей?
6. Оптимизация загрузчика
webpack 4 требует разных загрузчиков для загрузки ресурсов
- raw-loader импортирует файлы как строки
- url-loader встраивает файлы как URL-адреса данных в файлы пакетов
- загрузчик файлов отправляет файлы в выходной каталог
Тип модуля ресурсов webpack5 заменяет загрузчик
- актив/ресурс заменить файл-загрузчик (отправлять отдельные файлы)
- актив/встроенный заменить URL-загрузчик (URL-адрес экспорта)
- актив/источник заменить raw-loader (исходный код экспорта)
- asset
7. Отличия запуска сервисов
1. webpack4 запускаем сервис
Запустите сервис через webpack-dev-server
2. webpack5 запускает службу
Встроенный использует webpack для запуска, но его лог не очень хороший, поэтому обычно предпочтительнее использовать оптимизацию webpack-dev-server.
8. Федерация модулей (микро-интерфейсы)
webpack может реализовывать ссылки между приложениями и приложениями.
9. Отличие devtool
sourceMap необходимо настроить непосредственно в webpack.config.js devtool Этого можно добиться. И devtool имеет много значений параметров, разные значения параметров, разные файлы .map, созданные с разными параметрами, разную скорость упаковки.
Обычно мы используем «cheap-eval-module-source-map» в конфигурации среды разработки и «none» в производственной среде.
Devtool также отличается в webpack4 и webpack5.
v4: devtool: 'cheap-eval-module-source-map'
v5: devtool: 'eval-cheap-module-source-map'
10. Разница в горячем обновлении
настройки веб-пакета4
настройка веб-пакета5
Если вы используете bable6, в соответствии с приведенными выше настройками вы обнаружите, что горячее обновление недействительно, и вам нужно добавить конфигурацию:
module.hot.accept('需要热启动的文件',(source)=>{
//自定义热启动
})
Babel-загрузчик в последней версии babel уже помог нам справиться с проблемой сбоя горячего обновления. Так что не волнуйтесь, просто используйте его напрямую.
Если вы введете плагин mini-css-extract-plugin, вы обнаружите, что горячее обновление стиля также не удастся.
Вы можете использовать style-loader только в среде разработки и MinicssExtractPlugin.loader в производственной среде. следующим образом:
11. Отличия использования webpack-merge
импорт webpack4
const merge = require('webpack-merge);
импорт веб-пакета 5
const {merge} = require('webpack-merge');
12. Отличия использования copy-webpack-plugin
//webpack.config.js
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = {
plugins: [
// webpack 4
new CopyWebpackPlugin(['public']),
// webpack 5
new CopyWebpackPlugin({
patterns: [{
from: './public',
to: './dist/public'
}]
})
]
}
Новую версию, поддерживаемую webpack5, нужно настроить более четко.