当前位置: 首页 > news >正文

【React】打包优化-配置CDN

CDN 是一种内容分发网络服务,当用户请求网站内容时,由离用户最近的服务器将缓存的资源内容传递给用户。

哪些资源可以放到CDN服务器?(比如react、 react-dom)

  1. 体积较大,需要利用CDN文件在浏览器的缓存特性,加快加载时间
  2. 非业务JS文件,不需要经常做变动,CDN不用频繁更新缓存

项目中怎么做?

  1. 把需要做CDN缓存的文件排除在打包之外(react、 react-dom)
  2. 以CDN的方式重新引入资源(react、react-dom)
// ``craco.config.js``// 添加自定义对于webpack的配置const path = require('path')
const { whenProd, getPlugin, pluginByName } = require('@craco/craco')module.exports = {// webpack 配置webpack: {// 配置别名alias: {// 约定:使用 @ 表示 src 文件所在路径'@': path.resolve(__dirname, 'src')},// 配置webpack// 配置CDNconfigure: (webpackConfig) => {let cdn = {js:[]}// 当前是否是生产环境,只有生产环境才需要 CDNwhenProd(() => {// key: 不参与打包的包(由dependencies依赖项中的key决定)// value: cdn文件中 挂载于全局的变量名称 为了替换之前在开发环境下webpackConfig.externals = {react: 'React','react-dom': 'ReactDOM'}// 配置现成的cdn资源地址// 实际开发的时候 用公司自己花钱买的cdn服务器cdn = {js: ['https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.production.min.js','https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.production.min.js',]}})// 通过 htmlWebpackPlugin 插件 在 public/index.html 注入 cdn 资源 urlconst { isFound, match } = getPlugin(webpackConfig,pluginByName('HtmlWebpackPlugin'))if (isFound) {// 找到了 HtmlWebpackPlugin 的插件match.userOptions.files = cdn}return webpackConfig}}
}
// public/index.html<body><div id="root"></div><!-- 加载第三发包的 CDN 链接 --><% htmlWebpackPlugin.options.files.js.forEach(cdnURL => { %><script src="<%= cdnURL %>"></script><% }) %>
</body>

相关文章:

  • echart一键生成迁徙图
  • 了解FastSam:一个通用分割模型(草记)
  • Qt5.15.2静态编译 VS2017 with static OpenSSL
  • 存算一体还是存算分离?谈谈数据库基础设施的架构选择
  • 2023.11.22 数据仓库2-维度建模
  • Centos 7 离线安装(tar) NodeJS 16 和 Vue
  • docker启动容器失败,然后查看日志,docker logs查看容器出现报错:
  • 面试问题--智能指针
  • U盘报错无法访问文件或目录损坏且无法读取的解决办法
  • Proteus仿真--高仿真数码管电子钟
  • 了解JSX
  • vue升级题
  • 电子学会C/C++编程等级考试2021年09月(三级)真题解析
  • C#,《小白学程序》第十八课:随机数(Random)第五,方差及标准方差(标准差)的计算方法与代码
  • 1panel在应用商店里面安装jenkins
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Hexo+码云+git快速搭建免费的静态Blog
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • October CMS - 快速入门 9 Images And Galleries
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 高性能JavaScript阅读简记(三)
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 简单实现一个textarea自适应高度
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 小程序button引导用户授权
  • 原生Ajax
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • # include “ “ 和 # include < >两者的区别
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (2022 CVPR) Unbiased Teacher v2
  • (5)STL算法之复制
  • (a /b)*c的值
  • (AngularJS)Angular 控制器之间通信初探
  • (九)信息融合方式简介
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十) 初识 Docker file
  • (四)鸿鹄云架构一服务注册中心
  • (转)jdk与jre的区别
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET DataGridView数据绑定说明
  • .Net IE10 _doPostBack 未定义
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net实现客户区延伸至至非客户区
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @在php中起什么作用?
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • []FET-430SIM508 研究日志 11.3.31
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [2016.7 test.5] T1
  • [CSS] 点击事件触发的动画
  • [DAX] MAX函数 | MAXX函数