WebAssembly (Wasm) 與 JavaScript
您是否曾經想過,是否可以在不犧牲 JavaScript 提供的可移植性和安全性的情況下,在 Web 上執行高效能應用程式?不用再疑惑了!隨著 WebAssembly (Wasm) 的引入,現在可以在仍然利用 JavaScript 強大功能的同時,為 Web 應用程式帶來類似原生的效能。在本文中,我們將探討 WebAssembly 的基礎知識,以及如何將其與 JavaScript 結合使用以開啟新的可能性。
什麼是 WebAssembly (Wasm)?
WebAssembly,通常稱為 Wasm,是一種專為 Web 瀏覽器設計的二進位制指令格式。它是一個低階虛擬機器,能夠以接近原生的速度執行程式碼。Wasm 是 Mozilla、Google、Microsoft 和 Apple 等主要瀏覽器廠商合作開發的,其目標是將高效能應用程式引入 Web。
WebAssembly 的主要優點之一是它與多種程式語言相容,使其成為 Web 開發的通用解決方案。您可以使用 C++、Rust 甚至 TypeScript 等語言編寫程式碼,然後將其編譯為 Wasm 二進位制格式,該格式可以直接在瀏覽器中執行。
WebAssembly 與 JavaScript 的整合
WebAssembly 為 Web 開發帶來了諸多好處。它允許開發者以接近原生的速度執行計算密集型任務,使其適合需要高效能執行的應用程式。透過利用 WebAssembly,開發者可以將用 C++、Rust 或 TypeScript 等語言編寫的現有程式碼庫移植到 Web,而不會犧牲效能。
WebAssembly 與 JavaScript 的整合實現了兩種語言之間的無縫互動。JavaScript 充當橋樑,提供了一個方便的介面來處理 WebAssembly 模組。這允許開發者將 WebAssembly 的強大功能與豐富的 JavaScript 庫和框架的生態系統和靈活性相結合。
雖然 WebAssembly 是一種獨立技術,但它可以與 JavaScript 無縫整合,允許開發者在一個應用程式中結合兩種語言的優勢。JavaScript 充當 Web 平臺和 WebAssembly 模組之間的粘合劑,提供了一個方便的介面來與編譯後的程式碼進行互動。
JavaScript 提供了載入 WebAssembly 模組的必要 API。fetch API 用於檢索二進位制檔案,生成的 ArrayBuffer 傳遞給 WebAssembly.instantiate 函式。此函式非同步編譯模組並返回一個例項,其中包含模組的匯出函式和記憶體。透過訪問這些匯出函式,JavaScript 可以呼叫 WebAssembly 模組提供的功能。
為了演示這種整合,讓我們考慮一個簡單的例子。我們將編寫一個計算斐波那契數列的 Wasm 模組,然後從 JavaScript 呼叫此模組。
步驟 1:編寫 WebAssembly 模組
讓我們首先用 C++ 編寫斐波那契計算邏輯。將以下程式碼儲存到名為 fibonacci.cpp 的檔案中:
#include <emscripten.h> extern "C" { int EMSCRIPTEN_KEEPALIVE fibonacci(int n) { if (n <= 1) { return n; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } }
說明
在此程式碼中,我們有一個 C++ 函式 fibonacci,它遞迴地計算斐波那契數列。EMSCRIPTEN_KEEPALIVE 宏用於確保匯出該函式,並可以從 JavaScript 訪問。
步驟 2:編譯 WebAssembly 模組
要將 C++ 程式碼編譯為 WebAssembly,我們將使用 Emscripten 工具鏈。在終端中執行以下命令:
emcc fibonacci.cpp -s WASM=1 -o fibonacci.wasm
此命令將生成 fibonacci.wasm 檔案,其中包含編譯後的 WebAssembly 模組。
步驟 3:從 JavaScript 呼叫 WebAssembly
現在我們有了 WebAssembly 模組,讓我們從 JavaScript 呼叫它。將以下程式碼儲存到 HTML 檔案 index.html 中:
示例
<!DOCTYPE html> <html> <head> <script> const fetchAndInstantiate = async () => { const response = await fetch('fibonacci.wasm'); const buffer = await response.arrayBuffer(); const module = await WebAssembly.instantiate(buffer); const instance = module.instance; const fibonacci = instance.exports.fibonacci; const result = fibonacci(10); console.log('Fibonacci(10):', result); }; fetchAndInstantiate(); </script> </head> <body> </body> </html>
說明
在此程式碼中,我們使用 fetch API 檢索 fibonacci.wasm 檔案並將其轉換為 ArrayBuffer。然後,我們使用 WebAssembly.instantiate 例項化 WebAssembly 模組,並從模組的例項中獲取匯出的 fibonacci 函式。最後,我們使用引數 10 呼叫 fibonacci 函式並將結果記錄到控制檯中。
步驟 4:執行示例
要執行示例,請在 Web 瀏覽器中開啟 HTML 檔案。開啟瀏覽器的開發者控制檯,您應該看到輸出 Fibonacci(10): 55。這證實了 WebAssembly 模組已成功從 JavaScript 載入並執行。
結論
WebAssembly 是一項強大的技術,它為高效能 Web 應用程式開闢了新的可能性。透過結合 WebAssembly 和 JavaScript 的優勢,開發者可以利用現有程式碼庫,使用較低級別的語言編寫效能關鍵部分,並將它們無縫整合到 Web 專案中。憑藉 WebAssembly 的靈活性和可移植性,Web 平臺有望成為運行復雜應用程式的更強大的環境。