Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >华为自研的前端框架是什么样的?

华为自研的前端框架是什么样的?

作者头像
公众号@魔术师卡颂
发布于 2023-12-04 12:09:12
发布于 2023-12-04 12:09:12
52500
代码可运行
举报
文章被收录于专栏:魔术师卡颂魔术师卡颂
运行总次数:0
代码可运行

大家好,我卡颂。

最近,华为开源了一款前端框架 —— openInula[1]。根据官网提供的信息,这款框架有3大核心能力:

  1. 响应式API
  1. 兼容ReactAPI
  1. 官方提供6大核心组件

并且,在官方宣传视频里提到 —— 这是款「大模型驱动」「智能框架」

那么,这究竟是款什么样的前端框架呢?我在第一时间体验了Demo,阅读了框架源码,并采访了框架核心开发者。本文将包括两部分内容:

  1. 对框架核心开发者陈超涛的采访
  2. 卡颂作为一个老前端,阅读框架源码后的一些分析

采访核心开发者

开发Inula的初衷是?

回答:

华为内部对于业务中强依赖的软件,考虑到竞争力,,会开发一个内部使用的版本。

Inula在华为内部,从立项到现在两年多,基本替换了公司内绝大部分React项目。

卡颂补充背景知识:Inula兼容React 95% API,最初开发的目的就是为了替换华为内部使用的React。为了方便理解,你可以将Inula类比于华为内部的React

为什么开源?

回答:

华为对于「自研软件」的公司策略,只要是公司内部做的,觉得还ok的自研都会开源。

接下来的提问涉及到官网宣传的内容

宣传片提到的大模型赋能、智能框架是什么意思?

回答:

这主要是Inula团队与其他外部团队在AI低代码方向的一些探索。比如:

  1. 团队与上海交大的一个团队在探索「大模型赋能chrome调试业务代码」方面有些合作,目的是为了「自动定位问题」
  2. 团队与华为内部的「大模型编辑器」团队合作,探索「框架与编辑器定制」可能性

以上还都属于探索阶段。

Inula未来有明确的发展方向么?

回答:

团队正在探索引入「响应式API」,相比于「React的虚拟DOM」方案,响应式API能够提高运行时性能。24年可能会从Vue composition API中寻求些借鉴。

新的发展方向会在项目仓库以RFC的形式展开。

补充:RFC「Request for Comments」的缩写。这是一种协作模式,通常用于提出新的特性、规范或者改变现有的一些规则。RFC的目的是收集不同的意见和反馈,以便在最终确定一个决策前,考虑尽可能多的观点和影响。

为什么要自研核心组件而不用社区成熟方案?

卡颂补充:所谓「核心组件」,是指状态管理、路由、国际化、请求库、脚手架这样的框架生态相关的库。既然Inula兼容React,为什么不直接用React生态的成熟产品,而要自研呢?毕竟,这些库是没有软件风险的。

回答:

主要还是丰富Inula生态,根据社区优秀的库总结一套Inula官方推荐的最佳实践。至于开发者怎么选择,我们并不强求。

卡颂的分析

以上是我对Inula核心开发者陈超涛的采访。下面是我看了Inula源码后的一些分析。

要分析一款前端框架,最重要的是明白他是如何更新视图的?这里我选择了两种触发时机来分析:

  1. 首次渲染

触发的方式类似如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Inula.render(<App />, document.getElementById("root"));
  1. 执行useState的更新方法触发更新

触发的方式类似如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function App() {
  const [num, update] = useState(0);
  // 触发更新
  update(xxx);
  // ...
}

顺着调用栈往下看,他们都会执行两步操作:

  1. 创建名为update数据结构
  2. 执行launchUpdateFromVNode方法

比如这是首屏渲染时:

这是useState更新方法执行时:

launchUpdateFromVNode方法会向上遍历到根结点(源码中遍历的节点叫VNode),再从根节点开始遍历树。由此可以判断,Inula的更新机制与React类似。

所有主流框架在触发更新后,都不会立刻执行更新,中间还有个调度流程。这个流程的存在是为了解决:

  1. 哪些更新应该被优先执行?
  2. 是否有些更新是冗余的,需要合并在一块执行?

Vue中,更新会在微任务中被调度并统一执行,在React中,同时存在微任务(promise)与宏任务(MessageChannel)的调度模式。

Inula中,存在宏任务的调度模式 —— 当宿主环境支持MessageChannel时会使用它,不支持则使用setTimeout调度:

