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

SolidJS:抛弃虚拟 DOM 的前端框架

文章目录

  • SolidJS:抛弃虚拟 DOM 的前端框架
    • 它怎么工作的
    • 关键特性
    • 和 React 的区别
    • 适合什么场景

SolidJS:抛弃虚拟 DOM 的前端框架

过去十年,虚拟 DOM 几乎成了前端框架的标配。React 带火了这个概念,Vue、Preact 等纷纷跟进,开发者也逐渐把虚拟 DOM 视为性能优化的标准答案。SolidJS 走了另一条路:它没有虚拟 DOM,而是在编译阶段就把 JSX 转换成真实 DOM 操作,运行时只做最小粒度的更新。

SolidJS 在 GitHub 上有超过 3.5 万个 Star。这个数字说明,相当多的开发者对"不用虚拟 DOM"这件事感兴趣。

它怎么工作的

SolidJS 的核心机制是细粒度响应式。写代码时你用createSignal声明状态,框架会自动追踪哪些地方用到了这个状态。当状态变化时,只有依赖它的那段代码会重新执行,整个组件函数不会重新运行。

看一个计数器的例子:

import{createSignal}from"solid-js";functionCounter(){const[count,setCount]=createSignal(0);constdoubleCount=()=>count()*2;return(<button onClick={()=>setCount(c=>c+1)}>Increment:{doubleCount()}</button>);}

这段代码里,count是一个信号,doubleCount是派生状态。点击按钮后,只有doubleCount()这个表达式会重新计算,按钮的其余部分保持不动。组件函数本身只执行一次。

SolidJS 的编译器会把 JSX 转成高效的 DOM 操作。静态 HTML 被提前提取为模板,动态部分通过insert等方法进行局部更新。生成的代码接近手写原生 JavaScript 的水平。

关键特性

细粒度更新:没有虚拟 DOM diff,没有组件级重渲染。状态变化直接映射到 DOM 操作,跳过了中间的比较步骤。

声明式数据流:用响应式原语建模状态,自动处理依赖追踪。你不需要手动指定哪些组件需要更新。

单次渲染模型:组件函数只执行一次,后续更新由响应式系统驱动。这和 React 的"每次状态变化都重新执行整个组件"有本质区别。

体积小、速度快:SolidJS 的核心包体积很小,完全支持 tree-shaking。在 JS Framework Benchmark 中,它的性能接近原生 JavaScript。

现代功能齐全:JSX、Fragments、Context、Portals、Suspense、流式 SSR、渐进式水合、错误边界、并发渲染,主流框架该有的它都有。

调试友好:在浏览器开发者工具中,你看到的<div>就是真实的 div,不是虚拟节点。这让 DOM 调试变得直观。

和 React 的区别

SolidJS 用 JSX 写法,表面上和 React 很像,但底层逻辑完全不同。

React 中,组件函数在每次状态更新时都会重新执行。useState 返回的值是快照,React 通过重新调用组件函数来生成新的虚拟 DOM,然后做 diff。这意味着即使你只改了一个计数器,整个组件树的相关部分都会重新执行。

SolidJS 中,组件函数只执行一次。createSignal 返回的是响应式引用,状态变化时只有真正读取了这个信号的代码才会重新运行。没有重新执行、没有虚拟 DOM、没有 diff。

举个具体场景:一个列表组件里有 1000 个条目,你修改了其中一个条目的标题。React 会重新执行列表组件函数,生成新的虚拟 DOM 树,然后找出变化的那个节点。SolidJS 只会更新那一个标题对应的 DOM 文本节点。

适合什么场景

SolidJS 适合对性能有要求的项目。如果你的应用有大量的动态内容、频繁的状态更新、或者复杂的列表渲染,SolidJS 的细粒度更新能带来明显的性能提升。

它也适合喜欢 React JSX 语法但对重渲染机制不满的开发者。SolidJS 的心智模型更简单:状态变了,用到它的地方就更新,没用到的就不动。

SolidJS 生态在持续发展。社区提供了响应式原语库 solid-primitives、组件库 Kobalte、以及各种构建时工具。TypeScript 支持也很完善,配置 JSX 的jsxImportSource指向solid-js即可。

快速上手可以用脚手架:

npx degit solidjs/templates/js my-app cd my-app npm install npm run dev

SolidJS 的设计哲学是"用更少的抽象做更多的事"。组件就是函数,渲染完全由状态的使用方式决定,没有隐藏规则。这种务实的态度,加上接近原生的性能表现,让它在前端框架的竞争中占据了一个独特的位置。

更多的事"。组件就是函数,渲染完全由状态的使用方式决定,没有隐藏规则。这种务实的态度,加上接近原生的性能表现,让它在前端框架的竞争中占据了一个独特的位置。

http://www.gsyq.cn/news/1621638.html

相关文章:

  • 【Springboot毕设全套源码+文档】基于springboot无人机农田巡查系统设计(丰富项目+远程调试+讲解+定制)
  • 优必选U1人形机器人12万起步:11万买的是半个人,17万才是完整的
  • BetterJoy终极指南:Switch手柄PC适配与配置优化全攻略
  • 芯片烧录环境指南:静电与洁净度是关键
  • SPI EEPROM在嵌入式系统中的可靠数据存储实践
  • 构建现代化端到端测试体系:Playwright与TypeScript实战指南
  • 如何快速掌握全面战争模组制作:RPFM终极使用指南
  • 基于Si4732与PIC18的高保真数字收音机设计
  • GPT-4参数量与稀疏激活原理深度解析
  • FFmpeg AES-CTR视频加密实战:从原理到代码实现
  • 基于KMX63与STM32的智能手势识别系统设计
  • 如何用biliTickerBuy轻松搞定B站会员购抢票:新手完整教程
  • 音乐爱好者的终极歌词管理方案:163MusicLyrics免费工具深度评测
  • windows上运行程序,提示 应用程序控制策略已阻止此文件,如何去除阻止
  • 基于Si4731与ARM Cortex-M4的嵌入式收音机系统开发
  • 终极RPA文件提取指南:5分钟学会提取Ren‘Py游戏资源
  • 13DOF传感器与PIC18F65K40的嵌入式定位系统设计
  • SRWE终极指南:三步掌握游戏窗口实时编辑,轻松实现高清截图
  • 发现一个紫微命盘详解,十二宫星曜解析,一生运势吉凶工具
  • 如何快速解决Windows热键冲突:完整检测工具指南
  • IMU传感器与微控制器的6DoF姿态追踪实现
  • 基于Si4731与PIC18F57K42的数字调谐收音机设计
  • Airbnb动态定价机器学习实战:从特征工程到收益优化
  • B站会员购抢票神器终极指南:5步快速掌握自动化购票技巧
  • OpenWPM实战:自动化Web隐私与安全测量工具从入门到精通
  • QMCDecode:macOS平台QQ音乐加密音频转换终极解决方案
  • 2026贵港黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
  • OpenTabletDriver终极指南:免费开源跨平台数位板驱动完整教程
  • 走个面儿-UMLChina建模答题赛第7赛季第16轮
  • AI推理服务监控与警报系统构建实战指南