Redian新闻
>
React请求机制优化思路

React请求机制优化思路

公众号新闻


来源 | OSCHINA 社区

作者 | 京东云开发者-京东零售 粱峰峰

原文链接:https://my.oschina.net/u/4090830/blog/10098333


说起数据加载的机制,有一个绕不开的话题就是前端性能,很多电商门户的首页其实都会做一些垂直的定制优化,比如让请求在页面最早加载,或者在前一个页面就进行预加载等等。随着 react18 的发布,请求机制这一块也是被不断谈起,并且在后续其实也给出了明确的方向。
假如我们页面中有三个组件 C1、C2、C3 依次嵌套,每个组件中有对应的请求 F1、F2、F3,通常大多数人会使用 useeffect 和 state 变量来实现数据流的获取,这样就意味着必须在组件加载时才能发起请求,所有数据获取都发生在组件的生命周期中,如下图所示,我们可以将这种获取数据的方式称作瀑布流渲染,但是这种方式有一个问题是,在这种方法中,组件之间的数据获取是按顺序进行的,这实际上意味着它们彼此阻塞,如果组件的层级嵌套很深的话,就会导致页面的加载时间特别长。
为了阻止组件间数据获取的这种顺序阻塞,另一种方法就是在组件加载前可以使用 Promise.all 获取所有的请求数据,这样在组件加载时就已经获取到所有的数据了。这种方式解决了组件加载顺序阻塞彼此数据流获取的问题,但是也产生了一个新的问题,在请求完成之前页面都会是空白的。
基于第二种先请求后渲染的方式,还可以使用 Suspense 将请求和渲染并行化,Suspense 可以使得组件可以 “等待” 某些操作结束后,再进行渲染。而这种方式如果要用到实际项目中,还需要考虑 C1、C2、C3 对应的请求写在哪里,如果写在组件中,那么加载还是慢的。如果拆分出来,就需要考虑文件拆分、code splitting 等工程化问题。
在认真的分析了以上三种方式以后,发现各有优劣,同时基于上述方案,我也提供一个请求优化的思路,首先将请求的 JS 单独拆分出来打一个文件 request.js,在 html 头部引入 request.js 并使用 async 属性让脚本并行执行 (如下代码所示),这样既可以保证我们的请求在最开始就能发出,也能不阻塞后续 React 代码打包的 js 文件的执行,相当请求和渲染的代码在并行执行。
// html头部引入request.js
<script async src="/js/request.js"></script>

在发送完请求之后,需要将返回的数据注入到 React 组件中,这部分怎么注入呢?简单的代码示例如下:

// request.js 中请求部分 evt是发布订阅模式的一个实例
window.InitData = {
data: null,
on: (msg, fn)=> evt.on(msg, e => fn(e)),
emit: (msg, data)=> evt.emit(msg, data),
};

fetch().then(rs => {
InitData.data = rs;
InitData.emit("init_data", rs);
return rs;
});
// index.js react代码逻辑

…….

useEffect(()=> {
if (InitData.data !== null) {
// 这里已经获取到了请求的返回值
doSomething();
} else {
InitData.on("init_data", (data)=> {
// 利用发布订阅模式获取到数据
doSomething();
});
}
}, []);

…….
总体思路就是在 html 中最先加载单独打包出来的请求文件并加入 async 属性使脚本并行执行,将返回的数据挂载到 window 下或者利用发布订阅模式将数据注入到 react 组件中。这样其实类似于边请求边渲染的模式,利用提前请求来减少加载的时间。后续也是希望能用工程化的方式去解决数据的请求机制。
未来的话在开发时肯定是更倾向于边请求边渲染的这种模式,在 React 的官网中也有说到未来计划让 Suspense 处理更多的场景,包括获取数据等等,在新发布的 React18 中 Suspense 也是支持了服务端渲染,包括近期开源的 remix 也都在优化请求机制能够让应用更快的加载。也欢迎有兴趣的小伙伴一起来讨论和实践。



🕰 8 月 26 日 14:00-18:00 
🏡 北京中关村创业大街 12 号楼 5 层
🔥 一起聊聊 AI 大模型与底层技术
👇 扫描下方左侧二维码报名,右侧二维码加入交流群
🎁 现场抽奖,福利多多

往期推荐



Go 2永远不会给Go 1带去破坏性变化
中国程序员拒写赌博程序被拔14颗牙,全身损伤达88%
字节首个大模型独立App亮相,Grace更名 “豆包”




这里有最新开源资讯、软件更新、技术干货等内容

点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
桌面 QQ 重构,探寻跨平台开发挑战与 Electron 内存优化突破蔚来:1800座换电站背后的数字化思考观点丨林坚:深刻领会习近平文化思想体系的精髓债券通六周年:机制持续优化,债市开放蕴含新机遇COPD优化管理新思路?听王玮教授从心肺风险潜在机制谈起 | ERS 2023重磅!北向资金信披机制酝酿优化→领域建模的体系化思维与6种方法论#英语学习#Restrain, Refrain, and Restrict有什么区别?看看你能答对这道题吗?As Nolan Arrives, Chinese Fans React to ‘Oppenheimer’ ReleaseICML 2023 | 清华团队提出使用低维优化求解器求解高维/大规模优化问题道别朋友大模型写代码能力突飞猛进,北大团队提出结构化思维链SCoT端午论坛网易我心中的沃顿 WhartonVCE化学 | 金属活跃性Reactivity of metal的置换反应Displacement reaction的知识点讲解豆豆三部曲的男女主人公(2)DPU硬件标准化思考与探索(2023)Ex-Soldier Sleeps in Cave for 22 Years to Protect Song Treasures实际工作中结构化思维在表达中的应用2024招聘季 | 薪资205K!Evercore (US) Restructuring开放全职岗位会议预告 | 首届深圳论坛·主题论坛“习近平文化思想与中国特色社会主义先行示范区的文化建设战略”不配种花Nature Catalysis | 季泉江/申怀宗合作在微型基因编辑器工作机制解析和性能优化方面取得新进展CTO偷偷传我的系统性能优化十大绝招(万字干货)CCTV Report Sparks Outcry Over Heritage Preservation in Gansu打破成人的固化思想:原来艺术不是只画太阳,原来艺术不是太阳一定要画的圆。学习笔记 | 领袖文化思想的重点内容,以及重要思想四个层次的规范表述最优化问题中步长越大、收敛速度越快,梯度下降算法数十年的传统思路被打破𝐂𝐚𝐥𝐧𝐢𝐊𝐞𝐚𝐧双皮奶内衣裤,软弹有度,上身0束缚~【模板】临床研究没有思路了?这篇针对同样接受标准治疗、不同性别患者的预后研究思路很值得借鉴梯度下降算法数十年传统思路被打破:最优化问题中步长越大、收敛速度越快Cell | 重磅!发现第四种基因转导机制!揭示噬菌体介导细菌有害基因转导的新机制一场重要会议在京召开,首次提出习近平文化思想重要指示!习近平文化思想首次提出【𝐂𝐚𝐥𝐧𝐢𝐊𝐞𝐚𝐧双皮奶无痕内裤】49元三条!巨巨巨好穿 !!简直就是辣妹顶配,食品级冰箱收纳盒【一日团】
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。