react 项目 中使用 Dllplugin 打包优化技巧

news/2025/1/12 4:07:19/

目录

0.React和DLLPlugin

前言

使用步骤

结果截图

主要说明


0.React和DLLPlugin

React 是一个用于构建用户界面的 JavaScript 库。它由 Facebook 开发,现在由 Facebook 和一个由个人开发者和公司组成的社区维护。React 允许开发人员构建可重用的 UI 组件并有效地管理这些组件的状态。React 使用虚拟 DOM 来高效地更新 UI 并仅呈现必要的更改,从而提高 Web 应用程序的整体性能。

React 使用一种称为 JSX 的语法,它允许开发人员在 JavaScript 中编写类似 HTML 的代码。它使用基于组件的架构,其中每个组件都有自己的状态,并且可以从其父组件接收道具或属性。React 还提供了一种通过其单向数据流管理组件间数据流的方法,称为“道具钻取”。

React 广泛用于构建单页应用程序和移动应用程序,它与其他 JavaScript 库和框架(例如用于状态管理的 Redux)集成得很好。由于其效率和对开发人员友好的功能,例如它处理复杂 UI 更新的能力以及使用错误边界功能进行调试的简便性,它的受欢迎程度不断提高。

DLLPlugin 是一个 webpack 插件,可用于通过创建一个单独的包来优化 Web 应用程序的构建过程,该包仅包含在应用程序的多个部分中频繁使用的依赖项。然后可以按需加载此包,从而缩短应用程序的初始加载时间。

DLLPlugin 的工作原理是创建一个包含指定依赖项列表的 DLL(动态链接库)包,并生成一个将依赖项映射到其相应模块 ID 的清单文件。然后应用程序的主包可以引用 DLL 包和清单文件,允许 webpack 动态链接 DLL 包中的依赖项,而不是将它们与应用程序的主包捆绑在一起。

这种技术可以显着缩短应用程序的构建时间并加快用户的初始加载时间,因为浏览器可以缓存 DLL 包并在多个页面加载之间重用它。DLLPlugin 对于具有大量依赖项的大型应用程序特别有用,因为它减小了主包的大小并允许应用程序更快地加载。

前言

webpack在build包的时候,有时候会遇到打包时间很长的问题,这里提供了一个解决方案,让打包如丝般顺滑~

在用 Webpack 打包的时候,对于一些不经常更新的第三方库,比如 reactlodashvue 我们希望能和自己的代码分离开。

他们可以打包常用的且不经常更新的模块,生成 JS 和 json文件一般放入 public 目录中;项目打包时不会再对这些依赖进行编译,而是通过在 html 中插入 script 标签来读取依赖。比如 vue,antd,echarts 等常用框架和资源库。这在项目依赖包达到一定规模时尤为明显,在速度的提升上是显著的。

原理:项目中引入了很多第三方库,这些库在很长的一段时间内,基本不会更新,打包的时候分开打包来提升打包速度,而DllPlugin动态链接库插件,其原理就是把网页依赖的基础模块抽离出来打包到dll文件中,当需要导入的模块存在于某个dll中时,这个模块不再被打包,而是去dll中获取。

使用步骤

1. 根目录(即跟src平级)下,新建 webpack.dll.config.js 文件

