為什麼 WebAssembly 仍是網頁上的「二等公民」?讀後筆記

本篇文章更新時間: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 生態真正向「多語言共存」邁進的一大步。


Share:

作者: Chun

WordPress 社群貢獻者、開源社群推廣者。專注於 WordPress 外掛開發、網站效能最佳化、伺服器管理,以及 iDempiere 開源 ERP 導入與客製開發。曾參與 WordCamp Taipei 等社群活動,GitHub Arctic Code Vault Contributor。提供資訊顧問、WordPress 開發教學、主機最佳化與企業 ERP 整合服務。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon