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

React项目打包流程

一、React项目打包流程

一、React项目打包流程1. 项目打包打包命令:npm run build2. 预览接着命令行会提示执行:
先:npm install -g serve  
然后执行此命令:serve -s build

二、打包优化 - 配置路由懒加载

二、打包优化 - 配置路由懒加载
路由懒加载是指路由的JS资源只有在被访问时才会动态获取,目的是为了优化项目首次打开的时间1. 把路由修改为由React提供的lazy函数进行动态导入
2. 使用React内置的Suspense组件包裹路由中element选项对应的组件代码如下所示:
// 路由配置
import { Suspense, lazy } from 'react';
import { AuthRoute } from '@/components/AuthRoute';
import { createBrowserRouter } from 'react-router-dom';// 一级路由
import Layout from '@/pages/Layout';
import Login from "@/pages/Login";// 1. lazy函数对二级路由组件进行导入
const Home = lazy(() => import('@/pages/Home'))
const Article = lazy(() => import('@/pages/Article'))
const Publish = lazy(() => import('@/pages/Publish'))// 二级路由
// import Home from '@/pages/Home';
// import Article from '@/pages/Article';
// import Publish from '@/pages/Publish';// 配置路由实例
const router = createBrowserRouter([{path: '/',// 根据权限的有无控制路由跳转element: <AuthRoute><Layout /></AuthRoute>,children: [{path: 'home',element: <Suspense fallback="加载中"><Home /></Suspense>},{path: 'article',element: <Suspense fallback="加载中"><Article /></Suspense>},{path: 'publish',element: <Suspense fallback="加载中"><Publish /></Suspense>}]},{path: '/login',element: <Login />}
])export default router;

三、打包优化 - 包体积分析

三、打包优化 - 包体积分析通过可视化的方式,直观的体现项目中各种包打包之后的体积大小,方便做优化1. 安装包 --> source-map-explorernpm i source-map-explorer2. 配置命令指定要分析的js文件在package.json内scripts添加如下代码:"analyze": "source-map-explorer 'build/static/js/*.js'""scripts": {"start": "craco start","build": "craco build","test": "craco test","eject": "craco eject","analyze": "source-map-explorer 'build/static/js/*.js'"
}

四、打包优化 - CDN优化

四、打包优化 - CDN优化1. 什么是CDN? 
CDN是一种内容分发网络服务,当用户请求网站内容时,由离用户最近的服务器将缓存的资源内容传递给用户2. 哪些资源可以放到CDN服务器
体积较大的非业务JS文件,比如react、react-dom
⑴. 体积较大,需要利用CDN文件在浏览器的缓存特性,加快加载时间
⑵. 非业务JS文件,不需要经常做变动,CDN不用频繁更新缓存3. 项目中怎么做?
⑴. 把需要做CDN缓存的文件排除在打包之外(react,react-dom)
⑵. 以CDN的方式重新引入资源(react、react-dom)1. 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')},// 配置CDNconfigure: webpackConfig => {let cdn;whenProd(() => {// 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.cdn = cdn;}return webpackConfig;}}
}2. public文件夹下index.html代码如下:<body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><!-- 动态插入cdn资源url, 加载第三发包的 CDN 链接 --><% htmlWebpackPlugin.userOptions.cdn.js.forEach(cdnURL => { %><script src="<%= cdnURL %>"></script><% }) %>
</body>

相关文章:

  • 微信小程序 手机号授权登录 偶尔后端解密失败
  • 新一代大语言模型在Amazon Bedrock引领人工智能潮流
  • 【华为OD题库-108】水果摊小买卖-java
  • 滤波器opencv
  • uni-app tabbar组件
  • 自然语言处理2——轻松入门情感分析 - Python实战指南
  • 基于CNN神经网络的手写字符识别实验报告
  • 数据治理:释放数据价值的关键
  • flink 实时写入 hudi 参数推荐
  • AutoSAR(基础入门篇)2.1Autosar架构中的AppL
  • EasyCVR无人机推流+人数统计AI算法,助力公共场所人群密度管控
  • 基于uibot知网文论采集机器人设计与实现
  • web等保评测需要实机查看的操作系统、服务器、数据库和应用部分
  • 数据库开发之子查询案例的详细解析
  • 帆软报表如何灵活控制水印的显示
  • ES6指北【2】—— 箭头函数
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【5+】跨webview多页面 触发事件(二)
  • Akka系列(七):Actor持久化之Akka persistence
  • Apache Pulsar 2.1 重磅发布
  • conda常用的命令
  • Debian下无root权限使用Python访问Oracle
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript 奇技淫巧
  • Java编程基础24——递归练习
  • JAVA之继承和多态
  • Mac转Windows的拯救指南
  • maven工程打包jar以及java jar命令的classpath使用
  • orm2 中文文档 3.1 模型属性
  • REST架构的思考
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 彻底搞懂浏览器Event-loop
  • 反思总结然后整装待发
  • 构造函数(constructor)与原型链(prototype)关系
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 前端学习笔记之观察者模式
  • 如何合理的规划jvm性能调优
  • 数据仓库的几种建模方法
  • 微信小程序填坑清单
  • 移动端 h5开发相关内容总结(三)
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ###C语言程序设计-----C语言学习(3)#
  • #1014 : Trie树
  • #HarmonyOS:基础语法
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (LeetCode C++)盛最多水的容器
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (四)Android布局类型(线性布局LinearLayout)
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • ... 是什么 ?... 有什么用处?
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET 中创建支持集合初始化器的类型