当前位置: 首页 > 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.jsqmd.com/news/1109663/

相关文章:

  • 【Springboot毕设全套源码+文档】基于springboot无人机农田巡查系统设计(丰富项目+远程调试+讲解+定制)
  • MuleSoft与大语言模型协同的AI编排实践
  • 5分钟搞定!用JoyCon-Driver让Switch手柄秒变PC游戏神器
  • PIC18F87J50驱动WS2812 LED灯带的嵌入式开发实践
  • 企业AI落地分水岭:多智能体工作流与数据基座协同架构
  • 优必选U1人形机器人12万起步:11万买的是半个人,17万才是完整的
  • 模板驱动型文档自动化:零代码实现结构化内容生成
  • MIDAS实时图流异常检测:毫秒级微簇识别技术
  • Windows PDF处理革命:Poppler预编译二进制包终极解决方案
  • BetterJoy终极指南:Switch手柄PC适配与配置优化全攻略
  • 芯片烧录环境指南:静电与洁净度是关键
  • 3个实用场景,让你的惠普OMEN笔记本重获新生
  • GPT-4稀疏激活真相:MoE架构下2%参数调用的原理与工程实践
  • AI自动化视频制作:零基础打造爆款短视频
  • SPI EEPROM在嵌入式系统中的可靠数据存储实践
  • 构建现代化端到端测试体系:Playwright与TypeScript实战指南
  • 如何快速掌握全面战争模组制作:RPFM终极使用指南
  • 基于ESP8266的智能温度显示器设计与实现
  • 091、GSConv 加 VoV-GSCSP 的 Slim-Neck 完整适配代码与参数量对比
  • 基于Si4731与MSP432的数字收音机设计与实现
  • 高中生适合用哪种牌子的台灯?高中生专用台灯品牌断货王,手慢无
  • GPT-5.5 技术决策背后的博弈:OpenAI的商业与技术平衡术
  • 基于Si4732与PIC18的高保真数字收音机设计
  • ChatGPT数据分析报告生成,为什么92%的团队踩坑在数据清洗环节?——金融/零售/制造三大行业避坑指南
  • 基于Si4732与TM4C123的数字收音机系统设计与优化
  • ICM-42688-P与STM32F745VG在工业自动化中的高性能应用
  • MC6470与PIC18LF47K42的6DOF姿态控制系统设计
  • 06-30 · LLM 最新论文速览
  • 无代码搭建本地自动化助手|OpenClaw 2.7.9 双系统实操实录
  • 打造系统化嵌入式学习路径:从入门到进阶的完整技术体系