天天看点

性能优化-dll打包优化

目录结构:

性能优化-dll打包优化

 配置splitChunks的时候,将所有的第三方库都打包到一个chunk模块中了,这样有一个问题,每一次重新编译的时候都会进行一次打包,这样如果我们引入的库特别的多,每一次打包的代价会特别大

a.js文件和b.js文件内容:

import { $ } from "jquery"
console.log(vue)
console.log($)      

dll的优化作用是为了提取出第三方库,目的是webpack进行打包的时候不会将这些库打包进去,如果需要提取,就需要配置这个打包第三方库的文件

webpack.dll.config.js文件的作用就是为了打包第三方库使用的配置,

dll的核心思想就是一劳永逸,只需要初始化的时候,进行一次打包即可, 后面我们开发编辑的代码一定不会在第三方库当做修改

我们看打包之前的文件大小

性能优化-dll打包优化

 打包的大小是810kb,也就是a.js文件和b.js文件都将jquery引入了一遍

webpack.dll.config.js文件:

const { resolve } = require("path")
const webpack = require("webpack");
module.exports = {
  // 入口文件,入口文件必须是数组
  // 将node_modules中的jquery和vue提取出来
  entry: {
    libs: ["jquery"],
  },
  // 出口文件
  output: {
    // 出口文件名
    filename: "[name].js",
    // 出口文件的路径
    path: resolve(__dirname, 'dll'),
    // 暴露的变量添加一个hash值
    library: "[name]_[hash]"
  },
  plugins: [
    new webpack.DllPlugin({
      // 映射的目标文件名
      name: "[name_hash]",
      // 映射的文件路径
      path: resolve(__dirname, 'dll/manifest.json')
    })
  ]
}      

这个文件的作用是将 jquery打包为一个名为 Dll.js 的静态资源包,同时生成一个 manifest.json 文件方便对 Dll.js 中的模块进行引用。

要注意的是,执行 webpack 命令是默认执行该目录下名为 webpack.config.js 或者 webpackfile.js 的文件。所以需要通过 --config 指令手动指定该文件,

webpack --config webpack.dll.config.js      
性能优化-dll打包优化

在 webpack.config.js 中添加引用。在 plugins 属性中添加 DllReferencePlugin 插件,并指明 manifest.json 文件的引用路径。

new webpack.DllReferencePlugin({
      context: __dirname,
      manifest: require('./dist/manifest.json')
  })      

然后再进行打包

性能优化-dll打包优化
性能优化-dll打包优化

 此时打包的大小只有1.6kb

 但是我们打开浏览器会发现此时报错

性能优化-dll打包优化

 因为webpack只配置忽略不打包这些文件,但是文件引入找不到地址

需要告诉webpack中的html模板文件如何引入文件

安装插件

npm install add-assets-html-webpack-plugin -D      
plugins: [
    // html文件
    new HtmlWebpackPlugin({
      // 模板路径
      template: "./src/index.html",
    }),
    new webpack.DllReferencePlugin({
      context: __dirname,
      manifest: require('./dist/manifest.json')
  }),
   // 会自动将指定目录下的文件复制一份到打包后文件目录下,html文件会自动添加src
   new AddAssetsHtmlWebpackPlugin({
    filepath: resolve(__dirname, 'dll/libs.js')
  })
  ],