SolidJS 十年
到今天为止,我开源 SolidJS 已经七年了。我开源 SolidJS 并非出于什么崇高的目的,也不是想给别人指条明路,更不是想改变世界。我只是有点小小渴望而已。我在网上看到的一些关于细粒度响应式(当时并没有人这么叫它)的讨论让我很恼火。总觉得哪里不对劲,虽然我大可以窝在扶手椅里,继续当那个对着云朵大喊大叫的老人,但我决定参加一个基准测试来证明事实并非如此。
正因为如此,我们才有了今天的 SolidJS。嗯,这还关系到我和其他一些人接下来七年的生活。但故事要从那之前的几年说起。
开源之旅
SolidJS 并非我的第一个开源项目。我的起步是在 13 年前我工作过的 Vidigami 公司(注: Vidigami 是 Vidigami 的缩写)的指导下。他们维护并构建了开源库,我承认我当时并不太在意。多年来,我在 Visual Studio 中使用 .NET 工作,已经习惯了自己的工作流程,如果代码没有 IntelliSense 和文档的直接链接,我会觉得很枯燥。当然,没有。2012 年的时候,Sublime Text Editor 还没有这个功能。
很早以前,我那位非常有耐心的老板(也是Knockback的创始人)就让我坐下来,对我说:“Ryan,你知道吗,如果你不知道某个东西是怎么运作的,你随时可以进入模块,查看源代码。” 很明显,我知道。但突然间,一个全新的世界向我敞开了大门。我不禁回想起 90 年代末,我第一次通过点击“查看源代码”来学习制作网站时的情景。
尽管如此,我并没有急于创建 PR。直到我接到任务,要更新我们的应用程序以使用 Web 组件,我才感受到任何归属感。也正是在那时,我终于让开源为我所用。我找到了包含所需 polyfill 的库。我内部也做了一些自己的库。我利用这些经验创建了我的第一个库:component-register
一种使用函数式组合而不是类来编写 Web 组件的方法,以及webcomponent-router
一个使用光影 DOM 投影的嵌套路由器。
React 的巨大崛起
时间快进几年,现在已经是 2015 年秋季了。我最近看了 Ryan Florence 的 React Hype 演讲:
我看了股票行情演示,我一直在想,“谁会从服务器一遍又一遍地发送整页数据?React 在这里速度非常快,但你已经输了。”
我不知道该如何用我心爱的 KnockoutJS 来解决这个问题。我知道这无关紧要,但我就是放不下它。我看了 Pete Hunt 和团队早期关于 React 的演讲,心想:“这怎么可能是我们能做的最好的事情呢?” 然而,Knockout 已经死了,而我看到到处都有人涌向 React。
卑微的出身
2015 年夏天,我女儿出生后不久,我开始着手构建后来成为 SolidJS 的反应式库。我发现自己整夜不眠,思绪不断回到这个问题上。大多数时候,我都会在下班后偶尔琢磨一下,直到假期我才最终把它整理好。
又花了几个月的时间才完成一个基本的渲染器。我提交到一个名为“framework”的私人 BitBucket 中,SolidJS 在那里找到了它的第一个归宿。说实话,它看起来很像 Vue(带有类似的“s-if”绑定),只是像 Knockout 一样,我使用了可组合信号而不是配置对象。它也没有 VDOM。我使用了与 Knockout 相同的方法进行细粒度的数据绑定。
我查阅了所有能找到的基准测试。有些测试速度很快,但有些(包括 Ryan 的测试)速度很慢,或者编写起来很复杂。接下来的两年里,我尝试了各种方法来了解哪些方法性能高,哪些方法性能低。我不断改进 API(包括切换到 JSX),直到 2018 年初某个时候,Solid 在所有我能找到的基准测试中都超越了所有流行的解决方案。我终于准备好正式提交了。为此,我需要发布这个库,于 2018 年 4 月 24 日发布了。
果然,SolidJS 的初始版本在 JS 框架基准测试中一跃而上。当然,维护人员礼貌地告诉我,我作弊了。因此,我又尝试了几次,才解决了一些常见的问题。直到2019 年我生日那天,SolidJS 才真正名副其实地登上了榜首。
认真对待事情
现在看来,我当时可能会直接放弃,然后回到椅子上,继续抱怨 Knockout 的美好时光。但在开源项目和实现我的目标之间,发生了一些事情。Dan Abramov 于 2018 年 10 月 26 日登台,向全世界揭开了 Hooks 的神秘面纱:
我从未想过 React 会推广可组合原语。它看起来就像 SolidJS。我最终选择 JSX 作为我们的模板语言,因为它与我们的函数组件非常契合,具有可移植性。Solid 组件只是运行一次且没有内部状态的函数,因此与 React 不同,类对我们来说毫无意义。
而现在,Dan 正在台上展示一个几乎一模一样的东西。现在我有了一个新的任务:证明这个细粒度的模型能够完成所有用 VDOM 能做的事情,而无需 VDOM。我知道性能不是障碍,所以问题在于这个模型是否足够强大。我最初可能是受 Web Components 的启发,又被一个性能演示吓了一跳,但现在我有了真正的东西可以展示。
因此,我在接下来的两年里实现了 Suspense、Transitions、HMR、SSR、Hydration 和 Streaming。这些问题类似,但所需的解决方案与 VDOM 的解决方案完全不同。虽然这些概念并非我们发明,但也没有人用细粒度模型解决过它们。
传播信息
诚然,我之前没有做过任何市场营销。我写过一些技术博客文章,但我不知道如何推广这个项目。自从2008年停用Facebook以来,我甚至没有加入过任何社交媒体平台。所以,当我在2019年12月加入Twitter时,我完全不知道自己会面临什么。
我尝试在 Twitter 上与人交流,但很快发现人们根本不懂我在说什么。他们把我当疯子一样对待,就像要我核实事实一样,找专家来帮忙。我尝试向其他框架作者提出想法,但大多立刻就被否决了。当然也有少数例外,比如 Dominic Gannaway(Inferno 的创始人),但我很清楚,每个解决方案都对自己为自己开辟的空间感到满意。Solid 尤其威胁到了这一点。
我感受到的敌意,并非来自 React 团队,而是来自其他小型库。他们声称,他们能做到的事情 JSX 无法实现,你需要在 DX 体验之间做出明确的选择。React 以某种方式塑造了生态系统,而其他所有库都强化了这些界限,而我试图打破这些界限。我们没有理由不能兼顾以上所有,并且做得比现有更好。
普通开发者已经经历了几年的 JavaScript 疲劳,这在当时还是一个新鲜话题,所以谁也不想看到新的框架。人们很生气。我被指责这样做是为了在我所在的大公司里晋升。当时这家公司是 eBay,讽刺的是,我的日常工作是开发另一个 JS 框架 Marko。
是的,我遇到了一些摩擦,而且我对社交媒体不太熟悉,无法理解HTMX到底是怎么想的。不管你有没有实质内容,表情包总是占上风。