const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const path = require("path");
const webpack = require("webpack");// dll文件存放的目录
const dllPath = "public/vendor";module.exports = {mode: "development",entry: {// 需要提取的库文件vendor: ["react-router-dom", "react", "antd"],},output: {path: path.join(__dirname, dllPath),filename: "[name].dll.js",library: "[name]_[hash]",},plugins: [// 清除之前的dll文件new CleanWebpackPlugin(),new webpack.DllPlugin({path: path.join(__dirname, dllPath, "[name]-manifest.json"),name: "[name]_[hash]",context: process.cwd(),})],
};

2. 然后在webpack.config.js中添加代码

plugins: [new webpack.DllReferencePlugin({manifest: require('../public/vendor/vendor-manifest.json')}),]

3. 在入口html文件中引入 vendor.dll.js

注意:为避免在 路由的非根路径刷新页面导致报错,请使用绝对路径。

<script defer="defer"
src="%PUBLIC_URL%/vendor/vendor.dll.js"></script>

最后打包的时候首先执行npm run build:dll命令会在打包目录下生成 vendor-manifest.json 文件与 vendor.dll.js 文件。 打包dll的时候,Webpack会将所有包含的库做一个索引,写在一个manifest文件中,而引用dll的代码(dll user)在打包的时候,只需要读取这个manifest文件,就可以了。

再执行npm run build 即可。

结果截图

1. npm run build:dll

 2. npm run build

 

 

主要说明

  • 定义常用对象

clean-webpack-plugin 主要用于每次生成动态链接库时首先清空 vendor 目录。

  • dll 文件存放目录

一般定义为 public/vendor。

注意:一般将动态链接库放到项目的 public 目录下,而不要放在 dist 或其他目录中。

  • entry 入口

定义提取哪些库/依赖。

  • context (绝对路径)

manifest (或者是内容属性)中请求的上下文,这里使用 process.cwd() 返回当前工作目录。


http://www.ppmy.cn/news/20706.html

相关文章

【Linux】基础IO --- 内核级和用户级缓冲区、磁盘结构、磁盘的分治管理、block group块组剖析…

出身寒微&#xff0c;不是耻辱。能屈能伸&#xff0c;方为丈夫。 文章目录一、缓冲区&#xff08;语言级&#xff1a;IO流缓冲&#xff0c;内核级&#xff1a;块缓冲&#xff09;1.观察一个现象2.理解缓冲区存在的意义&#xff08;节省进程IO数据的时间&#xff09;3.语言级缓冲…

讲讲 Maven 依赖

讲讲 Maven 依赖1.依赖配置2.依赖范围3.依赖冲突4.排除依赖1.依赖配置 配置信息示例&#xff1a; <project><dependencies><dependency><groupId></groupId><artifactId></artifactId><version></version><type>…

刚来的00后太卷了,上班还没2年,跳到我们公司起薪25k....

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…

深度学习三件套安装依赖指南

安装依赖指南 标准的深度学习三件套包括pytorch, cuda, cudnn。根据经验&#xff0c;一般安装顺序如下&#xff1a; 用conda安装cudaconda install cudatoolkit11.7&#xff0c;使用清华源&#xff08;到官网确认安装了符合pytorch要求的cuda版本&#xff09;用pip安装pytorc…

C++——map|set2

目录 map::operator[] [ ]的实现 multimap 习题 前K个高频单词 两个数组的交集 底层结构 pair有俩个成员一个是first,一个是second 由于pair有俩个模板参数&#xff0c;第一个是first&#xff0c;一个是second map的insert参数类型是valud_type,value_type就是pair …

.mp4 文件转化成 .bag 文件并在 rviz 中显示

文章目录一、Python实现.mp4和.bag相互转化1、.mp4转.bag验证是否转换成功&#xff1a;使用 rosplay2、.bag转.mp4二、rviz 读取 *.bag 数据包并显示1、查看bag数据包的基本信息2、rviz 显示信息一、Python实现.mp4和.bag相互转化 1、.mp4转.bag # -*- coding: utf-8 -*- ##i…

Qt扫盲-QDateTime理论总结

QDateTime理论使用总结一、概述二、使用1. 构造初始化对象2. 获取属性3. 字符串和QDateTime互转4. 时间比较3. 注意三、使用时区四、夏令时(DST)一、概述 QDateTime对象编码日历日期和时钟时间(“datetime”)。它结合了QDate和QTime类的特性。它可以从系统时钟读取当前的datet…

Matlab pdetool

云溪岩绵迎彩霞,博主精神压力大呀,没人说说知心话啊,SCU物理要命啦........基本物理方程静电磁场交流电磁场热传导Options->ApplicationGeneric Scalar泛型标量Generic System通用系统Structural Mechanics,Plane Stress结构力学 - 平面应力Structural Mechanics,Plane Stra…