目录
插件
* 为webpack自带插件
插件
定义全局变量*
热加载*
热替换显示替换包名*
html模版
不打断进程*
限制包数量*
分块打包*
压缩js*
分离css
优化压缩css
更多
loader
Plugins
除以下插件外可以看看性能分析插件, 压缩图片插件, 离线应用插件
DefinePlugin
本插件用于定义一些全局变量或者一些全局代码片段,这个插件是webpack自带的
例如,我们希望一些代码只有在开发环境或线上环境出现,可以通过一些全局变量来实现,在代码压缩后甚至可以增加或删除这一部分代码
// config.js
var env = process.argv[2] === 'test' ? 'test' : 'prod'
{
// ...
plugins: [
new webpack.DefinePlugin({
ENV: `'${env}'`
})
]
}
// app.js
if (ENV === 'test') {
console.log(ENV)
}
if (ENV === 'prod') {
console.log(123)
}
// bundle.js
if (true) {
console.log('test')
}
if (false) {
console.log(123)
}
// bundle.min.js
console.log('test')
注:
- 值会被当作字符串传入,如
ENV: 'test'
,那么全局变量是一个变量名test
而不是test字符串
,因此需要两层引号,也可以使用JSON.stringify('test')
实现 - 可以传入一个函数甚至对象
{
// ...
plugins: [
new webpack.DefinePlugin({
IIFE: function () {console.log(1)}
})
]
}
// app.js
console.log(IIFE)
// bundle.js
console.log(function () {console.log(1)})
HotModuleReplacementPlugin
这个插件表示使用热加载,目前虽然有一些配置项,但可能会变化,所以直接用就好,嗯,也是webpack自带的,别忘了dev用就好
new webpack.HotModuleReplacementPlugin()
HtmlWebpackPlugin
这个插件为我们提供html模版,供
webpack
使用,npm
包html-webpack-plugin
我们希望webpack打包完成后自动将打包完成的页面注入到入口html中,这就是这个插件能为我们做的事情之一,当然这是一个第三方插件
我们可以不需要在根目录中写一个html,完全使用本插件完成简单html的生成,当然建议还是提供一个模版,来注入包即可
除此之外甚至还可以压缩代码,添加额外的chunk,chunks排序等
doc
// options
{
filename: 'index.html', // path.join(__dirname, '../dist/index.html')
template: path.join(__dirname, '../index.html'),
inject: true, // true 'head' 'body'
chunksSortMode: 'dependency'
}
LimitChunkCountPlugin
按需加载在一定程度上可以优化代码,但如果过多的按需加载或者说粒度过小的按需加载会导致一个问题,分离包太小,一个额外http请求的开销甚至比不分离这个包的开销大,那么有必要限制每个包的大小
本插件配置也很简单
在合并 chunk 时,webpack 会尝试识别出具有重复模块的 chunk,并优先进行合并。任何模块都不会被合并到 entry chunk 中,以免影响初始页面加载时间
{
// ...
plugins: [
new webpack.optimize.LimitChunksCountPlugin({
maxChunks: 5,
minChunkSize: 100
})
]
}
CommonsChunkPlugin
分模块打包的好处是一次加载多次使用,方式是将业务代码与依赖代码分开,通过
manifest
管理。然而绝大部分场景却变成了将业务代码与依赖分开 个人认为应该将公用的第三方库代码打完并缓存到用户端本地,manifest
及业务代码每次请求新的,或者打四个包commonVendor
vendor
manifest
app
如何实现(将依赖与业务代码分开)
{
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks (module, counts) { // module {context, resource}
return (
module.resource && /\.js$/.test(module.resource) &&
module.resource.indexOf('node_modules') > -1)
}
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
minChunks: Infinity
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'app', // 对应入口名entry: {app: './src/index.js'}
async: 'vendor-async',
minChunks: 3,
children: true
})
]
}
关于按需加载,默认会根据其顺序下标作为name
var Test = () => import(/* webpackChunkName: "xx" */'vue')
NoEmitOnErrorsPlugin
如果使用cli启动webpack会存在一个问题,当编译错误会使得webpack退出进程,使用此插件可以保持webpack不主动退出
new webpack.NoEmitOnErrorsPlugin()
NamedModulesPlugin
我们有时候并不满足于热替换,还希望热替换时能显示替换了什么
new webpack.NamedModulesPlugin()
UglifyJsPlugin
压缩js使用,但是对于es6+的代码treesharking支持并不好(不代表不支持)
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
},
sourceMap: true,
parallel: true
})
ExtractTextPlugin
将
css
放置在js
中最大的坏处是js
加载完后css
才能被加载,这也就意味着要么将js
放置在head
中阻塞dom
加载要么把css
分离出来 这个插件就会将chunk
中依赖的css
文件单独拎出来。npm
包extract-text-webpack-plugin
但是如果是异步加载的chunk
呢?嗯,这个插件很笨,默认allChunks
为true
意味着所有css
都会被提起出来,因此设置为false
即可
此外还需要用此插件在cssLoader
里做一下手脚,它才知道哪些是需要被提取出来的
module: {
rules: [
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: "css-loader"
})
}
]
},
plugins: [
new ExtractTextPlugin({
filename: 'css/[name][contenthash].css',
allChunks: false
}),
]
OptimizeCSSPlugin
优化压缩css,
npm
包optimize-css-assets-webpack-plugin
,其实这个插件不仅可以压缩css还可以添加sourcemap
,去除注释等 需要配合ExtractTextPlugin
使用
{
plugins: [
new OptimizeCSSPlugin({
cssProcessorOptions: {
discardComments: {removeAll: true},
safe: true,
map: {inline: false}
}
})
]
}