深入浅出 solid.js 源码 (三)—— 快在哪里

833 阅读2分钟

这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

前面我们看到了,solid.js 版本和 react 版本在写法上是有极高的相似度的,那么 solid.js 是一个类 react 的框架吗?不是。它们看起来很像,但是也仅仅就是看起来像,在底层实现上 solid.js 和 react 是完全不同的,下面继续以上一节的计数器为例来看一下:

solidjs 版本实现 codesandbox.io/s/magical-h…

react 版本实现 codesandbox.io/s/little-td…

(这里没使用码上掘金是因为码上掘金貌似只支持 cdn 的方式添加依赖,不能直接安装 npm 包,很不方便希望优化)

为了方便演示部署了两个在线地址:

solid.js 版本:fengxu.ink/csb-ccv4yh/

react 版本:fengxu.ink/csb-6ev66t/

接下来使用这两个链接做个测试,我们点击上面的按钮修改数值,这个过程会执行 UI 库内的组件更新逻辑,我们使用浏览器 devtools 中的 preformance 功能对调用情况做一个录制。

solid.js 版本:

image.png

react 版本:

image.png

示例图中都是以 click 事件开始,到更新 UI,即使你不清楚里面的详细含义,也可以很直接的看出来,solid.js 的调用栈很清晰,相比之下 react 版本的调用非常复杂,底层做的工作很多。

如果熟悉 react 的原理可以知道,上图中刚好对应 react 处理的几个步骤:响应点击事件、对比并生成Fiber tree、更新 DOM。而对于 solid.js 而言,触发事件、更新状态、更新视图整个流程是直接下来的,不需要非常复杂的 diff 操作。这里得益于 solid.js 的响应式更新策略,数据变化时直接更新变化的内容,不需要整体 diff,效率提升非常明显。

除了响应原理,solid.js 另一个重要的提升点就是编译时,这里类似 svelte,solid 也会在编译时做很多优化工作,由于没有虚拟 dom,solid 会直接把操作转化为 dom API 的调用,速度非常快。

当然这里只是从宏观上看一下 solid 的工作,后面会深入源码,看下 solid 究竟是如何实现各部分能力的。