webpack --profile --json > stats.json
--profile
:记录构建中的耗时信息--json
:以json格式输出构建结果,最后只输出一个json文件(包含所有的构建信息)web可视化查看构建分析:得到了webpack构建信息文件stats.json,如何进行很好的可视化查看?
webpack-bundle-analyzer
工具npm i -g webpack-bundle-analyzer
,生成stats.json后直接在其文件夹目录执行webpack-bundle-analyzer
后,浏览器会打开对应网页并展示构建分析webpack-bundle-analyzer stats.json -p 8888
文档地址webpack-bundle-analyzernpm i -D webpack-jarvis
webpack.config.js
配置:const Jarvis = require("webpack-jarvis");
plugins: [
new Jarvis({
watchOnly: false,
port: 3001 // optional: set a port
})
];
Time: 11593ms
(作为优化时间对比)对于导入语句Webpack会做出以下操作:
优化Loader配置
{
test: /\.js$/,
use: [
'babel-loader?cacheDirectory',//开启转换结果缓存
],
include: path.resolve(__dirname, 'src'),//只对src目录中文件采用babel-loader
exclude: path.resolve(__dirname,' ./node_modules'),//排除node_modules目录下的文件
},
优化resolve.modules配置
resolve.modules
用于配置webpack去哪些目录下寻找第三方模块,默认是['node_modules']
,但是,它会先去当前目录的./node_modules
查找,没有的话再去../node_modules
最后到根目录;resolve: {
modules: [path.resolve(__dirname, 'node_modules')],
}
优化resolve.extensions配置
resolve.extensions
用于配置尝试后缀列表;默认为extensions:['js','json']
;require('./data')
时webpack会先尝试寻找data.js
,没有再去找data.json
;如果列表越长,或者正确的后缀越往后,尝试的次数就会越多;所以在配置时为提升构建优化需遵守:
jsx
较多,所以配置extensions: [".jsx",".js"],
Time: 10654ms
;配置前为Time: 11593ms
接入需要完成的事:
接入工具(webpack已内置)
DllPlugin
插件打包好的动态链接库文件const path = require('path');
const DllPlugin = require('webpack/lib/DllPlugin');
module.exports = {
mode: 'production',
entry: {
// 将React相关模块放入一个动态链接库
react: ['react','react-dom','react-router-dom','react-loadable'],
librarys: ['wangeditor'],
utils: ['axios','js-cookie']
},
output: {
filename: '[name]-dll.js',
path: path.resolve(__dirname, 'dll'),
// 存放动态链接库的全局变量名,加上_dll_防止全局变量冲突
library: '_dll_[name]'
},
// 动态链接库的全局变量名称,需要可output.library中保持一致,也是输出的manifest.json文件中name的字段值
// 如react.manifest.json字段中存在"name":"_dll_react"
plugins: [
new DllPlugin({
name: '_dll_[name]',
path: path.join(__dirname, 'dll', '[name].manifest.json')
})
]
}
const DllReferencePlugin = require('webpack/lib/DllReferencePlugin');
...
plugins: [
// 告诉webpack使用了哪些动态链接库
new DllReferencePlugin({
manifest: require('./dll/react.manifest.json')
}),
new DllReferencePlugin({
manifest: require('./dll/librarys.manifest.json')
}),
new DllReferencePlugin({
manifest: require('./dll/utils.manifest.json')
}),
]
webpack_dll.config.js
文件中,DllPlugin
中的name参数必须和output.library
中的一致;因为DllPlugin
的name参数影响输出的manifest.json的name;而webpack.pro.config.js中的DllReferencePlugin
会读取manifest.json
的name,将值作为从全局变量中获取动态链接库内容时的全局变量名执行构建
webpack --progress --colors --config ./webpack.dll.config.js
webpack --progress --colors --config ./webpack.prod.js
["11593ms","10654ms","8334ms"]
接入HappyPack
npm i -D happypack
rules
部分,将loader
交给happypack
来分配:const HappyPack = require('happypack');
const happyThreadPool = HappyPack.ThreadPool({size: 5}); //构建共享进程池,包含5个进程
...
plugins: [
// happypack并行处理
new HappyPack({
// 用唯一ID来代表当前HappyPack是用来处理一类特定文件的,与rules中的use对应
id: 'babel',
loaders: ['babel-loader?cacheDirectory'],//默认设置loader处理
threadPool: happyThreadPool,//使用共享池处理
}),
new HappyPack({
// 用唯一ID来代表当前HappyPack是用来处理一类特定文件的,与rules中的use对应
id: 'css',
loaders: [
'css-loader',
'postcss-loader',
'sass-loader'],
threadPool: happyThreadPool
})
],
module: {
rules: [
{
test: /\.(js|jsx)$/,
use: ['happypack/loader?id=babel'],
exclude: path.resolve(__dirname,' ./node_modules'),
},
{
test: /\.(scss|css)$/,
//使用的mini-css-extract-plugin提取css此处,如果放在上面会出错
use: [MiniCssExtractPlugin.loader,'happypack/loader?id=css'],
include:[
path.resolve(__dirname,'src'),
path.join(__dirname, './node_modules/antd')
]
},
}
参数:
threads
:代表开启几个子进程去处理这一类文件,默认是3个;verbose
:是否运行HappyPack输出日志,默认true;代码压缩用ParallelUglifyPlugin代替自带的 UglifyJsPlugin插件
配置参数:
uglifyJS: {}
:用于压缩 ES5 代码时的配置,Object 类型test: /.js$/g
:使用正则去匹配哪些文件需要被 ParallelUglifyPlugin 压缩,默认是 /.js$/include: []
:使用正则去包含被压缩的文件,默认为 [].exclude: []
: 使用正则去包含不被压缩的文件,默认为 []cacheDir: ''
:缓存压缩后的结果,下次遇到一样的输入时直接从缓存中获取压缩后的结果并返回,默认不会缓存,开启缓存设置一个目录路径workerCount: ''
:开启几个子进程去并发的执行压缩。默认是当前运行电脑的 CPU 核数减去1sourceMap: false
:是否为压缩后的代码生成对应的Source Map, 默认不生成...
minimizer: [
// webpack:production模式默认有配有js压缩,但是如果这里设置了css压缩,js压缩也要重新设置,因为使用minimizer会自动取消webpack的默认配置
new optimizeCssPlugin({
assetNameRegExp: /\.css$/g,
cssProcessor: require('cssnano'),
cssProcessorOptions: { discardComments: { removeAll: true } },
canPrint: true
}),
new ParallelUglifyPlugin({
cacheDir: '.cache/',
uglifyJS:{
output: {
// 是否输出可读性较强的代码,即会保留空格和制表符,默认为输出,为了达到更好的压缩效果,可以设置为false
beautify: false,
//是否保留代码中的注释,默认为保留,为了达到更好的压缩效果,可以设置为false
comments: false
},
compress: {
//是否在UglifyJS删除没有用到的代码时输出警告信息,默认为输出
warnings: false,
//是否删除代码中所有的console语句,默认为不删除,开启后,会删除所有的console语句
drop_console: true,
//是否内嵌虽然已经定义了,但是只用到一次的变量,比如将 var x = 1; y = x, 转换成 y = 1, 默认为否
collapse_vars: true,
}
}
}),
]
["11593ms","10654ms","8334ms","7734ms"]
12000ms
降到现在的8000ms
“积跬步、行千里”—— 持续更新中~,喜欢的话留下个赞和关注哦!
往期经典好文:
原文https://segmentfault.com/a/1190000018493260