Node.js使用WebAssembly
1、簡介
首先,讓我們了解為什么WebAssembly是一個很棒的工具,并學會自己使用它。
WebAssembly是一種類似匯編的高性能語言,可以從各種語言編譯,包括C/C++、Rust和AssemblyScript。目前,Chrome、Firefox、Safari、Edge和Node.js都支持它!
WebAssembly規(guī)范詳細介紹了兩種文件格式,一種是擴展名為.wasm的WebAssembly模塊的二進制格式,另一種是相應的擴展名為.wat的WebAssemblyText格式的文本表示。
2、關鍵概念
- 模塊 - 一個經(jīng)過編譯的WebAssembly二進制文件,即.wasm文件。
- 內(nèi)存 - 可調(diào)整大小的ArrayBuffer。
- 表 - 未存儲在內(nèi)存中的可調(diào)整大小的引用類型數(shù)組。
- 實例 - 模塊及其內(nèi)存、表和變量的實例化。
為了使用WebAssembly,您需要一個.wasm二進制文件和一組API來與WebAssembly通信。Node.js通過全局WebAssembly對象提供了必要的API。
console.log(WebAssembly);
我們在瀏覽器中打印下這個對象,如下圖所示:
3、生成WebAssembly模塊
有多種方法可用于生成WebAssembly二進制文件,包括:
- 手工編寫WebAssembly(.wat),并使用wabt等工具轉換為二進制格式
- 在C/C++應用程序中使用emscripten(https://emscripten.org/)
- 在Rust應用程序中使用wasm-pack(https://rustwasm.github.io/wasm-pack/book/)
- 如果您喜歡類似TypeScript的體驗,請使用AssemblyScript(https://www.assemblyscript.org/)
其中一些工具不僅生成二進制文件,還生成要在瀏覽器中運行的JavaScript“粘合”代碼和相應的HTML文件。
4、如何使用它
如果我們更熟悉TypeScript的體驗,那就通過 AssemblyScript 來試一下
1、我們先安裝一下 AssemblyScript
npm install --save-dev assemblyscript
2、我們通過編譯器對應的腳手架工具,快速生成推薦目錄結構和配置文件
npx asinit .
目錄結果如下:
- ./assembly 包含正在編譯到WebAssembly的AssemblyScript源的目錄。
- ./assembly/tsconfig.json TypeScript配置繼承了建議的AssemblyScript設置。
- ./assembly/index.ts 示例文件正在編譯到WebAssembly中,以便開始使用。
- ./build 生成存儲編譯的WebAssembly文件的工件目錄。
- ./build/.gitignore 從源代碼管理中排除已編譯二進制文件的Git配置。
- ./asconfig.json 定義“調(diào)試”和“發(fā)布”目標的配置文件。
- ./package.json 包含編譯到WebAssembly所需命令的包信息。
- ./tests/index.js 啟動測試,以檢查模塊是否正常工作。
- ./index.html 生成的html文件
3、打開,index.ts 我們在里面寫了一個函數(shù):
export function add(a: i32, b: i32): i32 { return a + b; }
4、然后我們編譯一下
npm run asbuild
一旦有了WebAssembly模塊,就可以使用Node.js WebAssembly對象來實例化它。
// 假設存在 release.wasm文件,該文件aad 包含一個添加2個提供參數(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、打開index.html文件,看一下結果:
<!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>
或者,運行一下測試用例,看下最后的結果也是可以的,如下所示:
5、與操作系統(tǒng)交互
WebAssembly模塊本身無法直接訪問操作系統(tǒng)功能。
可以使用第三方工具Wasmtime(https://docs.wasmtime.dev/)來訪問此功能。
Wasmtime利用WASI(https://wasi.dev/) API來訪問操作系統(tǒng)的功能。
到此這篇關于Node.js使用WebAssembly的文章就介紹到這了,更多相關Node WebAssembly內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Linux下為Node.js程序配置MySQL或Oracle數(shù)據(jù)庫的方法
這篇文章主要介紹了Linux下為Node.js程序配置MySQL或Oracle數(shù)據(jù)庫的方法,這里默認已經(jīng)裝配好了Node環(huán)境然后我們利用npm包管理工具來進行配置,需要的朋友可以參考下2016-03-03nodejs對mongodb數(shù)據(jù)庫的增加修刪該查實例代碼
在本篇文章里小編給大家整理的是一篇關于nodejs對mongodb數(shù)據(jù)庫的增加修刪該查實例代碼,有需要的朋友們可以參考下。2020-01-01Node.js dgram模塊實現(xiàn)UDP通信示例代碼
這篇文章主要介紹了Node.js dgram模塊實現(xiàn)UDP通信示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09