существуетвыпущен вебпак 3После этого команда webpack пообещала сообществу, что будет длительный и стабильный цикл разработки для последующих итераций основной версии webpack. А в августе 2017 года команда webpack начала сmaster
ветка вырезанаnext
Ветка используется для разработки webpack 4 после 5-месячного цикла разработки.webpack 4.0-betaОн был выпущен в январе 2018 года, что не только выполнило предыдущее обещание, но также принесло много новых функций и внесло множество улучшений в пользовательский интерфейс.
Установить
Если вам нужно использовать webpack 4, вам нужно начать сnext
Установить на ветке:
// yarn
yarn add webpack@next webpack-cli --dev
// npm
npm install webpack@next webpack-cli --save-dev
Неполное руководство по миграции на север
окружающая обстановка
Node.js 4 больше не поддерживается.
согласно с
package.json
конфигурации минимальная поддерживаемая версия Node.js:6.11.5
тип модуля
До веб-пакета 4 js был единственным типом модуля в веб-пакете и, следовательно, не мог эффективно упаковывать другие типы файлов. И webpack 4 предоставляет 5 типов модулей:
-
javascript/auto
: (тип по умолчанию в webpack 3) поддерживает все модульные системы JS: CommonJS, AMD, ESM -
javascript/esm
: модули EcmaScript, недоступные в других модульных системах (по умолчанию.mjs
документ) -
javascript/dynamic
: Поддерживаются только CommonJS и AMD, модули EcmaScript недоступны. -
json
: доступныйrequire
а такжеimport
Данные импортированного формата JSON (по умолчанию.json
документ) -
webassembly/experimental
: модуль WebAssembly (экспериментальный, по умолчанию.wasm
документ)
Кроме того, webpack 4 разрешает по умолчанию.wasm
, .mjs
, .js
а также.json
файл с суффиксом.
В конфигурации загрузчика соответствующего файла нужно добавитьtype
поле для указания типа модуля:
module: {
rules: [{
test: /\.special\.json$/,
type: "javascript/auto",
use: "special-loader"
}]
}
javascript/auto
/ javascript/esm
Оба могут обрабатывать ESM, но последний более строгий:
- Импортированное имя должно существовать в импортируемом модуле.
- Динамические модули (не ESM, такие как CommonJS) могут передаваться только по умолчанию.
import
Импорт, импорт другими способами (включая пространство имен) сообщит об ошибке
Для модулей WebAssembly:
- Может импортировать другие модули (JS и WASM)
- Попытка импортировать модуль, который не существует в модуле WASM, приведет к предупреждению или ошибке.
- ESM может импортировать имена модулей, экспортированные в модули WASM.
- Доступно только в асинхронных фрагментах (через
import()
импортированные модули), он недействителен в начальных фрагментах (не способствует повышению производительности веб-приложений)
import()
: динамический импорт
В вебпаке 4,import()
вернет пространство имен с (namespace
), что не влияет на модуль ES, но не следуетcommonjs
Стандартный модуль добавит слой обертывания:
// webpack 2/3
import("./commonjs").then(exports => {
...
})
// webpack 4
import("./commonjs").then({default: exports}=> {
...
})
mode
: конфигурация режима
mode
— это недавно добавленная опция параметра в webpack 4, которая имеет два необязательных значения:production
а такжеdevelopment
.mode
Не по умолчанию, вам нужно выбрать один из двух:
-
production
модель:- Предоставляет все возможные оптимизации по умолчанию, такие как сжатие кода/расширение области действия и т. д.
- не поддерживается
watching
-
process.env.NODE_ENV
Значение не нужно определять снова, значение по умолчанию равноproduction
/** webpack.production.config.js **/
// webpack 2/3
module.exports = {
plugins: [
new UglifyJsPlugin(/* ... */),
new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("production") }),
new webpack.optimize.ModuleConcatenationPlugin(),
new webpack.NoEmitOnErrorsPlugin()
]
}
// webpack 4
module.exports = {
mode: 'production'
}
-
development
модель:- В основном оптимизирована инкрементальная скорость сборки и опыт разработки.
-
process.env.NODE_ENV
Значение не нужно определять снова, значение по умолчанию равноdevelopment
- Примечания и советы поддерживают режим разработки и поддерживает исходные карты в рамках Eval
/** webpack.development.config.js **/
// webpack 2/3
module.exports = {
plugins: [
new webpack.NamedModulesPlugin(),
new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("development") })
]
}
// webpack 4
module.exports = {
mode: 'development'
}
Кроме того, webpack 4 предоставляет скрытый (
none
) режим, который отключает все оптимизации
настройка побочных эффектов
вебпак 4 дюймаpackage.json
представил паруsideEffects: false
служба поддержки. когда модульpackage.json
Добавление этого поля в , указывает на то, что модуль не имеет побочных эффектов, а это значит, что webpack может безопасно очищать код, который используется для реэкспорта.
JSON
Webpack 4 поддерживает не только нативную обработку JSON, но и Tree Shaking для JSON. При использовании синтаксиса ESMimport
json, webpack удалит неиспользуемый экспорт в модуле JSON.
Кроме того, если вы хотите преобразовать json в js с помощью загрузчика, вам нужно установитьtype
дляjavascript/auto
:
module.rules: [
{
test: /\.special\.json$/,
type: "javascript/auto",
use: "special-loader"
}
]
настроить
- Удалены некоторые распространенные встроенные функции:
- NoEmitOnErrorsPlugin -> оптимизация.noEmitOnErrors (по умолчанию в рабочем режиме)
- ModuleConcatenationPlugin -> оптимизация.concatenateModules (по умолчанию для производственного режима)
- NamedModulesPlugin -> оптимизация.namedModules (по умолчанию в режиме разработки).
- Удален CommonsChunkPlugin и заменен на
optimization.splitChunks
а такжеoptimization.runtimeChunk
, который обеспечивает детальное управление политиками кэширования.
- можно использовать
module.rules[].resolve
настроить синтаксический анализ, который объединен с глобальной конфигурацией. -
optimization.minimize
Переключитесь на свертывание элементов управления. Рабочий режим включен по умолчанию, режим разработки выключен по умолчанию. -
optimization.minimizer
Используется для настройки минимизаторов и опций. - Многие параметры конфигурации, которые поддерживают заполнители, теперь также поддерживают функциональные формы.
- Неправильно
options.dependencies
Конфигурация сообщит об ошибке -
sideEffects
в состоянии пройтиmodule.rules
покрытие -
output.hashFunction
Может быть конструктором для настройки хеш-функции. По соображениям производительности также могут быть предоставлены некриптографические хэш-функции. -
output.globalObject
Ссылка на глобальный объект, которую можно использовать для настройки среды выполнения. -
распределение по умолчанию
- веб-пакет по умолчанию
.wasm
,.mjs
,.js
а также.json
Найдите модули в порядке расширения. -
output.pathinfo
Он включен по умолчанию в режиме разработки - В рабочей среде кэш памяти по умолчанию отключен.
-
entry
Значение по умолчанию./src
,output.path
Значение по умолчанию./dist
- При выборе параметра режима значение по умолчанию равно
production
- веб-пакет по умолчанию
оптимизация
-
uglifyjs-webpack-plugin
Выпуск v1, поддержка ES2015 - Используйте массивы JSONP вместо функций JSONP -> поддержка асинхронности
- Сам webpack также может удалять мертвый код. В webpack 2/3 бесполезный код удаляется при использовании Uglify, а в webpack 4 webpack также может (в некоторых случаях) удалять бесполезный код, чтобы избежать
import()
Сбой при ссылке на бесполезный код - Модули с заданной областью действия будут генерировать меньше кода
представление
- По умолчанию UglifyJS будет кешировать и распараллеливать по умолчанию (полная реализация кеширования и распараллеливания будет реализована в webpack 5)
- Несколько улучшений производительности, особенно в инкрементных сборках
- улучшен
RemoveParentModluesPlugin
представление - Неиспользуемые модули больше не имеют ненужного подъема прицела.
- Добавьте ProfilingPlugin, этот плагин (в браузере Chrome) создаст файл, содержащий время, затрачиваемое каждым плагином.
-
for of
заменятьforEach
;Map/Set
заменятьObjects
;includes
заменятьindexOf
- Одна и та же задача будет поставлена в очередь только один раз
Полный список улучшений производительности и оптимизаций можно найти здесь.Release 4.0-beta.0
удаленные функции
- удаленный
module.loaders
- удаленный
loaderContext.options
- удаленный
Compilation.notCacheable
- удаленный
NoErrorsPlugin
- удаленный
Dependency.isEqualResource
- удаленный
NewWatchingPlugin
- удаленный
CommonsChunkPlugin