网易首页 > 网易号 > 正文 申请入驻

SolidJS把虚拟DOM扔了3年,开发者才发现性能能快这么多

0
分享至


2024年State of JS调研显示,SolidJS的用户留存率高达94%,仅次于Svelte。但让人意外的是,这个"无虚拟DOM"框架的元框架SolidStart,直到最近才被大规模讨论——不是因为新功能,而是有人测完SSR性能后,发现它比Next.js快了将近40%。

这有点像发现你家楼下开了三年的便利店,其实藏着米其林级别的厨房。SolidStart作为SolidJS的官方元框架,把服务端渲染(SSR)、路由、服务器函数打包成开箱即用的工具链。核心卖点就一个:用React式的开发体验,换原生级的运行时性能。

Server Functions:把API端点写成普通函数

SolidStart的「服务器函数(Server Functions)」机制,本质上是一种RPC(远程过程调用)的语法糖。你在文件顶部加一行'use server',普通异步函数就变成了可序列化的服务端接口。

代码层面看,这消除了前后端之间的"翻译层"。

传统全栈开发需要定义路由、写控制器、处理序列化。SolidStart让你直接导出函数,框架自动处理HTTP边界。下面这段示例展示了完整的CRUD操作:

import { db } from './db';

export async function getPosts(query?: string) {

return db.posts.findMany({

where: query ? { title: { contains: query } } : undefined,

orderBy: { createdAt: 'desc' },

take: 20,

export async function createPost(title: string, body: string) {

if (!title || !body) throw new Error('Title and body required');

return db.posts.create({ data: { title, body } });

export async function deletePost(id: string) {

return db.posts.delete({ where: { id } });

注意这里的类型安全——TypeScript定义从前端一直透传到数据库层,不需要额外的OpenAPI或tRPC配置。对于习惯了Next.js App Router的开发者,这种"函数即API"的写法会显著减少样板代码。

路由与数据加载:Suspense的另一种实现

SolidStart的路由系统基于文件约定,但数据加载模式与React生态有明显差异。它用createAsync替代了useEffect + useState的组合,配合SolidJS原生的Suspense实现。

关键区别在于响应式粒度。React的重新渲染以组件为单位,SolidJS则以信号(Signal)为最小更新单元。看这段路由组件代码:

import { createAsync, useSearchParams } from '@solidjs/router';

import { For, Suspense } from 'solid-js';

import { getPosts } from '~/lib/api';

export default function PostsPage() {


const [params] = useSearchParams();

const posts = createAsync(() => getPosts(params.q));

return (

Posts

Loading...

  • {(post) => (

  • {post.title}

createAsync返回的是响应式引用,而非Promise。当params.q变化时,只有依赖该信号的代码路径会重新执行,而非整个组件树。这种细粒度更新在复杂列表场景下,性能差距会被指数级放大。

For组件是SolidJS的循环原语,与React的map渲染相比,它能复用DOM节点而非销毁重建。配合Suspense的流式HTML传输,首屏时间(FCP)和可交互时间(TTI)都有可测量的提升。

细粒度响应式:为什么能跳过虚拟DOM

理解SolidStart的前提,是理解SolidJS的响应式模型。它不依赖虚拟DOM的diff算法,而是在编译阶段将响应式依赖转化为直接的DOM操作指令。

看一个基础计数器示例:

import { createSignal, createMemo, createEffect } from 'solid-js';

export default function Counter() {


const [count, setCount] = createSignal(0);

const doubled = createMemo(() => count() * 2);

createEffect(() => {

console.log('Count changed:', count());

return (

Count: {count()}

Doubled: {doubled()}

setCount(c => c + 1)}>Increment

createSignal创建响应式状态,createMemo派生计算值,createEffect处理副作用。这三个原语构成了完整的响应式系统。与React Hooks的规则约束(只能在顶层调用、依赖数组手动维护)不同,SolidJS的信号可以随处传递、自由组合。

性能优势来自编译时的静态分析。框架知道每个信号被哪些DOM节点引用,更新时直接定位到具体元素,而非遍历虚拟树。内存占用也因此更低——不需要维护两份DOM表示。

这种架构对服务端渲染有特殊意义。虚拟DOM在服务端是纯粹的计算开销,SolidJS的字符串化渲染路径更短,hydration(注水)阶段需要恢复的交互状态也更少。

API Routes与部署适配

SolidStart支持混合路由模式:文件约定路由与显式API路由并存。后者适合需要精确控制HTTP语义的场景:

import { json } from '@solidjs/router';

import type { APIEvent } from '@solidjs/start/server';

import { db } from '~/lib/db';

export async function GET(event: APIEvent) {

const posts = await db.posts.findMany({ take: 50 });

return json(posts);

APIEvent对象提供对原始请求的访问,包括headers、cookies和平台特定扩展。部署层面,SolidStart通过Vinxi构建工具抽象了运行时差异,同一套代码可以输出到Node.js、Deno、Cloudflare Workers或Vercel Edge。

这种"边缘优先"的设计思路,与Next.js的edge runtime策略相似,但实现更轻量。没有庞大的客户端hydration bundle,冷启动时间控制在毫秒级。

社区目前的讨论焦点在于生态成熟度。SolidJS的npm周下载量约为React的0.3%,第三方组件库和招聘市场的稀缺性,是技术选型时的真实阻力。但性能敏感型产品(数据可视化、实时协作工具)的开发者,正在把它作为秘密武器。

一个值得玩味的细节:SolidStart的GitHub仓库里,有用户提交了名为"Why is this not more popular?"的issue。维护者的回复很克制——"We're working on it." 这种技术自信与传播焦虑的落差,或许正是小众框架的常态。你会为了40%的性能提升,接受一套全新的响应式心智模型吗?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
英德同时对美展现立场,特朗普仅剩一条路可走

英德同时对美展现立场,特朗普仅剩一条路可走

史政先锋
2026-03-30 07:11:46
《跑男》:徐艺洋比白鹿高半个头,周洁琼背后瞄白鹿的眼神不友好

《跑男》:徐艺洋比白鹿高半个头,周洁琼背后瞄白鹿的眼神不友好

椰黄娱乐
2026-03-30 13:45:00
福建省委决定,陈长荣履新

福建省委决定,陈长荣履新

新浪财经
2026-03-30 16:44:46
张兰被判欺诈性转移资产,价值2910万美元名画遭美国法院扣押!

张兰被判欺诈性转移资产,价值2910万美元名画遭美国法院扣押!

经理人杂志
2026-03-30 13:50:45
伊朗承认:掌控霍尔木兹海峡的海军司令被击毙

伊朗承认:掌控霍尔木兹海峡的海军司令被击毙

桂系007
2026-03-30 16:48:29
黄维女儿被通知领抗战纪念章,当场愣住:我爸关了27年,还配有这资格?

黄维女儿被通知领抗战纪念章,当场愣住:我爸关了27年,还配有这资格?

文史明鉴
2026-03-27 20:55:10
一人睡遍整个娱乐圈?司晓迪打响了2026年第一炮

一人睡遍整个娱乐圈?司晓迪打响了2026年第一炮

阅毒君
2026-01-05 07:05:06
中央定调,公务员退休3选1,提前退、正常退、满30年退怎么选?

中央定调,公务员退休3选1,提前退、正常退、满30年退怎么选?

浪子阿邴聊体育
2026-03-29 16:00:34
新中国成立初期,四大野战军司令为何纷纷离开老部队?

新中国成立初期,四大野战军司令为何纷纷离开老部队?

我不是沃神
2026-03-30 15:05:03
洪秀柱黄智贤邱毅王炳忠等,建议统一后台湾地区新管理团队名单

洪秀柱黄智贤邱毅王炳忠等,建议统一后台湾地区新管理团队名单

领悟看世界
2026-03-18 01:45:55
俄罗斯军事专家:“最强超级大国已经诞生,美国必须接受现实”

俄罗斯军事专家:“最强超级大国已经诞生,美国必须接受现实”

让生活充满温暖
2026-03-22 16:46:14
万人送行张雪峰,是否会沦为笑柄?

万人送行张雪峰,是否会沦为笑柄?

朋笔生辉
2026-03-29 00:04:44
焕新Model Y车主:统一刷表显是认真的吗?看来电池管理没那么严谨

焕新Model Y车主:统一刷表显是认真的吗?看来电池管理没那么严谨

华庭讲美食
2026-03-30 06:32:46
张雪峰自曝每天就睡两个小时,助理非要给他买除颤仪

张雪峰自曝每天就睡两个小时,助理非要给他买除颤仪

金牌娱乐
2026-03-29 08:06:36
更新One UI 8.5后,三星Galaxy S22-25等手机无法正常使用跨设备分享功能

更新One UI 8.5后,三星Galaxy S22-25等手机无法正常使用跨设备分享功能

凤凰网科技
2026-03-30 16:23:07
生育大局已定:如不出意外,2026年起中国人口将迎来3大变化

生育大局已定:如不出意外,2026年起中国人口将迎来3大变化

蜉蝣说
2026-03-17 15:58:31
又感慨,“这下中国超级大国地位更稳了”

又感慨,“这下中国超级大国地位更稳了”

观察者网
2026-03-30 11:12:23
《西游记》中的10个冷知识,你都知道吗?

《西游记》中的10个冷知识,你都知道吗?

北梦一
2026-03-30 11:32:41
西方集体改口!中国不再解释,直接亮出四张硬核底牌

西方集体改口!中国不再解释,直接亮出四张硬核底牌

Thurman在昆明
2026-03-29 19:59:52
笑死我了!一位三年级小朋友趁妈妈洗澡的缝隙时间,和豆包的对话

笑死我了!一位三年级小朋友趁妈妈洗澡的缝隙时间,和豆包的对话

夜深爱杂谈
2026-03-21 19:50:42
2026-03-30 17:31:00
野生运营
野生运营
懂点产品,懂点AI,正在努力给平淡日子搞点新花样。
466文章数 5关注度
往期回顾 全部

科技要闻

DeepSeek性能异常问题已解决,服务恢复

头条要闻

单套最低5400万 北京豪宅暴雷几十户业主办不了房产证

头条要闻

单套最低5400万 北京豪宅暴雷几十户业主办不了房产证

体育要闻

想进世界杯,意大利还要过他这一关

娱乐要闻

单依纯凌晨发长文道歉!李荣浩再回应

财经要闻

油价冲击,有些亚洲货币先扛不住了!

汽车要闻

理想i9要来了!外形似小号MEGA 能冲击高端纯电市场?

态度原创

家居
旅游
时尚
健康
公开课

家居要闻

东方法式美学 现代简约

旅游要闻

赴泰旅游价格或上涨,泰国拟向外国游客收300泰铢

来到1980的周也,好毛利兰

干细胞抗衰4大误区,90%的人都中招

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版