Node.js使用WebAssembly
1、簡(jiǎn)介
首先,讓我們了解為什么WebAssembly是一個(gè)很棒的工具,并學(xué)會(huì)自己使用它。
WebAssembly是一種類似匯編的高性能語(yǔ)言,可以從各種語(yǔ)言編譯,包括C/C++、Rust和AssemblyScript。目前,Chrome、Firefox、Safari、Edge和Node.js都支持它!
WebAssembly規(guī)范詳細(xì)介紹了兩種文件格式,一種是擴(kuò)展名為.wasm的WebAssembly模塊的二進(jìn)制格式,另一種是相應(yīng)的擴(kuò)展名為.wat的WebAssemblyText格式的文本表示。
2、關(guān)鍵概念
- 模塊 - 一個(gè)經(jīng)過(guò)編譯的WebAssembly二進(jìn)制文件,即.wasm文件。
- 內(nèi)存 - 可調(diào)整大小的ArrayBuffer。
- 表 - 未存儲(chǔ)在內(nèi)存中的可調(diào)整大小的引用類型數(shù)組。
- 實(shí)例 - 模塊及其內(nèi)存、表和變量的實(shí)例化。
為了使用WebAssembly,您需要一個(gè).wasm二進(jìn)制文件和一組API來(lái)與WebAssembly通信。Node.js通過(guò)全局WebAssembly對(duì)象提供了必要的API。
console.log(WebAssembly);
我們?cè)跒g覽器中打印下這個(gè)對(duì)象,如下圖所示:

3、生成WebAssembly模塊
有多種方法可用于生成WebAssembly二進(jìn)制文件,包括:
- 手工編寫(xiě)WebAssembly(.wat),并使用wabt等工具轉(zhuǎn)換為二進(jìn)制格式
- 在C/C++應(yīng)用程序中使用emscripten(https://emscripten.org/)
- 在Rust應(yīng)用程序中使用wasm-pack(https://rustwasm.github.io/wasm-pack/book/)
- 如果您喜歡類似TypeScript的體驗(yàn),請(qǐng)使用AssemblyScript(https://www.assemblyscript.org/)
其中一些工具不僅生成二進(jìn)制文件,還生成要在瀏覽器中運(yùn)行的JavaScript“粘合”代碼和相應(yīng)的HTML文件。
4、如何使用它
如果我們更熟悉TypeScript的體驗(yàn),那就通過(guò) AssemblyScript 來(lái)試一下
1、我們先安裝一下 AssemblyScript
npm install --save-dev assemblyscript
2、我們通過(guò)編譯器對(duì)應(yīng)的腳手架工具,快速生成推薦目錄結(jié)構(gòu)和配置文件
npx asinit .
目錄結(jié)果如下:
- ./assembly 包含正在編譯到WebAssembly的AssemblyScript源的目錄。
- ./assembly/tsconfig.json TypeScript配置繼承了建議的AssemblyScript設(shè)置。
- ./assembly/index.ts 示例文件正在編譯到WebAssembly中,以便開(kāi)始使用。
- ./build 生成存儲(chǔ)編譯的WebAssembly文件的工件目錄。
- ./build/.gitignore 從源代碼管理中排除已編譯二進(jìn)制文件的Git配置。
- ./asconfig.json 定義“調(diào)試”和“發(fā)布”目標(biāo)的配置文件。
- ./package.json 包含編譯到WebAssembly所需命令的包信息。
- ./tests/index.js 啟動(dòng)測(cè)試,以檢查模塊是否正常工作。
- ./index.html 生成的html文件
3、打開(kāi),index.ts 我們?cè)诶锩鎸?xiě)了一個(gè)函數(shù):
export function add(a: i32, b: i32): i32 {
return a + b;
}4、然后我們編譯一下
npm run asbuild
一旦有了WebAssembly模塊,就可以使用Node.js WebAssembly對(duì)象來(lái)實(shí)例化它。
// 假設(shè)存在 release.wasm文件,該文件aad 包含一個(gè)添加2個(gè)提供參數(shù)的函數(shù)
async function instantiate(module, imports = {}) {
const { exports } = await WebAssembly.instantiate(module, imports);
return exports;
}
export const {
memory,
add
} = await (async url => instantiate(
await (async () => {
try { return await globalThis.WebAssembly.compileStreaming(globalThis.fetch(url)); }
catch { return globalThis.WebAssembly.compile(await (await import("node:fs/promises")).readFile(url)); }
})(), {
}
))(new URL("release.wasm", import.meta.url));5、打開(kāi)index.html文件,看一下結(jié)果:
<!DOCTYPE html>
<html lang="en">
<head>
<script type="module">
import { add } from "./build/release.js";
document.body.innerText = add(1, 2);
</script>
</head>
<body></body>
</html>
或者,運(yùn)行一下測(cè)試用例,看下最后的結(jié)果也是可以的,如下所示:

5、與操作系統(tǒng)交互
WebAssembly模塊本身無(wú)法直接訪問(wèn)操作系統(tǒng)功能。
可以使用第三方工具Wasmtime(https://docs.wasmtime.dev/)來(lái)訪問(wèn)此功能。
Wasmtime利用WASI(https://wasi.dev/) API來(lái)訪問(wèn)操作系統(tǒng)的功能。
到此這篇關(guān)于Node.js使用WebAssembly的文章就介紹到這了,更多相關(guān)Node WebAssembly內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux下為Node.js程序配置MySQL或Oracle數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Linux下為Node.js程序配置MySQL或Oracle數(shù)據(jù)庫(kù)的方法,這里默認(rèn)已經(jīng)裝配好了Node環(huán)境然后我們利用npm包管理工具來(lái)進(jìn)行配置,需要的朋友可以參考下2016-03-03
Node.js同時(shí)安裝多個(gè)版本及相關(guān)配置指南(簡(jiǎn)單易操作)
在實(shí)際開(kāi)發(fā)過(guò)程中我們可能需要安裝多個(gè)版本的 nodejs,下面這篇文章主要給大家介紹了關(guān)于Node.js同時(shí)安裝多個(gè)版本及相關(guān)配置的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
nodejs對(duì)mongodb數(shù)據(jù)庫(kù)的增加修刪該查實(shí)例代碼
在本篇文章里小編給大家整理的是一篇關(guān)于nodejs對(duì)mongodb數(shù)據(jù)庫(kù)的增加修刪該查實(shí)例代碼,有需要的朋友們可以參考下。2020-01-01
Node.js全局對(duì)象Global的實(shí)現(xiàn)
在Nodejs下全局變量和全局函數(shù)都是可以使用global來(lái)訪問(wèn)到的,本文主要介紹了Node.js全局對(duì)象Global的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
Node.js dgram模塊實(shí)現(xiàn)UDP通信示例代碼
這篇文章主要介紹了Node.js dgram模塊實(shí)現(xiàn)UDP通信示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
在Node.js中實(shí)現(xiàn)文件復(fù)制的方法和實(shí)例
這篇文章主要介紹了在Node.js中實(shí)現(xiàn)文件復(fù)制的方法和實(shí)例,使用FS模塊實(shí)現(xiàn),需要的朋友可以參考下2014-06-06
用Node編寫(xiě)RESTful API接口的示例代碼
本篇文章主要介紹了用Node編寫(xiě)RESTful API接口的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07

