使用 Quick WebAssembly JS 快速封裝 WebAssembly 接口

大家好迁匠!今天我要向大家介紹一個(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。

舉個(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旨别,一起剝皮案震驚了整個(gè)濱河市诗赌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秸弛,老刑警劉巖铭若,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異递览,居然都是意外死亡叼屠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)绞铃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)镜雨,“玉大人,你說(shuō)我怎么就攤上這事儿捧〖晕耄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵纯命,是天一觀的道長(zhǎng)西剥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)亿汞,這世上最難降的妖魔是什么瞭空? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上咆畏,老公的妹妹穿的比我還像新娘南捂。我一直安慰自己,他們只是感情好旧找,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布溺健。 她就那樣靜靜地躺著,像睡著了一般钮蛛。 火紅的嫁衣襯著肌膚如雪鞭缭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天魏颓,我揣著相機(jī)與錄音岭辣,去河邊找鬼。 笑死甸饱,一個(gè)胖子當(dāng)著我的面吹牛沦童,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叹话,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼偷遗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了驼壶?” 一聲冷哼從身側(cè)響起氏豌,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辅柴,沒(méi)想到半個(gè)月后箩溃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瞭吃,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碌嘀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了歪架。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片股冗。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖和蚪,靈堂內(nèi)的尸體忽然破棺而出止状,到底是詐尸還是另有隱情,我是刑警寧澤攒霹,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布怯疤,位于F島的核電站,受9級(jí)特大地震影響催束,放射性物質(zhì)發(fā)生泄漏集峦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塔淤。 院中可真熱鬧摘昌,春花似錦、人聲如沸高蜂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)备恤。三九已至稿饰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間露泊,已是汗流浹背湘纵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滤淳,地道東北人梧喷。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像脖咐,于是被迫代替她去往敵國(guó)和親铺敌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容