webpack提供了很多有用的原生插件
UglifyJsPlugin new webpack.optimize.UglifyJsPlugin([options])
解析/压缩/美化所有的js chunk,传入options可以满足更多的定制化需求sourceMap
生成SourceMap文件,会导致编译过程变慢,默认truetest/include/exclude
使用一个或多个正则表达式来过滤要处理的文件mangle
通过设置except数组来防止指定变量被改变
new webpack.optimize.UglifyJsPlugin({
mangle: {
except: ['$super', '$', 'exports', 'require']
}
})
ExtractTextPlugin var ExtractTextPlugin = require("extract-text-webpack-plugin");
该插件会提取entry chunk中所有的require('*.css')
,分离出独立的css文件。
new ExtractTextPlugin([id: string], filename: string, [options])
一个entry生成一个文件,当多个entry的时候,可以用[name]/[id]/[contenthash]
来生成多个文件id
插件实例的唯一标识,自动生成filename
输出的filename,可以通过[name]/[id]/[contenthash]
自定义filenameoptions.allChunks
提取所有的chunk(默认只提取initial chunk)options.disable
disable该插件
ExtractTextPlugin.extract([notExtractLoader], loader, [options])
该方法将已经存在的loader转换成一个提取loadernotExtractLoader
不提取css时需要使用的loaderloader
用来将资源文件转换为css输出模块的loaderoptions.publicPath
覆盖loader的publicPath
设置
let ExtractTextPlugin = require('extract-text-webpack-plugin');
// multiple extract instances
let extractCSS = new ExtractTextPlugin('stylesheets/[name].css');
let extractLESS = new ExtractTextPlugin('stylesheets/[name].less');
module.exports = {
...
module: {
loaders: [
{ test: /\.scss$/i, loader: extractCSS.extract(['css', 'sass']) },
{ test: /\.less$/i, loader: extractLESS.extract(['css', 'less']) },
...
]
},
plugins: [
extractCSS,
extractLESS
]
};
DedupePlugin new webpack.optimize.DedupePlugin()
有些JS库有自己的依赖树,并且这些库可能有交叉的依赖,DedupePlugin可以找出他们并删除重复的依赖。
NoErrorsPlugin new webpack.NoErrorsPlugin()
跳过编译时出错的代码并记录,使编译后运行时的包不会发生错误。
ProvidePlugin new webpack.ProvidePlugin(definitions)
definitions
定义标识符,当遇到指定标识符的时候,自动加载模块。
new webpack.ProvidePlugin({
$: "jquery"
})
// in a module
$("#item") // <= just works
// $ is automatically set to the exports of module "jquery"
CommonsChunkPlugin new webpack.optimize.CommonsChunkPlugin(options)
提取代码中的公共模块,然后将公共模块打包到一个独立的文件中,以便在其他的入口和模块中使用。别忘了在html中单独引入抽离出来的公共模块。
常见的使用场景:
-
抽离多个entry的公共模块
new CommonsChunkPlugin({ name: "commons", // (the commons chunk name) filename: "commons.js", // (the filename of the commons chunk) // minChunks: 3, // (Modules must be shared between 3 entries) // chunks: ["pageA", "pageB"], // (Only use these entries) })
-
抽离vendor模块
entry: { vendor: ["jquery", "other-lib"], app: "./entry" } new CommonsChunkPlugin({ name: "vendor", // filename: "vendor.js" // (Give the chunk a different name) minChunks: Infinity, // (with more entries, this ensures that no other module // goes into the vendor chunk) })
-
抽离子模块中的公共模块到父模块中,会增加首屏加载的时间
new CommonsChunkPlugin({ // names: ["app", "subPageA"] // (choose the chunks, or omit for all chunks) children: true, // (select all children of chosen chunks) // minChunks: 3, // (3 children must share the module before it's moved) })
-
和3类似,不过不是抽离到父模块,而且额外抽离出一个异步的公共模块
new CommonsChunkPlugin({ // names: ["app", "subPageA"] // (choose the chunks, or omit for all chunks) children: true, // (use all children of the chunk) async: true, // (create an async commons chunk) // minChunks: 3, // (3 children must share the module before it's separated) })