dll 的使用

先把公用包打出来,以及生成一个清单 manifest.json

  1. const path = require('path')
  2. const webpack = require('webpack')
  3. module.exports = {
  4. entry: {
  5. react: 'react',
  6. reactDom: 'react-dom'
  7. },
  8. output: {
  9. path: path.resolve(__dirname, 'dist'),
  10. filename: '[name]_dll.js',
  11. library: '[name]',
  12. },
  13. plugins: [
  14. new webpack.DllPlugin({
  15. format: true,
  16. name: '[name]',
  17. path: path.resolve(__dirname, 'dist/manifest.json'),
  18. context: __dirname,
  19. }),
  20. ],
  21. }

在项目中引用公共包,需要注意的是公共包是作为 library 输出的,项目中需要手动导入公共包,这里使用 add-asset-html-webpack-plugin 插件

  1. const path = require('path')
  2. const webpack = require('webpack')
  3. const HtmlWebpackPlugin = require('html-webpack-plugin')
  4. const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin');
  5. module.exports = {
  6. entry: './index.js',
  7. mode: 'development',
  8. module: {
  9. rules: [
  10. {
  11. test: /\.js$/,
  12. use: {
  13. loader: 'babel-loader',
  14. options: {
  15. presets: ['@babel/preset-react']
  16. }
  17. }
  18. }
  19. ]
  20. },
  21. plugins: [
  22. new webpack.DllReferencePlugin({
  23. context: path.join(__dirname),
  24. manifest: require('./dist/manifest.json')
  25. }),
  26. new HtmlWebpackPlugin(),
  27. new AddAssetHtmlPlugin({
  28. publicPath: './',
  29. filepath: path.resolve(__dirname, './dist/*_dll.js'),
  30. }),
  31. ]
  32. }

源代码附件:dll.zip

webpack4 之后为何废弃 dll

主要是因为 splitChunksPlugin 功能太强大了,无需 dll了

  1. optimization: {
  2. splitChunks: {
  3. // chunks指定切割chunk类型,all(所有类型) | initial(初始chunk) | async(异步chunk)
  4. chunks: 'all',
  5. // 切割完文件最小 > 20kb,不然不切割
  6. minSize: 20000,
  7. // 共享该模块最小chunk数
  8. minChunks: 1,
  9. // 最多有 30 个异步请求加载该 module
  10. maxAsyncRequests: 30,
  11. // 初始化的时候最多有 30 个请求该模块
  12. maxInitialRequests: 30,
  13. // 强制执行拆分的体积阈值,即超过 50kb 强制拆分,比如 react-dom 超过了 50kb,这里会拆分出 vendors-node_modules_react-dom_index_js.js
  14. enforceSizeThreshold: 50000,
  15. automaticNameDelimiter: '~',
  16. cacheGroups: {
  17. defaultVendors: {
  18. test: /[\\/]node_modules[\\/]/,
  19. // 指定输出缓存组名称
  20. filename: 'js/vendors.js',
  21. // 指定缓存组命中优先级
  22. priority: -10,
  23. // 当 module 未变时,是否可以使用之前的 chunk
  24. reuseExistingChunk: true,
  25. },
  26. defaultChunks: {
  27. // 比如两个入口文件都用到了c.js,会打包出公共包 defaultChunks-c_js.js
  28. minChunks: 2,
  29. priority: -1,
  30. reuseExistingChunk: true,
  31. },
  32. },
  33. },
  34. },