美文网首页
webpack 性能优化

webpack 性能优化

作者: 弹力盒 | 来源:发表于2021-07-23 09:01 被阅读0次

1、提高 webpack 的打包速度

  • a、跟上技术的迭代,更新 node、npm、yarn 等
  • b、在尽可能少的模块上应用到 loader,减少 loader 的作用范围
rules: [
  {
    test: /\.js$/,
    /**
     * 减少该 loader 的作用范围
     * exclude 规定 webpack 打包时跳过该路径
     * 提高打包速度
     * 
     * include 规定 webpack 打包时只打包该路径
     */
    // exclude: /node_modules/,
    include: path.resolve(__dirname, '../src'),
    loader: "babel-loader"
  }
]
  • c、plugins 尽量简洁并保证可靠(如开发环境不需要使用各类文件压缩插件,生产环境则需要使用各类文件的压缩插件)
  • d、resolve 参数合理配置
resolve: {
  /**
   * 自动匹配 .js 结尾的文件
   * 不推荐配置太多个,一般配置 .js/.jsx/.vue 等业务文件即可
   * 不推荐配置图片/样式文件等
   */
  extensions: ['.js', '.css'],
  /**
   * 配置别名
   */
  alias: {
    '@': path.resolve(__dirname, '../src'),
    'assets': path.resolve(__dirname, '../src/assets')
  }
}
  • e、使用 DllPlugin 提高打包速度
    作用:只打包一次第三方模块(生成对应的文件),业务代码使用第三方模块时,要去使用 dll 文件方式引入
    具体步骤如下:
  • e-1 创建 webpack.dll.js 作为第三方插件打包一次的配置文件
const path = require('path')
const webpack = require('webpack')

module.exports = {
  mode: 'production',
  entry: {
    /**
     * 打包成一份最终文件
     */
    // vendors: [ 'jquery', 'lodash' ]
    /**
     * 打包成多份最终文件
     */
    jquery: ['jquery'],
    lodash: ['lodash']
  },
  output: {
    filename: '[name].dll.js',
    path: path.resolve(__dirname, '../dll'),
    library: '[name]'
  },
  plugins: [
    /**
     * 生成映射文件
     * 业务代码引用第三方模块时,通过 manifest.json 文件来决定
     * 到底从哪里引入,dll 还是 node_modules
     */
    new webpack.DllPlugin({
      name: '[name]',
      path: path.resolve(__dirname, '../dll/[name].manifest.json')
    })
  ]
}
  • e-2 配置 package.json 的启动指令
{
  "scripts": {
    "build": "webpack --config ./build/webpack.config.js",
    "build:dll": "webpack --config ./build/webpack.dll.js"
  }
}
/* 运行指令,则会在根目录下打包生成 dll 文件夹 */
  • e-3 配置生产环境/开发环境,一般写在 common 文件中即可
const path = require('path')
const fs = require('fs')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const addAssetHtmlWebpackPlugin = require('add-asset-html-webpack-plugin')
const webpack = require('webpack')

/**
 * 动态添加 dll 插件配置
 */

const dllPluginConfig = []
// 读取 dll 文件夹所有的打包文件名称
const dllHasFiles = fs.readdirSync(path.resolve(__dirname, '../dll'))
dllHasFiles.forEach(fileName => {
  if (/.*\.dll.js$/.test(fileName)) {
    dllPluginConfig.push(
      new addAssetHtmlWebpackPlugin({
        filepath: path.resolve(__dirname, `../dll/${fileName}`)
      })
    )
  }
  if (/.*\.manifest.json$/.test(fileName)) {
    new webpack.DllReferencePlugin({
      manifest: path.resolve(__dirname, `../dll/${fileName}`)
    })
  }
})

module.exports = {
  /**
   * 打包模式配置
   * development 一般为开发环境,打包的代码不压缩
   * production 一般为生产环境,打包的代码会被压缩
   */
  mode: "development",
  /**
   * 入口文件配置
   * 当前为单入口文件配置
   */
  entry: path.resolve(__dirname, '../src/main.js'),
  /**
   * 打包文件输出配置
   */
  output: {
    // 打包文件的位置
    path: path.resolve(__dirname, '../dist'),
    /**
     * 打包文件的名称
     * [name] 对应入口文件的 key 值(entrt 为对象形式下),默认为 main
     * [hash] 当前打包的 hash 值
     * [ext] 文件的拓展名
     */
    filename: '[name].js'
  },
  resolve: {
    /**
     * 自动匹配 .js 结尾的文件
     * 不推荐配置太多个,一般配置 .js/.jsx/.vue 等业务文件即可
     * 不推荐配置图片/样式文件等
     */
    extensions: ['.js', '.css'],
    /**
     * 配置别名
     */
    alias: {
      '@': path.resolve(__dirname, '../src'),
      'assets': path.resolve(__dirname, '../src/assets')
    }
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        /**
         * 减少该 loader 的作用范围
         * exclude 规定 webpack 打包时跳过该路径
         * 提高打包速度
         * 
         * include 规定 webpack 打包时只打包该路径
         */
        // exclude: /node_modules/,
        include: path.resolve(__dirname, '../src'),
        loader: "babel-loader"
      }
    ]
  },
  /**
   * 打包时,使用到的插件
   */
  plugins: [
    /**
     * html-webpack-plugin
     * 打包时,没有配置模版时会自动生成一个 index.html 输出
     * 并自动绑定打包生成的其他静态文件
     */
    new HtmlWebpackPlugin({
      // 配置模版路径
      template: path.resolve(__dirname, '../public/index.html')
    }),
    /**
     * 避免引入多个 dll 文件时,编写太多的 new 插件
     */
    ...dllPluginConfig
  ]
}

重点在于动态添加 dll 插件配置到 dllPluginConfig 数组中
需要安装 add-asset-html-webpack-plugin 将生成的 dll 目录的所有 dll.js 文件挂载到 index.html 文件

cnpm i add-asset-html-webpack-plugin -D
  • f、控制打包文件的大小
    如 tree-shaking 等

  • g、合理使用 suorceMap
    在 devtool 中配置

相关文章

网友评论

      本文标题:webpack 性能优化

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