Forge: 一種基於堆疊的網頁開發方法

現代網頁開發領域通常由龐大的框架和複雜的建置流程所主導。然而,一個名為 Forge 的新實驗性專案提出了一種與此常態截然不同的做法,將基於堆疊的語言原則——特別是受到 Forth 啟發——應用於網站的建立。

透過將 HTML 生成視為一系列的堆疊操作,Forge 旨在簡化開發者定義頁面結構和微格式(microformats)的方式,同時利用現代瀏覽器的功能來提供無縫的使用者體驗。

核心概念:用於 Web 的 Forth

Forge 的核心是一種基於堆疊的語言。在傳統的指令式語言中,您可能會帶參數呼叫一個函數;在 Forge 中,您將值推入堆疊,然後呼叫一個「單字」(word,即函數)來消耗這些值。

例如,在 Forge 中建立一個簡單的標題如下:

: h1  ( s -- )  "<h1>" emit  .  "</h1>" emit ;

"Hello, World!" h1

在此程式碼片段中,: h1 的定義建立了一個新的單字。字串 "Hello, World!" 被推入堆疊,而 h1 單字會消耗該字串,將其包裹在 <h1> 標籤中。這種方法允許開發者建立一個可重複使用的單字庫,有效地為其特定的網站架構建立一個領域特定語言(DSL)。

使用微格式進行進階結構化

Forge 的主要優勢之一在於它能輕易地實作複雜的 HTML 結構,例如微格式。開發者不需要嵌套深層的 divspan 層級,而是可以定義高階單字來處理樣板程式碼。

考慮一個部落格文章內容的定義:

: 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-startp-summary 等單字,程式碼保持簡潔,並專注於於內容而非標記語言的語法。

混合渲染架構

Forge 採用了一種精密的部署模型,結合了伺服器端渲染(SSR)和單頁應用程式(SPA)的優點。

  1. 伺服器端渲染: 單一二進位檔執行網站。當爬蟲或初次造訪者訪問頁面時,後端編譯器會從 .forge 檔案生成 HTML 並提供服務。這確保了網站具備 SEO 友善性並與 WebMentions 相容。
  2. 客戶端渲染: 一旦網站載入,服務工作員(service worker)會攔截後續的網路請求。當使用者導航到新頁面(例如 /notes)時,服務工作員會抓取 .forge 原始碼檔案,並直接在瀏覽器中執行 WebAssembly 編譯的編譯器來即時生成 HTML。

這種混合方法提供了 SPA 的即時感,同時又不犧牲靜態網站的可存取性。

狀態與持久化

Forge 透過在伺服器上使用僅限附加(append-only)的日誌來簡身後端互動。開發者不需要複雜的 API 端點和資料庫結構,而是可以使用 log-append 單字來持久化資料。

例如,一個「按讚」按鈕可以如下實作:

: like-button  ( -- )
    "❤"  "do-like"  on-click ;

: do-like
  "1" "likes:demo" log-append ;

當使用者點擊按鈕時,值 "1" 會被附加到伺服器上 likes:demo 主題下的一個 JSONL (JSON Lines) 檔案中。這種極簡的持久化方法減少了通常與動態網頁元素相關的開銷。

社群反饋

該專案引發了關於現代工具在建立「奇怪」實驗性語言時所扮演角色的有趣討論。一位觀察者指出,當前 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 標準結合的力量。 ",

Sources