鸡与猪——创作者自我推销的困境
Ryan Carniato 为《这就是学习》撰稿 ・ 2021 年 4 月 22 日
平心而论,我并不认为自己是在自我推销。我只是在公开场合学习和构建。我会写文章,做一些长时间的、不太适合市场的直播。我并不觉得自己创造了什么,而是发现了一些显而易见的东西,只要把所有东西都摆在你面前就行了。
信号和细粒度渲染能够实现 VDOM 所能实现的一切功能,并且 DX 性能与 VDOM 类似甚至更好。一个可以通过差异化解决的问题,很可能通过不进行差异化就能得到更好的解决。每个人都一心想开辟自己的空间,以至于他们从未想过,这些界限是否是我们人为设定的。
寻找盟友
我完全靠自己创建了 SolidJS。我加入了 Spectrum 和 Gitter 聊天室,并通过分享我的想法获得了支持,但直到 David Di Biase 伸出援手,我才找到一个愿意投入时间让项目成功的人。随着时间的推移,我们陆续引入了其他有空参与项目的人。首先是 Alexandre、Milo、Ryan、Dan、Nikhil,后来又加入了许多其他人。
我们利用 OpenCollective 赞助了两场黑客马拉松(SolidHack),以引入生态系统中缺失的部分,例如组件库。我们将捐款投入到 Solid Fellowship 计划,以支持开发工具和文档等重要项目。我们与内容创作者建立了友谊,他们乐于接受新想法,例如 Jason Lengstorf、Theo Browne 和 Jack Herrington。我开始在各种会议上发言,并结识来自世界各地的 Solid 拥护者,例如 Daniel 和 Atila。
但最重要的是,我们只是继续做着我们正在做的事情。我们在2021年夏天发布了1.0版本。这将引发一场我刚开始时从未预料到的革命。
无处不在的信号
2015年,绝对没人会说“Knockout 总是对的”。说真的,2018年,甚至2020年,也很少有人会这么说。因为除了启发了 SolidJS 的诞生之外,这和 Knockout 几乎没有什么关系。到了2025年,你很难找到一个流行的前端库无法正常工作,或者正在迁移到像 SolidJS 那样工作。2018年,这种情况还为时过早,而现在,除了 React 之外,几乎所有知名框架都纷纷加入进来。那么,发生了什么呢?
这一切并非一朝一夕就能实现的。我直面现实的呼喊引起了一群听众的特别关注。框架作者们。正是我关于 SolidJS 的文章让我被 eBay 聘用,也正是这些文章,其中许多是偶然通过一个主要讨论 Angular 的出版物(感谢@layzee)发表的,才让我的作品出现在了 Angular 团队的面前。这开启了我与 Pawel Kozlowski 长达数年的对话,最终促成了 Angular Signals 的诞生。
我说服了 Misko Hevery,信号正是他在 Qwik 中实现真正可恢复性所缺少的。我们曾就信号带来的一些性能问题与 Jason Miller(Preact)和他的团队进行过激烈的争论。在经历了早期的反对之后,我说服了 Evan You(Vue)和 Rich Harris(Svelte),让他们相信细粒度渲染才是未来的发展方向,之后他们又创建了 Svelte Runes 和 Vue Vapor。Vue 即将放弃虚拟 DOM,而 Svelte 也放弃了全编译器的运行时响应式方法。现在,两者的输出与 SolidJS 的输出几乎毫无区别。甚至现在甚至还有针对浏览器的信号的 TC-39 提案。
唯一不信服的受众是 React,但平心而论,这个解决方案从来都不适合他们。它的诞生源于他们不接受所有结论。这些年来,我从 React 中学到了很多东西,但如果你不挑战基本的假设,你就无法进步。
SolidJS 的又一个十年
开源是一件很有趣的事情。在过去的五年里,我很幸运地得到了eBay、Netlify和Sentry等公司的支持,可以全身心投入其中。但对我来说,一开始并非如此,也并非每个人都能做到。这需要时间,需要耐心,而且往往得不到回报。人们对它的批评就像对付费产品的批评一样,却没有意识到大多数人的努力并没有得到任何经济回报。这意味着我们无法用同样的方式评判一个项目的健康状况或人们对这些项目的投入程度。
到目前为止,这个项目已经成为我生活中很重要的一部分。现在看到 Hacker News(他们从来没变过)上的评论,担心我会放弃这个项目,真是有点好笑。2015 年的时候,他们等了多久才赶上 React 的潮流……不到两年?难道我们这个行业真的老了?那些鼓吹变革的人现在都这么害怕变革了吗?
关于 SolidJS 的未来,有人讨论说,现在 Svelte 和 Vue 已经变得几乎一模一样了,我们就此完蛋了吗?我们是否成功实现了我最初的目标?
我们确实成功了。但对我来说,六年前我就实现了这个目标。剩下的只是惯性追赶不可避免的结果。过去几年里,我的整个视角都在成长和改变。我们并非生活在真空中,而是不断从周围的事物中学习。我们并没有停滞不前,等待着别人迎头赶上。
SolidJS 发布与其他解决方案发布之间的时间差,恰好相当于 jQuery 和 React 首次发布之间的时间差。这段旅程还处于起步阶段。想象一下,如果我们拥有 React 多年来探索这个方向所拥有的资源,那会是怎样的景象。我必须努力证明,我们能够做到其他解决方案能做到的一切。如果我们把这些努力投入到解锁该模型独有的、其他解决方案甚至无法想象的功能上,结果会怎样?
这让我保持忙碌,也为项目指明了方向。Web 开发仍有改进的空间,这激励着我。如果我们在充满敌意的环境中凭借一己之力取得的成就令人钦佩,那么想象一下,如果有更多的人生活和工作在这个领域,我们能取得怎样的成就。这仅仅是旅程的开始。
诚然,大多数选择前端框架的开发者并不清楚该如何构建一个框架。他们甚至可能认为语法才是最重要的特性。但最终还是需要有人来创造真正的技术,而这值得我们去探索和投入。
文章来源:https://dev.to/this-is-learning/a-decade-of-solidjs-32f4