Node.js使用WebAssembly

 更新时间:2023年05月24日 09:05:07   作者:和你一起去月球  
本文主要介绍了Node.js使用WebAssembly,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、简介

首先,让我们了解为什么WebAssembly是一个很棒的工具,并学会自己使用它。

WebAssembly是一种类似汇编的高性能语言,可以从各种语言编译,包括C/C++RustAssemblyScript。目前,Chrome、Firefox、Safari、Edge和Node.js都支持它!

WebAssembly规范详细介绍了两种文件格式,一种是扩展名为.wasm的WebAssembly模块的二进制格式,另一种是相应的扩展名为.wat的WebAssemblyText格式的文本表示。

2、关键概念

  • 模块 - 一个经过编译的WebAssembly二进制文件,即.wasm文件。
  • 内存 - 可调整大小的ArrayBuffer。
  •  - 未存储在内存中的可调整大小的引用类型数组。
  • 实例 - 模块及其内存、表和变量的实例化。

为了使用WebAssembly,您需要一个.wasm二进制文件和一组API来与WebAssembly通信。Node.js通过全局WebAssembly对象提供了必要的API。

console.log(WebAssembly);

我们在浏览器中打印下这个对象,如下图所示:

3、生成WebAssembly模块

有多种方法可用于生成WebAssembly二进制文件,包括:

其中一些工具不仅生成二进制文件,还生成要在浏览器中运行的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 定义“调试”和“发布”目标的配置文件。
  • ./package.json 包含编译到WebAssembly所需命令的包信息。
  • ./tests/index.js 启动测试,以检查模块是否正常工作。
  • ./index.html 生成的html文件

3、打开,index.ts 我们在里面写了一个函数:

export function add(a: i32, b: i32): i32 {
 return a + b;
}

4、然后我们编译一下

npm run asbuild

一旦有了WebAssembly模块,就可以使用Node.js WebAssembly对象来实例化它。

// 假设存在 release.wasm文件,该文件aad 包含一个添加2个提供参数的函数
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、与操作系统交互

WebAssembly模块本身无法直接访问操作系统功能。

可以使用第三方工具Wasmtime(https://docs.wasmtime.dev/)来访问此功能。

Wasmtime利用WASI(https://wasi.dev/) API来访问操作系统的功能。

到此这篇关于Node.js使用WebAssembly的文章就介绍到这了,更多相关Node WebAssembly内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Webpack 实现 Node.js 代码热替换

    Webpack 实现 Node.js 代码热替换

    Webpack有一个很实用的功能叫做热替换(Hot-replace),尤其是结合React Hot Loader插件,开发过程中都不需要刷新浏览器,任何前端代码的更改都会实时的在浏览器中表现出来。
    2015-10-10
  • node.js自动上传ftp的脚本分享

    node.js自动上传ftp的脚本分享

    这篇文章主要给大家介绍了一个关于node.js自动上传ftp脚本的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-06-06
  • node.js入门教程之querystring模块的使用方法

    node.js入门教程之querystring模块的使用方法

    querystring模块主要用来解析查询字符串,下面这篇文章主要介绍了关于node.js中querystring模块使用方法的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • Google官方支持的NodeJS访问API,提供后台登录授权

    Google官方支持的NodeJS访问API,提供后台登录授权

    Google官方支持的NodeJS集成客户端,用以访问Google APIs, 支持OAuth 2.0授信及登录认证。登录以后即可在后台访问例如 Google Drive(云存储), Google Analytics, Gmail等服务。
    2014-07-07
  • 13 个npm 快速开发技巧(推荐)

    13 个npm 快速开发技巧(推荐)

    这篇文章主要介绍了13 个npm 快速开发技巧,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-07-07
  • nodejs实现黑名单中间件设计

    nodejs实现黑名单中间件设计

    最近写的项目中涉及到防止灌水的功能,于是设计了黑名单中间件,跟大家分享一下,同时也希望大家有好的建议能够拍砖.
    2014-06-06
  • 详解在node.js中require方法的加载规则

    详解在node.js中require方法的加载规则

    这篇文章主要介绍了详解在node.js中require方法的加载规则,本文一步步解析了require加载规则,讲述了核心的模块,路径形式的模块,第三方模块等,需要的朋友可以参考下
    2021-06-06
  • nodejs实现获取当前url地址及url各种参数值

    nodejs实现获取当前url地址及url各种参数值

    这篇文章主要介绍了nodejs实现获取当前url地址及url各种参数值,本文直接给出代码实例,需要的朋友可以参考下
    2015-06-06
  • 用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)

    用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)

    这篇文章主要介绍了用纯Node.JS弹出Windows系统消息提示框实例(MessageBox),非常具有实用价值,需要的朋友可以参考下
    2017-05-05
  • NodeJs内存占用过高的排查实战记录

    NodeJs内存占用过高的排查实战记录

    这篇文章主要给大家介绍了关于NodeJs内存占用过高的排查实战记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论