webpack打包性能优化

103 阅读1分钟

一、优化babel-loader

开启缓存

module:{
    rules:[{
      test:/\.js$/,
      use:['babel-loader?cacheDirectory'],//开启缓存
      include:path.resolve(__dirname,'src')
    }]
},

二、IgnorePlugin避免引入无用模块

直接不引入,代码中没有

举例: import moment from 'moment' 默认会引入所有语言js代码,代码过大 webpack.js

plugin:{
    new webpack.IgnorePlugin({ resourceRegExp:'/\.\/locale/', contextRegExp:'/moment/' })
},

index.js

import moment from 'moment'
import 'moment/locale/zh-cn' //手动引入中文语言包
moment.locale('zh-cn')

三、noParse避免重复打包

引入,但不打包

module:{
    noParse:[/react\.min\.js$/],
},

四、happyPack 多进程打包

项目较大,打包较慢,开启多进程能提高速度

项目较小,打包很快,开启多进程会降低速度(进程开销)

按需使用

module:{
    rules:[{
      test:/\.js$/,
      //把对.js文件的处理交给id为babel的 HappyPack实例
      use:['happypack/loader?id=babel'],
      include:path.resolve(__dirname,'src')
    }]
  },
  plugin:{
    //开启多进程打包
    new HappyPack({
      //用唯一的标识符id来代表当前的HappyPack是用来处理一类特定的文件
      id:'babel',
      //如何处理.js文件,用法和Loader配置中一样
      loaders:['babel-locader?cacheDirectory']
    })
  },

ParallelUglifyPlugin 多进程压缩JS

new ParallelUglifyPlugin({
      //传递给UglifyJS的参数
      //还是使用UglifyJS压缩,只不过帮助开启了多进程
      uglifyJS:{
        output:{
          beautify:false,//最紧凑的输出
          comments:false, //删除所有的注释
        },
        compress:{
          //删除所有的 console 语句,可以兼容ie浏览器
          drop_console:true,
          //内嵌定义了但是只用到一次的变量
          collapse_vars:true,
          //提取出 出现多次但是没有定义成变量去引用的静态值
          reduce_vars:true,
        }
      }
    })

五、DllPlugin动态链接库插件

提前打包vue、react这样的框架

webpack已内置,打包出dll文件

DllReferencePlugin 使用dll文件