大家好迁匠!今天我要向大家介紹一個(gè)封裝 WebAssembly 的工具——Quick WebAssembly JS,希望能夠幫助到更多的開(kāi)發(fā)者渠啤。
介紹
Quick WebAssembly JS 是一個(gè)可以快速封裝 WebAssembly 的代理工具類(lèi)态贤。通過(guò)使用它端辱,我們可以更輕松地將 WebAssembly 與 JavaScript 進(jìn)行集成得哆。
快速開(kāi)始
準(zhǔn)備 WebAssembly 資源
首先脯颜,我們需要準(zhǔn)備好 WebAssembly 資源。我們可以使用 Emscripten 工具來(lái)編譯 C/C++ 代碼并導(dǎo)出我們需要的 API。
- Emscripten 工具安裝指引:https://emscripten.org/docs/getting_started/downloads.html
舉個(gè)例子,我們有一個(gè)名為 fib.cc
的 C++ 代碼谭期,用于計(jì)算斐波那契數(shù)列的第 n 位。
fib.cc
#include <emscripten.h>
extern "C" {
EMSCRIPTEN_KEEPALIVE
int fib(int n) {
// 斐波那契數(shù)列的第 n 位
int i, t, a = 0, b = 1;
for (i = 0; i < n; i++) {
t = a + b;
a = b;
b = t;
}
return b;
}
}
在使用 Emscripten 編譯時(shí)矾芙,需要添加一些必要的編譯選項(xiàng)。下面是一個(gè)示例編譯指令:
emcc fib.cc -sWASM=1 -sMAIN_MODULE=2 -sEXPORTED_FUNCTIONS=['_malloc','_free'] -sEXPORTED_RUNTIME_METHODS=['UTF8ToString','stringToUTF8'] --no-entry -o fib.js
請(qǐng)注意近上,這里的編譯選項(xiàng) -sWASM=1 -sMAIN_MODULE=2 -sEXPORTED_FUNCTIONS=['_malloc','_free'] -sEXPORTED_RUNTIME_METHODS=['UTF8ToString','stringToUTF8'] --no-entry
是必須的剔宪,以確保正確導(dǎo)出所需的函數(shù)和運(yùn)行時(shí)方法。
安裝 npm 包
接下來(lái)戈锻,我們需要安裝 Quick WebAssembly JS 的 npm 包歼跟。在命令行中運(yùn)行以下命令進(jìn)行安裝:
npm install quick-wasm-js
創(chuàng)建 QuickWebAssemblyFactory 工廠類(lèi)
安裝完成后和媳,我們可以開(kāi)始使用 Quick WebAssembly JS格遭。首先,我們需要?jiǎng)?chuàng)建一個(gè) QuickWebAssemblyFactory 工廠類(lèi)留瞳,并指定我們使用 Emscripten 編譯的 WebAssembly 資源的路徑拒迅。
import { QuickWebAssemblyFactory } from "quick-wasm-js";
// 這里 JS 和 Wasm 資源都是相對(duì)于當(dāng)前 Web 頁(yè)面的路徑去請(qǐng)求的。
const manager = await new QuickWebAssemblyFactory().createManager("./fib.js", "./fib.wasm");
開(kāi)始使用代理對(duì)象
現(xiàn)在她倘,我們已經(jīng)準(zhǔn)備好了 Quick WebAssembly JS璧微,并創(chuàng)建了代理對(duì)象的管理器。我們可以開(kāi)始使用代理對(duì)象了硬梁。
console.log(await fibManager.fib(12)); // 輸出 233
在這個(gè)示例中前硫,我們調(diào)用了代理對(duì)象的 fib
方法來(lái)計(jì)算斐波那契數(shù)列的第 12 位,并將結(jié)果輸出到控制臺(tái)荧止。
從上述代碼屹电,我們可以看到,原本子 C++ 的 fib 函數(shù)被集成到了 JS 中跃巡,并且以異步接口的形式提供給外部調(diào)用危号。
值得注意的是,WebAssembly 實(shí)例其實(shí)已經(jīng)被運(yùn)行在了一個(gè)單獨(dú)的 Worker 線程中素邪。但是外莲,我們卻能在主線程以 Promise 的形式,異步訪問(wèn)對(duì)應(yīng)的接口兔朦。
相關(guān) API
除了基本的代理對(duì)象使用之外偷线,Quick WebAssembly JS 還提供了一些方便對(duì) WebAssembly 內(nèi)存進(jìn)行操作的 API磨确。
-
createHEAP(data: ArrayBuffer): Promise<number>
:傳入一個(gè) ArrayBuffer,返回
相應(yīng)堆的指針淋昭。
freeHEAP(ptr: number): Promise<boolean>
:傳入堆的指針俐填,釋放內(nèi)存。getHEAP(ptr: number, bytes: number): Promise<ArrayBuffer>
:傳入指針和字節(jié)數(shù)翔忽,獲取相應(yīng)的堆數(shù)據(jù)英融,并以 ArrayBuffer 形式返回。
你可以在 quick-wasm-js API 文檔 中找到更多關(guān)于這些 API 的詳細(xì)信息歇式。
總結(jié)起來(lái)驶悟,Quick WebAssembly JS 是一個(gè)非常方便的工具類(lèi),它可以幫助我們快速封裝 WebAssembly材失,并提供了簡(jiǎn)潔易用的 API痕鳍。希望這個(gè)工具對(duì)大家在 WebAssembly 開(kāi)發(fā)中能夠起到一定的幫助作用。如果你對(duì)這個(gè)工具感興趣龙巨,可以通過(guò)上面提供的鏈接了解更多詳細(xì)信息笼呆。祝大家 Coding 愉快!
GitHub 倉(cāng)庫(kù)地址:https://github.com/Krstar233/quick-wasm-js