先说结论
结论就是在webpack5不在建议启用Dll,它 带来的性能提升微乎其微
基础概念
所谓动态链接,就是把一些经常会共享的代码制作成 DLL 档,当可执行文件调用到 DLL 档内的函数时,Windows 操作系统才会把 DLL 档加载存储器内,DLL 档本身的结构就是可执行档,当程序有需求时函数才进行链接。透过动态链接方式,存储器浪费的情形将可大幅降低。
就是事先把常用但又构建时间长的代码提前打包好(例如 react、react-dom),取个名字叫 dll。后面再打包的时候就跳过原来的未打包代码,直接用 dll。这样一来,构建时间就会缩短,提高 webpack 打包速度
三种方式
DllPlugin & DllReferencePlugin
1. DllPlugin 首先构建模块
在packages中新建指令dll
"scripts": {"dll": "webpack"},
然后通过webpack将不常用到的资源打包到一起
webpack.config.js
const path = require('path')const webpack = require('webpack')const TerserPlugin = require('terser-webpack-plugin')module.exports = {mode: "production",entry: {react: ['react', 'react-dom']},output: {path: path.resolve(__dirname, 'dll'),filename: 'dll_[name].js',library: 'dll_[name]'},optimization: {minimizer: [new TerserPlugin({extractComments: false}),],},plugins: [new webpack.DllPlugin({name: 'dll_[name]',path: path.resolve(__dirname, './dll/[name].manifest.json')})]}
2.链接 dll 文件
webpack.config.js
DllReferencePlugin 是找到这个manifest
AddAssetHtmlPlugin 是添加这个资源到html
const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin')const webpack = require('webpack')plugins: [new webpack.DllReferencePlugin({context: resolveApp('./'),manifest: resolveApp('./dll/react.manifest.json')}),new AddAssetHtmlPlugin({outputPath: 'js',filepath: resolveApp('./dll/dll_react.js')})]
AutoDllPlugin
// 文件目录:configs/webpack.common.jsconst path = require('path');const AutoDllPlugin = require('autodll-webpack-plugin'); // 第 1 步:引入 DLL 自动链接库插件module.exports = {// ......plugins: [// 第 2 步:配置要打包为 dll 的文件new AutoDllPlugin({inject: true, // 设为 true 就把 DLL bundles 插到 index.html 里filename: '[name].dll.js',context: path.resolve(__dirname, '../'), // AutoDllPlugin 的 context 必须和 package.json 的同级目录,要不然会链接失败entry: {react: ['react','react-dom']}})]}
HardSourceWebpackPlugin
const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');module.exports = {// ......plugins: [new HardSourceWebpackPlugin() // <- 直接加入这行代码就行]}
结论
vue-cli 和 react 脚手架 都不再使用。。。。
