HZERO前端工程架构现已采用全新的Webpack 4.x
作为项目工程的开发和构建工具.
Webpack 4.x
加入了更多新的特性,同时改进了原来的配置方案,官方的说法是全新版本采用社区的最佳实践方案.
更多关于
webpack
,请参考https://webpack.js.org/
HZERO前端工程架构的webpack
配置遵循约定优于配置,以下是webpack 4.x
的部分默认值(约定):
-
entry 的默认值是
./src
-
output.path 的默认值是
./dist
-
mode 的默认值是 production
-
js压缩插件等插件默认开启 caches 和 parallizes
-
在 develoment mode 默认:
- 开启 output.pathinfo
- 关闭 optimization.minimize
-
在 production mode 默认:
- 关闭 in-memory caching
- 开启 NoEmitOnErrorsPlugin
- 开启 ModuleConcatenationPlugin
- 开启 optimization.minimize
更多默认配置请参考: https://github.com/webpack/webpack/blob/next/lib/WebpackOptionsDefaulter.js
核心插件
Webpack
官方去除和改进一些插件,同时还对相关插件配置做了调整
terser-webpack-plugin
官方现采用terser-webpack-plugin
替换替换原来的uglifyjs-webpack-plugin
等相关插件
Switch from uglify-es to terser as default minimizer 官方解释如下
For webpack to use the new terser-webpack-plugin instead of uglifyjs-webpack-plugin.
optimization
官方移除了commonchunk
插件,改用了optimization
属性进行更加灵活的配置,这也应该是从以前的版本升级到webpack 4.x
的代码修改过程中最为复杂的一部分,
optimization
是webpack
的核心,处理如何压缩代码,如何提取公共代码,如何混淆等待等.
简易配置方法如下
// webpack.config.js
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
//...
optimization: {
minimizer: [
new TerserPlugin({
cache: true,
parallel: true
})
]
}
};
optimization.splitChunks
SplitChunks
是由webpack 4.x
内置的SplitChunksPlugin
插件提供,可直接在optimization
选项中配置,其默认配置如下
module.exports = {
//...
optimization: {
splitChunks: {
chunks: 'async',
minSize: 30000,
maxSize: 0,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
}
}
};
- chunks:表示从哪些chunks里面抽取代码,除了三个可选字符串值 initial、async、all 之外,还可以通过函数来过滤所需的 chunks;
- minSize:表示抽取出来的文件在压缩前的最小大小,默认为 30000;
- maxSize:表示抽取出来的文件在压缩前的最大大小,默认为 0,表示不限制最大大小;
- minChunks:表示被引用次数,默认为1;
- maxAsyncRequests:最大的按需(异步)加载次数,默认为 5;
- maxInitialRequests:最大的初始化加载次数,默认为 3;
- automaticNameDelimiter:抽取出来的文件的自动生成名字的分割符,默认为 ~;
- name:抽取出来文件的名字,默认为 true,表示自动生成文件名;
- cacheGroups: 缓存组。(这才是配置的关键)
关于optimization.splitChunks.cacheGroups
cacheGroups
可以继承/覆盖splitChunks
中所有的参数值,除此之外还额外提供了三个配置: test/priority/reuseExistingChunk
- test: 表示要过滤 modules,默认为所有的 modules,可匹配模块路径或 chunk 名字,当匹配的是 chunk 名字的时候,其里面的所有 modules 都会选中
- priority:表示抽取权重,数字越大表示优先级越高。因为一个 module 可能会满足多个 cacheGroups 的条件,那么抽取到哪个就由权重最高的说了算
- reuseExistingChunk:表示是否使用已有的 chunk,如果为 true 则表示如果当前的 chunk 包含的模块已经被抽取出去了,那么将不会重新生成新的
webpack dll
构建前端项目的时候, 往往希望第三方库(vendors
)和自己写的代码可以分开打包.因为第三方库往往不需要经常打包更新
HZERO前端工程架构现已采用webpack dll
模式
关于
webpack dll
请参考: https://webpack.js.org/plugins/dll-plugin/#usage
简单使用方法
-
使用如下命令构建
dll
相关静态资源$ webpack --progress --config config/webpack.dll.config.js
-
使用
webpack.DllReferencePluginc
插件引入生成的manifest.json
文件 -
使用
add-asset-html-webpack-plugin
插件将dll
文件载入html标签中