Show HN: Nectar——一个类 Rust 的 React,编译为 WebAssembly
摘要
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: Nub – 类似 Bun 的用于 Node.js 的一体化工具包
Nub 是一个快速的一体化工具包,用于 Node.js,提供类似 Bun 的开发者体验,包括运行 TypeScript 文件、管理依赖项和 Node 版本,所有这些都集中在一个用 Rust 编写的 CLI 工具中。
Show HN: 运行于 WebAssembly 的 Firefox
Firefox 被编译为在 WebAssembly 中运行,采用基于 WebGL 的渲染和实验性的 JS 到 WASM JIT,网页内容通过 Puter 托管的 Wisp 服务器进行代理。
Show HN: Nibble
Nibble 是一种类 C 的系统编程语言,用 3000 行 C 代码实现,无需外部依赖或堆分配即可生成 LLVM IR。它支持 defer、递归、多种类型、结构体、指针,并包含图形演示。
@huihoo: NASA 开源 Rust 开发的符合航空标准的 WebAssembly 解释器 https://github.com/nasa/spacewasm 最近,#Rust 重构、重新实现的开源项目有些多,要挺住
NASA开源了SpaceWasm,这是一个用Rust编写的、符合航空标准的WebAssembly解释器,专为航天器机载环境设计,支持流式解码和确定性内存分配。
@colinhacks: 介绍 Nub。一款全能型 JavaScript 工具包,增强 Node.js(而非试图取代它)
介绍 Nub,一款全能型 JavaScript 工具包,增强 Node.js 而非取代它。