webpack优化

2019-03-03  本文已影响0人  fuheideMayuyu

1.配置resolve提高文件查找效率

resolve:{
      extensions: ['.wasm', '.mjs', '.js', '.json'], //引入模块时可以不加扩展名
      alias:{
        '@': path.resolve('src'),
        'test1':path.resolve('src/page/pageView/test.js'),
      }
    },

2.不解析的模块

module:{
        noParse:/jquery/, //不去解析jquery
        rules:[
            //...
        ]
    },

3.dell-plugin将一些不做修改的依赖文件,提前打包。这样我们开发代码发布的时候就不需要再对这部分代码进行打包。从而节省了打包时间。

DllPlugin插件: 用于打包出一个个动态连接库
DllReferencePlugin: 在配置文件中引入DllPlugin插件打包好的动态连接库
创建一个webpack.dll.config.js文件

var path = require("path");
var webpack = require("webpack");

module.exports = {
  // 要打包的模块的数组
  entry: {
    vendor: ['vue/dist/vue.esm.js','vue-router']
  },
  output: {
    path: path.join(__dirname, '../static/js'), // 打包后文件输出的位置
    filename: '[name].dll.js',// vendor.dll.js中暴露出的全局变量名。
    library: '[name]_library' // 与webpack.DllPlugin中的`name: '[name]_library',`保持一致。
  },
  plugins: [
    new webpack.DllPlugin({
      path: path.join(__dirname, '.', '[name]-manifest.json'),
      name: '[name]_library', 
      context: __dirname
    }),
  ]
};

在package.json的scripts里加上:

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

运行npm run dll 在static/js下生成vendor-manifest.json;
在build/webpack.base.conf.js里加上:

// 添加DllReferencePlugin插件
  plugins: [
    new webpack.DllReferencePlugin({
      context: __dirname,
      manifest: require('./vendor-manifest.json')
    })
  ],

然后在index.html中引入vendor.dll.js:

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

4.提取公共css和js

5.去除未使用的css和js

webpack --display-used-exports --optimize-minimiz

6.* happypack 就能让Webpack把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。

npm i happypack@next -D
const HappyPack = require('happypack');
    rules: [
    {
        test: /\.js$/,
        // 把对 .js 文件的处理转交给 id 为 babel 的 HappyPack 实例
        use: ['happypack/loader?id=babel'],
        exclude: path.resolve(__dirname, 'node_modules'),
    },
    {
        test: /\.css$/,
        // 把对 .css 文件的处理转交给 id 为 css 的 HappyPack 实例
        use: ['happypack/loader?id=css']
    }
]


new Happypack({
            //ID是标识符的意思,ID用来代理当前的happypack是用来处理一类特定的文件的
            id: 'js',
            use: [{
                loader: 'babel-loader',
                //options=query都是向插件传递参数的
                options: {
                    presets: [["@babel/preset-env", { modules: false }], "@babel/preset-react"],
                    plugins: [
                        ["@babel/plugin-proposal-decorators", { "legacy": true }],
                        ["@babel/plugin-proposal-class-properties", { "loose": true }],
                    ]
                }
            }]
        }),
        new Happypack({
            //ID是标识符的意思,ID用来代理当前的happypack是用来处理一类特定的文件的
            id: 'css',
            use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader'],
            threads: 4,//你要开启多少个子进程去处理这一类型的文件
            verbose: true//是否要输出详细的日志 verbose
        })

7.css和js压缩,webpack-parallel-uglify-plugin 插件可以使用多继承来压缩js

npm i -D webpack-parallel-uglify-plugin
// 引入 ParallelUglifyPlugin 插件
const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin');

module.exports = {
  plugins: [
    // 使用 ParallelUglifyPlugin 并行压缩输出JS代码
    new ParallelUglifyPlugin({
      // 传递给 UglifyJS的参数如下:
      uglifyJS: {
        output: {
          /*
           是否输出可读性较强的代码,即会保留空格和制表符,默认为输出,为了达到更好的压缩效果,
           可以设置为false
          */
          beautify: false,
          /*
           是否保留代码中的注释,默认为保留,为了达到更好的压缩效果,可以设置为false
          */
          comments: false
        },
        compress: {
          /*
           是否在UglifyJS删除没有用到的代码时输出警告信息,默认为输出,可以设置为false关闭这些作用
           不大的警告
          */
          warnings: false,

          /*
           是否删除代码中所有的console语句,默认为不删除,开启后,会删除所有的console语句
          */
          drop_console: true,

          /*
           是否内嵌虽然已经定义了,但是只用到一次的变量,比如将 var x = 1; y = x, 转换成 y = 5, 默认为不
           转换,为了达到更好的压缩效果,可以设置为false
          */
          collapse_vars: true,

          /*
           是否提取出现了多次但是没有定义成变量去引用的静态值,比如将 x = 'xxx'; y = 'xxx'  转换成
           var a = 'xxxx'; x = a; y = a; 默认为不转换,为了达到更好的压缩效果,可以设置为false
          */
          reduce_vars: true
        }
      }
    }),
  ]
}

根据开发环境和生产环境配置不同的webpack.config.js ,基础配置文件(webpack.base.config.js),开发环境配置文件(webpack.dev.config.js),基础配置文件(webpack.prod.config.js),如然后使用(webpack.config.js)作为唯一入口文件根据环境变量来识别环境

webpack.config.js配置如下:

npm i webpack-merge -D
npm i cross-env -D
const path=require('path'); // 导入path模块
const webpack=require('webpack'); // 导入webpack模块
const base=require('/webpack.base.config.js'); // 导入基础配置模块
const merge = require('webpack-merge') // 合拼配置文件
const NODE_ENV = process.env.NODE_ENV; //获取package.json环境变量
const other
if(NODE_ENV == 'development'){
  other=require('/webpack.dev.config.js'); // 导入基础配置模块
} else{
  other=require('/webpack.prod.config.js'); // 导入基础配置模块
}
module.exports=merge(base,other)

package.json文件修改如下:

"build-production": "cross-env NODE_ENV=production && webpack --mode development",
 "build-development": "cross-env NODE_ENV=development && webpack --mode development",

8.接入CDN

    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: '[name]_[hash:8].js',
        publicPath: 'http://img.test.cn'
    },
上一篇下一篇

猜你喜欢

热点阅读