又一个前端框架 Solid ?性能直逼原生 JS ?

2023-11-28 10:20

本文主要是介绍又一个前端框架 Solid ?性能直逼原生 JS ?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方 前端加加,关注公众号

Solid 是什么?Solid 号称拥有 JSX 语法,类似于 React hook 的语法,你可以用现代化的开发方式,获得性能最快的代码。真正的既要又要还要。

image.png

到底有多快,我们看看 Benchmark

image.png

原生 JS 是 1, Solid 1.05, 比 Svelte 也快,React 跑到了 1.93 。为什么这么快?让我们来揭开神秘的面纱。官方也提供了 playground,可以实时看到打包后的代码,不如上去动手感受一下~

首先,官方代码如下:

import { render } from "solid-js/web";
import { createSignal, createEffect, createMemo, mapArray } from "solid-js";function CounterNum() {const [count, setCount] = createSignal(0);const increment = () => setCount(count() + 1);createEffect(() => {console.log("i am alive");});return (<><button type="button" onClick={increment}>{count()}</button></>);
}

这个代码,看起来,可以说跟 React Hook 一毛一样了,可以理解,也期望以后新创建的框架,都可以往 React 等框架语法靠拢。而不是又创建一套新的语法。真的学不动啊,程序员不要内卷程序员。这点 Solid 框架作者就做得不错。

那为什么快,猜测有三点:

  1. 直接使用浏览器的 DOM, 没有虚拟 DOM, DOM diff 一整套算法

  2. 响应式原理,精准更新对应的值

  3. 提前编译,更小的包体积,尺寸小

一、 直接使用浏览器的 DOM, 没有虚拟 DOM, DOM diff 一整套算法

我们看一下他编译出来的代码,可以发现,他的 DOM ,是原生 DOM ,其他的语法是直接调用的,也没有那一整套复杂的虚拟 DOM

image.png
二、提前编译,按需打包

无论是 react 还是 vue ,不管怎么编译,都需要引入框架本身。也就是 runtime 。而且这个体积还比较大。这些框架都采用的是用运行时方案,运行时方案相比于编译时方案,最大的优势是可以「几乎没有任何语法约束」的去完成代码编写。而 Solid 则预编译,将 jsx 部分的代码,转换成原生的语法。

image.png

我们直接看代码, 如果把对应的 click 事件去掉,看看 build 之后的代码是怎么样的。

image.png

可以看到,delegateEvents(["click"]); 这一行代码不见了,也不会引入 delegateEvents 这个方法。这个特性非常厉害,这样可以得到最小的包体积。

三、响应式原理,精准更新对应的值

如果了解 React 的原理,就会知道,只要是 props 或者 state 改变,React 组件就会重新渲染,而每一次判断是否会重新改变,值是否不一样,也是一整套算法…… Solid 不一样,他另辟蹊径,每一个组件都是一个独立的线程,每个组件里的 createMemo 或 createEffect 里面去收集对应的依赖, 在 set 改变值后,都会重新执行这些方法。看起来就像是实时更新了一样。

核心的原理可以用下面两段代码来展示:

image.png
image.png

从这两段代码,他就可以实现,当 value 值改变时,会自动重新渲染 createMemo,createEffect 里的方法,自动更新 DOM 对应的值。响应式变化。

如果还是不理解的话,可以看一下下面这张图,其实就是使用了 发布-订阅方式:

关键的步骤如下:

  1. createeffect 分析依赖还有回调,存入全局变量

  2. read 的时候,如果有这个依赖对应的值,则放入 subscriptions。为什么这里需要使用 {count()} 函数才能读取值也是因为这期间要处理一些事情。

  3. write 的时候,去 subscriptions 里面触发对应的函数

总结

我们分析了 Solid 为什么性能这么快,主要从下面三个方面来讲:

  1. 直接使用浏览器的 DOM, 没有虚拟 DOM, DOM diff 一整套算法

  2. 响应式原理,精准更新对应的值

  3. 提前编译,更小的包体积,尺寸小

学习借鉴下原理挺不错的,在生产环境中使用还是算了,毕竟一个新框架前期正处于快读迭代的过程中,肯定会有一堆弃用的api。且他的生态距离 react,vue 的生态,还需要发展几年。选用一个框架,如果考量他的性能,也要考量可维护性,编码效率等…

前端的技术发展,从原生 DOM ,到虚拟 DOM,随着浏览器自身性能越来越好,以后会不会又回归到 原生 DOM ?

写在最后

这可能是大型复杂项目下数据流的最佳实践

你要知道的 Npm Script 都在这里

图解 React-router 带你深入理解路由本质

NPM 组件你应该知道的事

如何搭建一个完美的组件库?

npx, 你了解吗?

一文快速入门 Graphql

8个问题带你进阶 React

从0实现一个脚手架

一个栗子带你上手CSS3动画

你不知道的 useRef

面试官:你怎么优雅写 CSS?

Typescript 最佳实践

关 注 「 前 端 加 加 」 , 第 一 时 间 获 取 优 质 文 章 .

添加 peen 好友,拉你进交流划水聊天群,有看到好文章/代码都会发在群里。

如果觉得这篇文章还不错,来个【转发、收藏、在看】三连吧,让更多的人也看到~

❤️ 顺手点个在看呗 ↓

这篇关于又一个前端框架 Solid ?性能直逼原生 JS ?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/429528

相关文章

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

Vuex Actions多参数传递的解决方案

《VuexActions多参数传递的解决方案》在Vuex中,actions的设计默认只支持单个参数传递,这有时会限制我们的使用场景,下面我将详细介绍几种处理多参数传递的解决方案,从基础到高级,... 目录一、对象封装法(推荐)二、参数解构法三、柯里化函数法四、Payload 工厂函数五、TypeScript