Webpack构建优化

352 阅读2分钟

区分开发环境和生产环境

  • 开发环境不需要去压缩代码
  • 指定调试模式devtool模式

压缩代码用ParalleUglifyPlugin代替自带的UglifyJsPlugin插件

自带的js压缩插件是单线程执行的,而webpack-parallel-uglify-plugin可以并行的执行 开发环境不做无意义的操作

很多配置,在开发阶段是不需要去做的,我们可以区分出开发和线上的两套配置,这样在需要上线的时候再全量编译即可,比如代码压缩,目录内容清理,计算文件hash,提取css文件等

babel-loader开启缓存

babel-loader在执行的时候,可能会产生一些运行期间重复的公共文件,造成代码体积大多余,同时也会减慢编译效率

可以加上cacheDirectory参数或使用transform-runtime插件试试

// webpack.config.js
use: [{
    loader: 'babel-loader',
    options: {
        cacheDirectory: true
    }]


// .bablerc
{
    "presets": [
        "env",
        "react"
    ],
    "plugins": ["transform-runtime"]
    
}

使用happypack来加速构建

	happypack会采用多进程去打包构建

优化构建时的搜索路径alias

使用noParse

webpack打包的时候,有时不需要解析某些模块的加载(这些模块并没有依赖,或者并根本没有模块化),我们可以直接加上这个参数,直接跳过这种解析

module:{
noParse: /node_modules\/(jquery.js)
}

启用DllPlugin和DllReferencePlugin预编译库文件

这是最复杂也是提升效果最明显的一步,原理是将第三方库文件单独打包一次,以后的编译都不需要在编译打包第三方库

拷贝静态资源文件,引入DllPlugin和DllReferencePlugin来提前构建一些第三方库,来优化Webpack阿宝。

而在生产环境时,就需要将提前构建好的包同步到dist中

对于commonChunkPlugin,webpack每次打包实际还是需要去处理这些第三方库,只是打包完之后,能把第三方库和我们自己的代码分开。 而DllPlugin则是能把第三方代码完全分离开,即每次只打包项目自身的代码。 在build/文件夹下新建webpack.dll.config.js文件,复制一下代码:

	const path = require("path")
	const webpack = require("webpack")
	
	module.exports = {
	    // 你想要打包的模块的数组
	    entry: {
	        vendor: ['vue/dist/vue.esm.js', 'axios', 'vue-router', 'vuex']
	    },
	    output: {
	        path: path.join(__dirname, '../static/js'), // 打包后文件输出的位置
	        filename: '[name].dll.js',
	        library: '[name]_library'
	    },
	    plugins: [
	        new webpack.DllPlugin({
	            path: path.join(__dirname, '.', '[name]-manifest.json'),
	            name: '[name]_library',
	            context: __dirname
	        }),
	        // 压缩打包的文件
	        new webpack.optimize.UglifyJsPlugin({
	            compress: {
	                warnings: false
	            }
	        })
	    ]
	}

build/webpack.dev.config.jsbuild/webpack.prod.config.js中添加plugins

	new webpack.DllReferencePlugin({
	      context: __dirname,
	      manifest: require('./vendor-manifest.json')
	}),

根目录下的index.html下引入预编译的库

 	<script src="./static/js/vendor.dll.js"></script>

package.json/scripts下中添加dll命令

"dll": "webpack --config ./build/webpack.dll.config.js"

运行:

npm run dll

然后再

npm run dev或npm run build

提取公共代码 使用CommonsChunkplugin提取公共的模块,可以减少文件体积,也有助于浏览器层的文件缓存

npm run dll
npm run dev 或npm run build

参考地址:

www.cnblogs.com/imwtr/p/7801973.html

jeffjade.com/2017/08/12/…