同时,与这套调度机制配套的还有个简单的优先级算法 —— 存在两种优先级,其中:

  • ImmediatePriority:对应正常情况触发的更新
  • NormalPriority:对应useEffect回调

每个更新会根据「更新的ID」(一个自增的数字)+ 「优先级对应的数字」 作为优先级队列中的排序依据,按顺序执行。

假设先后触发2次更新,优先级分别是ImmediatePriorityNormalPriority,那么他们的排序依据分别是:

  1. 100(假设当前ID到100了)- 1(ImmediatePriority对应-1) = 99
  2. 101(100自增到101)+ 10000(NormalPriority对应10000)= 10101

99 < 10101,所以前者会先执行。

需要注意的是,Inula中对更新优先级的控制粒度没有React并发更新细,比如对于如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
useEffect(function cb() {
  update(xxx);
  update(yyy);
})

React中,控制的是每个update对应优先级。在Inula中,控制的是cb回调函数与其他「更新所在回调函数」之间的执行顺序。

这意味着本质来说,Inula中触发的所有更新都是「同步更新」,不存在React并发更新中「高优先级更新打断低优先级更新」的情况。

这也解释了为什么Inula兼容 95% 的React API,剩下 5% 就是「并发更新相关API」(比如useTransitionuseDeferredvalue)。

现在我们已经知道Inula的更新方式类似React,那么官网提到的「响应式API」该如何实现呢?这里存在三条路径:

  1. 一套外挂的响应式系统,类似ReactMobx的关系
  2. 内部同时存在两套更新系统(当前一套,响应式一套),调用不同的API使用不同的系统
  3. 重构内部系统为响应式系统,通过编译手段,使所有API(包括当前的React API与未来的类 Vue Composition API)都走这套系统

其中第一条路径比较简单,第二条路径应该还没框架使用,第三条路径想象空间最大。不知道Inula未来会如何发展。

总结

当前,Inula是一款「类React的框架」,功能上可以类比为「React并发更新之前的版本」

下一步,Inula会引入「响应式API」,目的是提高渲染效率。

对于未来的发展,主要围绕在:

  • 探索类 Vue Composition API的可能性
  • 迭代官方核心生态库

对于华为出的这款前端框架,你怎么看?

参考资料

[1]

