Forge: 一种基于栈的 Web 开发方法"}],
现代 Web 开发领域通常由庞大的框架和复杂的构建流水线主导。然而,一个名为 Forge 的新实验性项目提出了一种激进的变革,它将基于栈的语言原则——特别是受 Forth 启发——应用于网站的创建。
通过将 HTML 生成视为一系列栈操作,Forge 旨在简化开发者定义页面结构和 microformats 的方式,同时利用现代浏览器的能力来提供无缝的用户体验。
核心概念:用于 Web 的 Forth
Forge 的核心是一种基于栈的语言。在传统的命令式语言中,你可能会调用一个带有参数的函数;在 Forge 中,你将值推入栈中,然后调用一个消耗这些值的 "word"(函数)。
例如,在 Forge 中创建一个简单的标题如下:
: h1 ( s -- ) "<h1>" emit . "</h1>" emit ;
"Hello, World!" h1
在这个代码片段中,: h1 定义创建了一个新的 word。字符串 "Hello, World!" 被推入栈中,然后 h1 word 消耗该字符串,将其包装在 <h1> 标签中。这种方法允许开发者构建一个可重用的 word 库,有效地为他们特定的站点架构创建一种领域特定语言 (DSL)。
使用 Microformats 进行高级结构化
Forge 的主要优势之一在于它如何轻松实现像 microformats 这样复杂的 HTML 结构。开发者无需嵌套深层的 divs 和 spans,而是可以定义高-level word 来处理样板代码。
考虑一个博客文章正文的定义:
: post-body
h-entry-start
"<p class='byline'>" emit
"2026-05-21T14:00:00Z" "May 21, 2026" dt-published
" · by " emit
"Beto" "/about" p-author
"</p>" emit
h-entry-end
"On building a tiny stack-based web language." p-summary
"post-content" e-content
"/hello-world" "permalink" u-url ;
"Hello, world!" "post-body" blog-post
通过将 HTML 标签抽象为 h-entry-start 和 p-summary 等 word,代码保持了简洁并专注于内容,而不是标记语言的语法。
混合渲染架构
Forge 采用了一种复杂的部署模型,融合了服务端渲染 (SSR) 和单页应用 (SPA) 的优点。
- 服务端渲染: 一个单一的二进制文件运行网站。当爬虫或首次访问者访问页面时,后端编译器从
.forge文件生成 HTML 并提供服务。这确保了网站对 SEO 友好并兼容 WebMentions。 - 客户端渲染: 一旦网站加载,service worker 会拦截后续的网络请求。当用户导航到新页面(例如
/notes)时,service worker 会获取.forge源文件,并直接在浏览器中运行 WebAssembly 编译的编译器来即时生成 HTML。
这种混合方法提供了 SPA 的即时感,同时又不牺牲静态网站的可访问性。
状态与持久化
Forge 通过在服务器上使用仅追加日志 (append-only log) 来简化后端交互。开发者不再需要复杂的 API 端点和数据库模式,而是可以使用 log-append word 来持久化数据。
例如,一个 "like" 按钮可以实现如下:
: like-button ( -- )
"❤" "do-like" on-click ;
: do-like
"1" "likes:demo" log-append ;
当用户点击按钮时,值 "1" 会被追加到服务器上 likes:demo 主题下的一个 JSONL (JSON Lines) 文件中。这种极简的持久化方法减少了通常与动态 Web 元素相关的开销。
社区反思
该项目引发了关于现代工具在创建 "weird" 实验性语言方面的作用的有趣讨论。一位观察者指出,当前 LLM 辅助编程的时代显著降低了复杂系统的准入门槛:
LLM-based coding is enabling so much! The crazy weekend project now can have compilation to native code and web assembly... without breaking a sweat.
虽然这种语言是实验性的,但它提醒了我们,个人博客——一个用于个人表达的空间——或许是实验非常规编程范式的最佳场所。无论 Forge 是否成为主流工具,还是仅仅作为一个奇观,它都展示了将老派的基于栈的逻辑与 WebAssembly 和 Service Workers 等现代 Web 标准相结合的力量。