webpack打包过后文件太大的那些事

问题

用ReactJs+Redux+Webpack开发已经有一年多了,因为项目基本上是在内网访问的,所以也就没有怎么去注意打包后生成文件的大小了。现在,项目在外网的情况收到的反馈是加载速度慢,发现一个bundle已经有好几M了,这是不可忍受的~!也就有了去优化打包的想法。

优化

合并公共代码

将一些公共的代码和共同引用的第三方类库单独打包,同时将reactJs相关的类库单独打包。
如:

entry: {
        index: [
            './src/index.js'
        ],
        antd: ['antd'],
        react: ['react', 'react-dom', 'react-redux', 'react-router', 'redux', 'redux-router', 'redux-thunk'],
        vendors: ['crypto-js', 'history', 'isomorphic-fetch', 'jquery', 'lodash']
    },

以上将antd、react以及一些工具类分别单独打包出来。具体的使用可以参考:

devtool 中的 source-map

source-map在调试的时候非常好用。但是在生产环境下应该关闭它,设置为:devtool: false

这些source-map有哪些区别呢?可以参考:webpack sourcemap 选项多种模式的一些解释

使用UglifyJsPlugin压缩文件

使用UglifyJsPlugin压缩文件,并且去掉注释。可以让打包后的文件大小少了很多。

new webpack.optimize.UglifyJsPlugin({
            comments: false,        //去掉注释
            compress: {
                warnings: false    //忽略警告,要不然会有一大堆的黄色字体出现……
            }
        }),

分离CSS样式

分离CSS样式原先就这么做了,这里还是再拿出来讲一下。

new ExtractTextPlugin('index_[contenthash].css', {
    allChunks: true
}),

使用DedupePlugin

使用DedupePlugin插件可以找到Js的依赖树,并且删除这些重复的依赖

开启gzip压缩

经过以上的步骤以后打包出来的文件已经小了很多了,但还是不太满意。通过使用gzip压缩可以进一步减少文件的大小,就是有个缺点是打包的时候会慢一些。

new CompressionWebpackPlugin({ //gzip 压缩
    asset: '[path].gz[query]',
    algorithm: 'gzip',
    test: new RegExp(
        '\\.(js|css)$'    //压缩 js 与 css
    ),
    threshold: 10240,
    minRatio: 0.8
})

HtmlWebpackPlugin中的设置

设置minify属性的值:

new HtmlWebpackPlugin({
    title: '项目官网 3.0',
    template: 'index-template.html',
    inject: 'body',
    minify: {
        removeComments: true,        //去注释
        collapseWhitespace: true,    //压缩空格
        removeAttributeQuotes: true  //去除属性引用
    }
}),

还可以再次进行的优化

完成以上的方法以后,打包文件已经小了很多了。但依旧还是存在优化的空间,比如说可以使用externals然后采用cdn加载react、antd等。


参考: