предисловие
Теперь вышел с февраля 2018 года № 15 webpack4.0.0 был в течение некоторого времени, и теперь имеет @ vue / cli 3.0, но хозяин не пробовал, я слышал очень мощный, вы хотите проверить воду, чтобы увидеть документ может быть@vue/cli, официальный скаффолдинг использует webpack4, ваш проект все еще застрял в webpack3 или даже webpack2, вы чувствуете себя устаревшим? Вдохновленный пакетом, известным как конфигурация 0, webpack4 добавляет некоторые конфигурации по умолчанию, отказывается от некоторых сложных конфигураций и более удобен для пользователя.Позвольте мне рассказать о некоторых основных изменениях.
окружающая обстановка
Node.js 4 больше не поддерживается.
Вход по умолчанию
В Webpack 4 указание входных и выходных путей больше не является обязательным. webpack 4 будет по умолчанию записывать в ./src и выводить в ./dist, конечно, это просто закуска.
режим сборки режим
Webpack предоставляет два режима сборки на выбор: разработка и производство.
опции | описывать |
---|---|
development | установит значение process.env.NODE_ENV в development. Включите NamedChunksPlugin (закрепляет идентификатор чанка во время выполнения и разделяет чанки при использовании динамической загрузки) и NamedModulesPlugin (при использовании этого плагина, когда HMR [горячая перезагрузка] включена, будет отображаться относительный путь к модулю). |
production | установит значение process.env.NODE_ENV на производство. Включите плагин FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin, SideEffectsFlagPlugin и UglifyJsPlugin. |
То есть, если режим разработки, официальные леса могут обрезать код.
// webpack.development.config.js
module.exports = {
+ mode: 'development'
- plugins: [
- new webpack.NamedModulesPlugin(),
- new webpack.DefinePlugin({
- 'process.env': require('../config/dev.env')
- }),
- ]
}
Если мод производственный, то официальная скаффолдинг может обрезать код
// webpack.production.config.js
module.exports = {
+ mode: 'production',
- plugins: [
- new UglifyJsPlugin(/* ... */),
- new webpack.DefinePlugin({
- 'process.env': require('../config/dev.env')
- }),
- new webpack.optimize.ModuleConcatenationPlugin()
- ]
}
import(): динамический импорт
В webpack 4 функция import() возвращает объект с пространством имен, что не влияет на модуль ES, но добавляет слой оболочки для модулей, соответствующих спецификации commonjs:
// webpack 2/3
import("./commonjs").then(exports => {
// ...
})
// webpack 4
import("./commonjs").then({default: exports}=> {
// ...
})
элемент конфигурации оптимизации
В элемент конфигурации добавлена опция оптимизации, которая интеллектуально оптимизирует работу в соответствии с выбранным режимом.
При использовании этой конфигурации некоторые предыдущие плагины могут быть заменены конфигурацией в оптимизации.
- Плагин NoEmitOnErrorsPlugin заменен на Optimization.noEmitOnErrors (по умолчанию только в рабочем режиме).
- ModuleConcatenationPlugin заменен наOptimise.concatenateModules (по умолчанию только в рабочем режиме)
- Плагин NamedModulesPlugin заменен на Optimization.namedModules (по умолчанию только в режиме разработки). Плагин CommonsChunkPlugin устарел, используйте вместо него оптимизацию.splitChunks, оптимизацию.runtimeChunk.
// webpack.prod.conf.js
const config = {
// ...
plugins: [
- new webpack.NoEmitOnErrorsPlugin(),
- new webpack.optimize.ModuleConcatenationPlugin(), // 预编译
- new webpack.optimize.CommonsChunkPlugin({
- name: 'vendor',
- minChunks (module) {
- // any required modules inside node_modules are extracted to vendor
- return (
- module.resource &&
- /\.js$/.test(module.resource) &&
- module.resource.indexOf(
- path.join(__dirname, '../node_modules')
- ) === 0
- )
- }
- }),
- new webpack.optimize.CommonsChunkPlugin({
- name: 'manifest',
- minChunks: Infinity
- }),
],
+ optimization: {
+ noEmitOnErrors: true,
+ concatenateModules: true,
+ splitChunks: {
+ chunks: 'all',
+ name: 'common',
+ },
+ runtimeChunk: {
+ name: 'runtime'
+ }
+ }
};
// webpack.dev.conf.js
const config = {
// ...
plugins: [
- new webpack.NamedModulesPlugin()
]
+ optimization: {
+ namedModules: true
+ }
};
Оптимизация.splitChunks не установлена по умолчанию. Если режим производственный, Webpack 4 включит разделение кода. По умолчанию Webpack 4 будет разделять только код по требованию. Если нам нужно настроить начальный код загрузки, чтобы он также добавлялся в разделение кода, мы можем установить для splitChunks.chunks значение «все».
компрессия
Когда режим webpack4 установлен на производство, сжатие кода включено по умолчанию, но я должен ударить по доске и нарисовать ключевые точки. сжатие, кеширование и синтаксис es6, нет необходимости отдельно устанавливать и конвертировать устройство. Впечатлен или нет. Если вы хотите увидеть это, вы можете посмотреть здесьавтостопщик. Если вы хотите переопределить конфигурацию, вы можете сделать это
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
module.exports = {
// ...
optimization: {
minimizer: [
new UglifyJsPlugin() // 具体配置可看github
]
}
}
##Удаленные функции ## удален модуль.загрузчики Удалены loaderContext.options Удален Compilation.notCacheable Удален плагин NoErrors. Удален Dependency.isEqualResource Удален плагин NewWatching. Удален плагин CommonsChunk.
окружающий
Теперь, когда веб-пакет сделал относительно большое обновление, не стесняйтесь менять окружающие вспомогательные средства.Поскольку я обычно использую vue в своем проекте, если вы также используете vue, то есть несколько изменений для vue, о которых вам нужно знать. :
vue-loader
Какой? Не можете больше учиться, просто используйте строительные леса официального сайта? Передовые знания постоянно обновляются, почивают на лаврах и только отступают, если не продвигаются вперед. Но вы должны верить, что будь то веб-пакет или vue-loader, API станет более понятным, а производительность будет более эффективной, так что помогите мне, я все еще могу учиться. . .
Vue Loader v15 использует другую стратегию для определения загрузчиков, используемых языковыми блоками.vue-loader v15В версии 14 или ниже, если вы хотели настроить параметры производного загрузчика, вам приходилось повторять это в параметрах собственных загрузчиков Vue Loader. В v15 вам больше не нужно этого делать. Возьмем в качестве примера официальный скаффолдинг, вы можете увидеть две функции, параметры, используемые для генерации vue-loader и module.rule, я могу увидеть их, вытащив их.
// util.js
exports.cssLoaders = function (options) {
// ...
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
// ...
}
// vue-loader-conf.js
module.exports = {
loaders: utils.cssLoaders({
sourceMap: sourceMapEnabled,
extract: isProduction
}),
...
}
// webpack.dev.config
const devWebpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
},
...
}
Когда я впервые вошел в яму со строительными лесами, я был ослеплен.Почему я написал это для Демасии? Конечно нет, ибо заливка ямы vue-loader v14 Версия vue-loader v15 должна быть написана только один раз, но обратите вниманиеОбязательно добавьте плагин Vue Loader к конфигурации WebPack
// webpack.config.js
const VueLoaderPlugin = require('vue-loader/lib/plugin')
module.exports = {
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
// ...
]
},
plugins: [
// 请确保引入这个插件!
new VueLoaderPlugin()
]
}
Затем из-за различной обработки файлов css в производственной и тестовой средах. Просто настройте загрузчик less/scss css в webpack.dev.config.js и webpack.prod.config.js соответственно:
{
module: {
rules: [
// ...
{
test: /\.less$/,
use: [
'vue-style-loader',
'css-loader',
'less-loader'
]
}
]
}
}
mini-css-extract-plugin извлечение css
WebPack V4 официально не рекомендует использовать экстракт-текст-веб-плагин, изменить мини-CSS-экстрактивный плагин
// webpack4
npm install -D mini-css-extract-plugin
// webpack.config.js
var MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
// 其它选项...
module: {
rules: [
// ... 忽略其它规则
{
test: /\.css$/,
use: [
process.env.NODE_ENV !== 'production'
? 'vue-style-loader'
: MiniCssExtractPlugin.loader,
'css-loader'
]
}
]
},
plugins: [
// ... 忽略 vue-loader 插件
new MiniCssExtractPlugin({
filename: style.css
})
]
}
// webpack3
npm install -D extract-text-webpack-plugin
// webpack.config.js
var ExtractTextPlugin = require("extract-text-webpack-plugin")
module.exports = {
// 其它选项...
module: {
rules: [
// ...其它规则忽略
{
test: /\.css$/,
loader: ExtractTextPlugin.extract({
use: 'css-loader',
fallback: 'vue-style-loader'
})
}
]
},
plugins: [
// ...vue-loader 插件忽略
new ExtractTextPlugin("style.css")
]
}
Благосостояние
Студенты, не знакомые с официальной структурой webpack3, могут прочитать комментарии, которые я написал в соответствии с моим собственным пониманием.здесьЧувствуете хлопоты и не хотите делать это самостоятельно? Не беда, я переделал по скаффолдингу, и вы можете попробовать, если вам интересно.здесьЕсли вы считаете, что это хорошо, пожалуйста, поставьте звезду. Кроме того, я планирую оптимизировать веб-пакет в следующей статье. Если вам это нравится, вы можете обратить внимание