openInula: https://www.openinula.net/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 魔术师卡颂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
详解React的Transition工作原理原理
Transition 是 react18 引入的新概念,用来区分紧急和非紧急的更新。
夏天的味道123
2022/10/18
8370
浅谈前端框架原理
最近在看卡颂大佬的《React 设计原理》,看了第一章,就有一种醍醐灌顶的感觉,于是决定记录分享一下这一章的内容。这里也极力推荐各位小伙伴读一下。
CandyTong
2023/02/24
9010
浅谈前端框架原理
浅谈前端框架原理
最近在看卡颂大佬的《React 设计原理》,看了第一章,就有一种醍醐灌顶的感觉,于是决定记录分享一下这一章的内容。这里也极力推荐各位小伙伴读一下。
CandyTong
2023/01/31
1.6K0
前端框架 Rxjs 实践指北
本文主要介绍如何在前端框架 React、Vue 使用 Rxjs,开源的 rxjs-hooks、vue-rx背后做了哪些事情。在开始之前,希望你对响应式编程、Rxjs 有一个基本的认识。让我们开始吧!
用户1250838
2021/05/31
5.6K0
对于“前端状态”相关问题,如何思考比较全面
大家好,我卡颂。 最近看到个写得很不错的知乎回答Hooks是否过誉了?前端应该跟着React走还是跟着JS、TS走?- beeplin的回答[1]。
公众号@魔术师卡颂
2023/02/23
6370
对于“前端状态”相关问题,如何思考比较全面
100行代码实现React核心调度功能
想必大家都知道React有一套基于Fiber架构的调度系统。这套调度系统的基本功能包括:
公众号@魔术师卡颂
2021/12/16
3620
100行代码实现React核心调度功能
从0实现React 系列(二):组件更新
假设React是你日常开发的框架,在日复一日的开发中,你萌生了学习React源码的念头,在网上一顿搜索后,你发现这些教程可以分为2类:
一只图雀
2020/06/28
1.6K0
从0实现React 系列(二):组件更新
从小学数学聊前端框架设计
其实前端框架是个很简单的东西,大部分框架的工作原理可以用一个「小学知识」解释清楚。
公众号@魔术师卡颂
2021/07/07
5400
「深入浅出」主流前端框架更新批处理方式
大家好,我是 alien ,一提到更新,是前端框架中一个老生常谈的问题,这些知识也是在面试中,面试官比较喜欢问的,那么在不同的技术框架背景下,处理更新的手段各不相同,今天我们来探讨一下,主流的前端框架批量处理的方式,和其内部的实现原理。
用户6835371
2022/03/31
8080
「深入浅出」主流前端框架更新批处理方式
一个新视角:前端框架们都卷错方向了?
近几年,前端领域出现了很多新框架,比如Svelte、 Solid.js、Astro、Qwik等。
公众号@魔术师卡颂
2022/11/22
6600
一个新视角:前端框架们都卷错方向了?
从源码深入探究React 运行时优化方案的演进
上周刚在公司进行了一次 React 运行时优化方案的分享,以下是分享的文字版,文章比较长,干货也很多,相信你看完后会对 React 有不一样的理解。
Nealyang
2021/09/27
5000
从源码深入探究React 运行时优化方案的演进
React源码解析之commitRoot整体流程概览
在 React源码解析之renderRoot概览 中,renderRoot()的最后一段的switch...case即进入到了commit阶段:
进击的小进进
2020/04/01
1.2K0
React源码解析之commitRoot整体流程概览
React Concurrent Mode 初识&探秘
今天的文章来得晚了一点,就是为了等这个视频,给我们自己的大会做个小推广~ 腾讯 TWeb 前端技术大会,将于 10 月 24 日 9 点正式举办!线上直播票限时优惠进行中,请点击下方视频内链接报名参会,了解业界领先技术方向与实践,一起跟大厂技术大咖交流~ 1. 引言 在使用 React 之前,不知道小伙伴们有没有遇到过 更新卡顿 的问题,如下为 React 应用更新时的火焰图,JS 执行 287 ms 后,渲染任务才开始(25.4ms)。 主流浏览器刷新频率为 60Hz,即每 16.6ms 浏览器刷新一
用户1097444
2022/06/29
8360
React Concurrent Mode 初识&探秘
react源码--任务调度系统
react是一个通用型开源前端框架,在前端各(hua)种(li)优(hu)秀(shao)的前端界面构建库中尤为出名。对此本着让开发时甩锅bug的理由更有说服力,做为新一代苦逼的打工仔我决定开启react源码阅读之路。
玖柒的小窝
2021/10/26
1K0
react源码--任务调度系统
前端二面react面试题整理
每个React组件强制要求必须有一个 render()。它返回一个 React 元素,是原生 DOM 组件的表示。如果需要渲染多个 HTML 元素,则必须将它们组合在一个封闭标记内,例如 <form>、<group>、<div> 等。此函数必须保持纯净,即必须每次调用时都返回相同的结果。
beifeng1996
2022/12/19
1.2K0
高端操作:把 React Scheduler 掏出来单独用
我们知道,Scheduler 是 React 提供的底层调度器。但是这个调度器具体是如何用的,可能大部分人都不太清楚了,好在 React 把内部的模块封装得都相对独立,因此,我们可以想个办法,单独把他的 Scheduler 或者 Reconciler 单独掏出来用。
用户6901603
2024/01/04
3330
高端操作:把 React Scheduler 掏出来单独用
2024新年礼物-写一个前端框架
大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder。
前端柒八九
2024/01/17
2180
2024新年礼物-写一个前端框架
Svelte框架:编译时优化的高性能前端框架
Svelte是一款新兴的前端框架,以其独特的编译时优化机制著称,能够在构建时将复杂的UI逻辑转换为高效的JavaScript代码,从而实现高性能的Web应用。本文将深入解析Svelte的架构、核心概念以及代码优化策略。
天涯学馆
2024/06/12
2840
Svelte框架:编译时优化的高性能前端框架
从框架作者角度聊:React调度算法的迭代过程
React在v16之前面对的主要性能问题是:当组件树很庞大时,更新状态可能造成页面卡顿,根本原因在于:更新流程是「同步、不可中断的」。
公众号@魔术师卡颂
2022/01/20
5400
能不能说说 React 18 的 startTransition 作用?
startTransition的出现当然不是为了逆转命运,而是为了逆转React的更新流程。
用户3806669
2021/07/06
1.1K0
能不能说说 React 18 的 startTransition 作用?
相关推荐
详解React的Transition工作原理原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验