无需 React:用 Vanilla JavaScript 构建极简 UI
You don't need React: creating a minimal UI library in Vanilla JavaScript
你是否觉得 React 过于臃肿?这篇文章展示了如何用纯粹的 Vanilla JavaScript 从零构建一个轻量级 UI 库。作者通过实际代码演示,剥离了框架的复杂依赖,回归 Web 开发的本质。你会发现,在没有虚拟 DOM 和庞大生态的情况下,依然能实现高效、可维护的组件化开发。这不仅是一次技术实验,更是对现代前端开发范式的一次反思:我们真的需要 React 吗?
你不需要 React:用原生 JavaScript 也能构建出功能完备的极简 UI 库。
HN 评论区
110- afavour
我觉得 React 被过度使用了,但每次看到那种“用这个宠物级小项目来替代它”的博文,我就忍不住叹气,因为你知道接下来的反应肯定是“那 X 功能怎么办”,而当然,那个迷你框架根本不支持。
我发现完美的平衡点是 Astro 搭配 Preact。你不可避免地会遇到一些复杂的功能(比如联系表单),这时可以依赖 Preact 来处理。但对于绝大多数内容为主的网站,你完全可以直接用 Astro,彻底跳过客户端的臃肿部分。
前端开发评论的标准免责声明:你的项目可能不同。博客或购物网站与完整的 Gmail 风格 Web 应用有着截然不同的需求。并不需要一个放之四海而皆准的答案。
- torginus
> 即时模式(immediate mode)唯一潜在的问题是性能,因为每次状态变化我们都需要重新渲染整个 UI。
注意在任务列表示例中,如果你在输入框里留了一些文字然后勾选一个任务,你的文字就会被擦除。
如果我们真的能把 DOM 当作即时模式 UI 来处理,那就根本不需要 React/Preact/Svelte/Solid 等框架了。但事实证明,存在不少像这样的怪癖,使得这种简单的替代方案无法正常工作。
(话虽如此:我完全支持这类实验,无论是为了学习、娱乐,还是为了探索未被开发的框架设计空间!)
- jakelazaroff
其实浏览器自带了一个极简 UI 库。它叫 HTML + CSS + JS。
其实根本不需要任何包装器——你只用 HTML 描述你想要的东西,再用 CSS 让它看起来漂亮。
只有构建复杂组件时才需要用 JS 来做 UI。
案例研究:我尝试用 Codex 将一款旧的 pygame 策略游戏移植到 Web 上。Codex 决定不需要任何库,直接“裸奔”使用原生 HTML。它成功复刻了旧 UI 的视觉和感觉,代码非常简单且易于维护。只用 CSS 做这件事听起来有点繁琐,但确实可行,而且老实说,它看起来比任何 UI 库都更易维护。
- killerstorm
SPA(单页应用)这个概念在大多数时候其实挺不幸的。如果你看看最受欢迎的网站列表:
https://en.wikipedia.org/wiki/List_of_most-visited_websites
基本上它们都可以拆解为:
- 评论/推荐/图片列表(有时是树状结构),进行虚拟化和懒加载
- 一个视频
- 一个评论框
讽刺的是,这些用 HTML 语义化表示超级简单(HTML 本来就是为此而生的)。
“虚拟化和懒加载”这部分本该成为 HTML 标准(或者更广泛地说,是部分页面更新,比如提交评论时),那样的话我们几乎就没什么理由去写 JavaScript 了。
React 的讽刺之处在于,它把 HTML 搞得一团糟,却允许你发送自己的语义模型(JSON/JS),然后在客户端将其解包成一些展示用的 HTML。
这一点被 React 对虚拟化的支持极其糟糕的事实进一步加剧了,因为它假设你把“状态”放在内存(RAM)中,而你不得不费尽周折去使用第三方库来处理部分状态和部分渲染。
编辑:
看来我不是唯一这么想的人,Chrome/W3C 似乎也在尝试类似的东西:
https://developer.chrome.com/blog/declarative-partial-update...
但这本该在 1999 年左右就成为 W3C 标准了。
- assimpleaspossi
我经营了一家 Web 开发公司几十年。我们创建的两个网站,我敢打赌你肯定访问过,所以我们不是那种只做一次性小项目的作坊。我们从未觉得有必要或想要使用 React。我们也无法理解为什么其他人要用它。相比于直接使用 Web 编程的基本元素,它太大了,也太复杂了。就这样。