Show HN: Nectar——一个类 Rust 的 React,编译为 WebAssembly

Hacker News Top 工具

摘要

Nectar 是一个新型 Web 框架,将类 Rust 代码编译为 WebAssembly,通过 O(1) 信号更新和零依赖构建消除了 JavaScript 依赖。

经历了一段相当艰难的自由职业经历后,我想提醒自己,自己还算是一个勉强有能力的开发者。我最近加入了 Rust 阵营,想要一个比 React 性能更好、更易用的 Rust 等价物。我也想知道能否有效剔除 JavaScript。这个项目就是由此而来……Nectar 是一种编程语言,它将你的整个应用(包括逻辑、状态和渲染)编译为 WebAssembly。JavaScript 被缩减为一个大约 10 KB 的系统调用层,仅用于桥接 WASM 和 DOM。<p>起源:我本想获得 React 风格的操作性并提升性能,但在中途发现,通过浏览器 DOM(Blink/C++)和 diff 步骤所能达到的瓶颈已经到头了。所以我放弃了与之对抗,构建了自己的信号驱动渲染层,它编译为 WASM,并精确更新发生变化的 DOM 节点,复杂度为 O(1),没有虚拟 DOM 和垃圾回收器。<p>目前的特点:<p>- 单一二进制文件。同一个编译器负责格式化、lint、测试、开发服务器、LSP 和 SSR(虽然 SSR 尚不成熟)。 - 细粒度信号。每个绑定独立更新,因此没有 diff 过程。 - 受 Rust 启发的借用检查器,实现编译时安全性。 - 语言级关键字,对应 Web 开发中频繁使用的模式:component、store、router、form、auth、payment。 - SEO 和屏幕阅读器支持。它从同一源码编译为两个 DOM,因此应用对屏幕阅读器和爬虫保持可见。<p>诚实说明(因为该项目尚处早期,且主要由一人开发):<p>- “无 JavaScript” 的说法有个前提。WASM 无法直接操作 DOM,因此存在一个小型 JS 桥接层(约 10 KB),目前我无法在主流浏览器中克服这一点。 - 网站上的数据(计数器约 10 KB,而 React 加 JS 约 387 KB)是真实的,但只是小例子,并非完整应用的对比。请不要过度解读。这些示例故意设计得架构很差,以衡量大规模场景下的吞吐量(刻意为之)。 - 许可证为 BSL 1.1,因此在构建任何实际项目前请先阅读相关条款。<p>实时演示:10,000 个产品配合 Canvas 渲染引擎,以及与 Svelte 5 的并排对比: <a href="https://buildnectar.com/app/canvas" rel="nofollow">https://buildnectar.com/app/canvas</a><p>网站:<a href="https://buildnectar.com" rel="nofollow">https://buildnectar.com</a> 代码:<a href="https://github.com/HibiscusConsulting/nectar-lang" rel="nofollow">https://github.com/HibiscusConsulting/nectar-lang</a><p>我真诚希望被批得体无完肤。如果核心假设是错误的,请粉碎我的梦想,但请告诉我如何改进。我仍然不完全确定这是否是个好主意。老实说,我原本以为构建起来会容易得多。如果一开始就知道难度,我绝对不会去构建它,但事已至此。
查看原文
查看缓存全文

缓存时间: 2026/07/12 19:51

# Nectar — 无需 JavaScript 的 Web 来源:https://buildnectar.com/ Nectar (https://buildnectar.com/) ## 网络需要 JavaScript,但 Nectar 不需要。 Nectar 编译为 WebAssembly。一种语言,一个二进制文件,零依赖。你的整个应用——逻辑、状态、渲染——都在 WASM 中运行。JavaScript 被缩减为一个 10KB 的系统调用层。 注意:Svelte 演示在首次加载 10,000 件商品时可能会超时。如果显示空白,请尝试刷新。 ## 写得更少,交付更快。 ```js // package.json:47 个依赖 // node_modules:1,247 个包 import React, { useState } from 'react'; import ReactDOM from 'react-dom'; function Counter() { const [count, setCount] = useState(0); return ( <div> {count} <button onClick={() => setCount(c => c + 1)}>+</button> </div> ); } ``` ```rust // 无需 package.json。无需 node_modules。 // 单个文件。编译为 WASM。 component Counter() { let mut count: i32 = 0; fn increment(&mut self) { self.count = self.count + 1; } render { <div> {format("{}", self.count)} <button onclick={increment}>+</button> </div> } } ``` ## 与众不同地构建。 ⚙ ### 单个二进制编译器 一个 Rust 二进制文件处理所有事情:编译、格式化、代码检查、测试、开发服务器、LSP、包管理、SSR。无需配置工具链。 ⚡ ### 细粒度信号 每次绑定 O(1) 更新。无虚拟 DOM,无 diff,无协调。当信号变化时,仅更新对应的 DOM 节点。 🔒 ### 编译时安全 受 Rust 启发的借用检查器、类型系统和穷尽模式匹配。在代码发布前捕获错误,而非在生产环境中。 📦 ### 零依赖 无 npm,无 node_modules,无 webpack,无打包工具。你的应用编译为一个 .wasm 二进制文件和一个 3KB 的运行时。仅此而已。 🌐 ### 内置关键字 component、store、router、page、form、auth、payment、upload、db、cache、agent——常见 Web 模式作为语言原语,而非库。 🚀 ### SSR + 边缘部署 同一个 WASM 二进制文件通过 wasmtime 在服务器上运行。内置 SSR、水合,以及部署到 29 个 Cloud Run 区域。 ## Nectar 的工作原理 你的 .nectar 源码编译为 WebAssembly。浏览器加载 .wasm 和一个 10KB 的系统调用层。其余一切均为 WASM。 源文件 .nectar → 编译器 Rust → 输出 .wasm → 运行时 浏览器 JavaScript 运行时 10KB(仅 DOM 系统调用) 虚拟 DOM 无——命令缓冲区 状态管理 WASM 信号——O(1) 借用检查器 编译时安全 node_modules 零。已删除。 GC 暂停 无——线性内存 XSS 攻击 不可能——无 eval Auth 默认 HttpOnly Cookie ## 亲眼目睹运行效果。 10,000 件商品。Canvas 渲染引擎。响应式信号。全部在 WebAssembly 中运行。与 Svelte 5 并排展示。 ## 用 Nectar 构建点什么? 正在试水、想要早期访问,或只是有些想法?留下你的邮箱,我会联系你。这是一个人的项目,所以邮件会直接到我这里。

相似文章

Show HN: 运行于 WebAssembly 的 Firefox

Hacker News Top

Firefox 被编译为在 WebAssembly 中运行,采用基于 WebGL 的渲染和实验性的 JS 到 WASM JIT,网页内容通过 Puter 托管的 Wisp 服务器进行代理。

Show HN: Nibble

Hacker News Top

Nibble 是一种类 C 的系统编程语言,用 3000 行 C 代码实现,无需外部依赖或堆分配即可生成 LLVM IR。它支持 defer、递归、多种类型、结构体、指针,并包含图形演示。