美文网首页
webpack4 优化系列

webpack4 优化系列

作者: _littleTank_ | 来源:发表于2019-09-26 13:17 被阅读0次

1、noParse

noParse 配置项可以让 Webpack 忽略对部分没采用模块化的文件的递归解析和处理,这样做的好处是能提高构建性能。 我们对类似jq这类依赖库,一般会认为不会引用其他的包(特殊除外,自行判断)。所以,对于这类不引用其他的包的库,我们在打包的时候就没有必要去解析,这样能够增加打包速率。

noParse 是可选配置项,类型需要是 RegExp、[RegExp]、function 其中一个。例如想要忽略掉 jQuery 、ChartJS,可以使用如下代码:

module:{
    // 使用正则表达式
      noParse: /jquery|chartjs/
      // 使用函数,从 Webpack 3.0.0 开始支持
      noParse: (content)=> {
          // content 代表一个模块的文件路径
          // 返回 true or false
          return /jquery|chartjs/.test(content);
      }
}

2、HappyPack

基本原理: HappyPack 允许 Webpack 使用 Node 多线程进行构建来提升构建的速度。

安装 HappyPack

npm i -D happypack

webpack.config.js配置文件

const HappyPack = require('happypack');
const os = require('os');
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        //把对.js 的文件处理交给id为happyBabel 的HappyPack 的实例执行
         use: ['happypack/loader?id=happyBabel'],//这里的id=happyBabel要跟下边的对应
        //use: ['babel-loader'],
        //排除node_modules 目录下的文件
        exclude: /node_modules/
      },
    ]
  },
plugins: [
    new HappyPack({
        //用id来标识 happypack处理那里类文件
      id: 'happyBabel',//这个id值要跟上面对应
      //如何处理  用法和loader 的配置一样
      loaders: ['babel-loader?cacheDirectory=true'],
     // loaders: [{
     //   loader: 'babel-loader?cacheDirectory=true',
   //   }],
      //共享进程池
      threadPool: happyThreadPool,
      //允许 HappyPack 输出日志
      verbose: true,
    })
  ]
}

这里需要注意HappyPack 对大项目能缩短打包时间,对小项目可能还会增加打包时间,注意取舍。

3、DllPlugin

webpack dllplugin的配置其实就是用于生成动态链接库。
创建一个打包配置文件webpack.config.dll.js

const path = require('path');
const webpack = require('webpack');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
function resolve (dir) {
    return path.join(__dirname,'..' ,dir)
}
module.exports = {
    entry: {
        vueAll: ['vue','vue-router','axios','vuex']
    },
    output: {
        path: resolve('public'),
        filename: 'dll_[name].js',
        library: 'dll_[name]_[hash]'
    },
    devtool: false,
    plugins: [
        new CleanWebpackPlugin({}),//清楚打包
        new webpack.DllPlugin({
            // manifest文件中的name属性值, 需与output.library保持一致
            name: 'dll_[name]_[hash]',
            // mainfest文件输出路径和文件名称
            path: path.resolve(__dirname, "[name]-manifest.json")
        }),
        new UglifyJsPlugin({//压缩功能
            uglifyOptions: {
                warnings: false,
                drop_debugger: true,
                drop_console: true
            },
            // sourceMap: config.build.productionSourceMap,
            sourceMap: false,
            parallel: true
        })
    ]
}

我们执行上面的文件

"build:dll": "webpack --config build/webpack.config.dll.js" //根据自己的配置写

这样就会打包出一个dll_vueAll.js(是'vue','vue-router','axios','vuex'的包)和vueAll-manifest.json(是对应关系)的文件。

既然这里我们已经把'vue','vue-router','axios','vuex'打包好了,那么其他地方打包就应该把这几个文件排除。这样就需要webpack.DllReferencePlugin

plugins: [
    new webpack.DllReferencePlugin({
      manifest: require('./vueAll-manifest.json'),//这里路径根据自己文件目录书写,文件名就是上步打包出来的
    })
]

这样配置后打包时候就会把'vue','vue-router','axios','vuex'排除在外。在此还需要把已经打包好的dll_vueAll.js引入到模板文件index.html里。可以手动添加,但是太麻烦,我们用插件add-asset-html-webpack-plugin。
首先安装,然后配置

plugins: [
    new AddAssetHtmlPlugin({
        filepath: require.resolve('../public/dll_vueAll.js'),
        // 文件输出目录
        outputPath: 'dll',//根据自己情况填写
        publicPath: 'dll',//根据自己情况填写
        includeSourcemap: false  这个配置需要注意
    })

这样就会自动引入了。(需要注意new AddAssetHtmlPlugin需配置在new HtmlWebpackPlugin后边)

<body>
    <div id="app"></div>
    <script src="./dll/dll_vueAll.js"></script>
</body>

相关文章

网友评论

      本文标题:webpack4 优化系列

      本文链接:https://www.haomeiwen.com/subject/bcxyyctx.html