本篇文章更新時間:2026/03/12
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知或向一介資男的 LINE 社群反應。
如果本站內容對你有幫助,歡迎贊助支持 。
內容目錄
WebAssembly 的缺席與可能的補位:讀《Why is WebAssembly a second-class language on the web?》有感
編輯前言:這篇來自 Mozilla Hacks 的文章,討論了 WebAssembly 雖然技術上進步飛快,卻仍無法像 JavaScript 一樣在 Web 平台上獲得「第一等語言待遇」。如果你也曾想把 Rust、C++ 放到 Web 上跑,卻卡在奇怪的 glue code 與 JS binding,這篇值得一讀。
文章來源:Why is WebAssembly a second-class language on the web?
核心觀點 (Key Takeaways)
- Wasm 雖然快速、強大,但在 Web 上依然被視為「第二等語言」,許多核心能力仍需透過 JavaScript 間接使用。
- 目前最大瓶頸不是 Wasm 本身,而是「開發者體驗不佳」,例如載入流程繁瑣、與 Web API 互動必須靠 JS。
- WebAssembly Component Model 有機會扭轉現況,讓 Wasm 能直接使用 Web API,甚至變成可跨語言共用的標準化 artifact。
深入解析
文章從 WebAssembly 自 2017 推出後的演化談起。無論是 SIMID、GC、例外處理、64-bit memory 等等,Wasm 在「語言能力」上幾乎已經補齊和原生執行環境的差距。但即使如此,它仍未能真正融入 Web 平台。
作者提出了核心問題:
"WebAssembly is a second-class language on the web."
換句話說,Wasm 能做的事情,都必須經過 JavaScript 的「特權能力」中轉,包含:
- 載入代碼的能力(Loading)
- 直接呼叫 Web API 的能力(Using Web APIs)
1. 載入 Wasm 太麻煩了
JavaScript 只需要:
<script src="script.js"></script>
但 Wasm 必須走 instantiateStreaming、一堆 imports、bundler 處理等。但好消息是 esm-integration 正在改善,未來可能直接:
<script type="module" src="module.wasm"></script>
然而作者也提醒:這只是解決「載入」的痛點,真正的大魔王其實在下一步。
2. Wasm 無法直接使用 Web API
從 JS 呼叫 console.log 是:
console.log("hello, world");
但在 Wasm 世界,等於要寫一個迷你工程:
- 準備記憶體
- 編碼字串
- 自己寫 wrapper JS
- 透過 imports 呼叫回 JS
這就是俗稱的 glue code — 既麻煩,又會拖慢效能。
文章引用一個經典測試:在一個 Rust + Dodrio DOM benchmark 中,如果移除 JS glue,Wasm 操作 DOM 的速度快了 45%。這足以顯示 glue code 是真正的效能瓶頸。
更重要的是:
最後你永遠還是得理解 JavaScript。
這讓「只想寫 Rust/C++/Go 的開發者」很沮喪,也阻止 Wasm 在一般開發者之間普及。
WebAssembly Component Model:可能的終局解答?
作者指出的關鍵是:我們需要一個標準化、跨語言、可直接在瀏覽器執行的 Wasm artifact。
這聽起來很理想化,但 WebAssembly Components 正是為此誕生。
它能帶來什麼?
- 不再需要 JS glue
- Wasm 可以直接使用 Web API(透過 WIT 介面定義)
- 語言之間的互操作變得容易
- 可以像 JS 一樣用
<script type="module">直接載入
作者甚至示範了「只用 Wasm 就能呼叫 console.log」的未來想像:
component {
import std:web/console;
}
再配合 Rust 程式:
console::log("hello, world");
最後:
<script type="module" src="component.wasm"></script>
結束。完全沒有 JavaScript。
對於混合應用(JS + Wasm)場景,Components 也提供跨語言 interface,讓 JS 可以像使用普通 module 一樣載入 Wasm component 並直接呼叫。
筆者心得與啟發
讀完這篇文章,我最深的感受是:Wasm 的問題不是效能,而是體驗。
在 Web 生態裡,JavaScript 天生擁有平台特權,這是歷史背景造成的優勢,但也讓 Wasm 永遠像在打補丁。
作者提出的 WebAssembly Components,讓我重新看到一條出路:
- 開發者不必再同時理解 JS 與自己的語言
- 不同語言可以「共用」一套 Web API 揉合層
- 工具鏈不需要自己編 JS glue
如果這套模式順利推廣,未來的 Web 可能真的不會再被 JavaScript 壟斷,而是回到最初萬維網所追求的多樣性:任何語言都能是 Web 的一等公民。
對於我這類喜歡 Rust、Go、C++ 的開發者來說,這不只是降低門檻,更是讓 Web 生態真正向「多語言共存」邁進的一大步。
