先说结论


结论就是在webpack5不在建议启用Dll,它 带来的性能提升微乎其微

基础概念

所谓动态链接,就是把一些经常会共享的代码制作成 DLL 档,当可执行文件调用到 DLL 档内的函数时,Windows 操作系统才会把 DLL 档加载存储器内,DLL 档本身的结构就是可执行档,当程序有需求时函数才进行链接。透过动态链接方式,存储器浪费的情形将可大幅降低。

就是事先把常用但又构建时间长的代码提前打包好(例如 react、react-dom),取个名字叫 dll。后面再打包的时候就跳过原来的未打包代码,直接用 dll。这样一来,构建时间就会缩短,提高 webpack 打包速度

三种方式

DllPlugin & DllReferencePlugin


1. DllPlugin 首先构建模块

在packages中新建指令dll

  1. "scripts": {
  2. "dll": "webpack"
  3. },

然后通过webpack将不常用到的资源打包到一起

webpack.config.js

  1. const path = require('path')
  2. const webpack = require('webpack')
  3. const TerserPlugin = require('terser-webpack-plugin')
  4. module.exports = {
  5. mode: "production",
  6. entry: {
  7. react: ['react', 'react-dom']
  8. },
  9. output: {
  10. path: path.resolve(__dirname, 'dll'),
  11. filename: 'dll_[name].js',
  12. library: 'dll_[name]'
  13. },
  14. optimization: {
  15. minimizer: [
  16. new TerserPlugin({
  17. extractComments: false
  18. }),
  19. ],
  20. },
  21. plugins: [
  22. new webpack.DllPlugin({
  23. name: 'dll_[name]',
  24. path: path.resolve(__dirname, './dll/[name].manifest.json')
  25. })
  26. ]
  27. }

2.链接 dll 文件

webpack.config.js
DllReferencePlugin 是找到这个manifest
AddAssetHtmlPlugin 是添加这个资源到html

  1. const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin')
  2. const webpack = require('webpack')
  3. plugins: [
  4. new webpack.DllReferencePlugin({
  5. context: resolveApp('./'),
  6. manifest: resolveApp('./dll/react.manifest.json')
  7. }),
  8. new AddAssetHtmlPlugin({
  9. outputPath: 'js',
  10. filepath: resolveApp('./dll/dll_react.js')
  11. })
  12. ]

AutoDllPlugin

  1. // 文件目录:configs/webpack.common.js
  2. const path = require('path');
  3. const AutoDllPlugin = require('autodll-webpack-plugin'); // 第 1 步:引入 DLL 自动链接库插件
  4. module.exports = {
  5. // ......
  6. plugins: [
  7. // 第 2 步:配置要打包为 dll 的文件
  8. new AutoDllPlugin({
  9. inject: true, // 设为 true 就把 DLL bundles 插到 index.html 里
  10. filename: '[name].dll.js',
  11. context: path.resolve(__dirname, '../'), // AutoDllPlugin 的 context 必须和 package.json 的同级目录,要不然会链接失败
  12. entry: {
  13. react: [
  14. 'react',
  15. 'react-dom'
  16. ]
  17. }
  18. })
  19. ]
  20. }

HardSourceWebpackPlugin

  1. const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
  2. module.exports = {
  3. // ......
  4. plugins: [
  5. new HardSourceWebpackPlugin() // <- 直接加入这行代码就行
  6. ]
  7. }

结论

vue-cli 和 react 脚手架 都不再使用。。。。