WebAssembly 与 Rust 编程系列04 WebAssembly模块的加载和运行

WebAssembly 与 Rust 编程系列04 WebAssembly模块的加载和运行

About: 简介

前两篇文章中:
WebAssembly 与 Rust 编程系列02 WebAssembly 调试工具的安装及使用
WebAssembly 与 Rust 编程系列03 手撕 WebAssembly 文本格式
我们手写了简单的wat代码,以及生成对应的wasm 二进制模块;

本篇文章主要演示下:如何在js中加载和使用这些模块;

这里我们只是用最简单示例,并没有多大工程参考意义,仅仅是演示WebAssembly相关概念;

wasm模块

针对本篇文章,我们特地写了 wasm_load_usage.wat,
主要是定义和导出了一个add函数
导入了js的console.log函数,并调用log

(module
  (import "console" "log" (func $log (param i32)))
  
  (func $add (param $lhs i32) (param $rhs i32) (result i32)
    get_local $lhs
    get_local $rhs
    i32.add)
  (export "add" (func $add))

  (func (export "wasmLog")
    i32.const 13
    call $log)
)

同之前一样,生成wasm模块

wat2wasm wasm_load_usage.wat -o wasm_load_usage.wasm 

加载wasm模块

  • 简单的index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Webassembly模块加载及运行</title>
  <
</head>
<body>
  
  <script type="text/javascript" src="index.js"></script></body>
</body>
</html>
  • 对应的 index.js
let jsObject = {
  console: {
    log: function(arg) {
      console.log(arg);
    }
  }
};

fetch('wasm_load_usage.wasm')
.then(res =>
  res.arrayBuffer()
).then(bytes =>
  WebAssembly.instantiate(bytes, jsObject)
).then(results => {
  results.instance.exports.wasmLog();
});
  • 我们使用fetch,加载wasm模块,该函数返回一个Response对象
  • 使用 arrayBuffer 把响应转换为带类型数组
  • 使用 WebAssembly.instantiate()函数一步实现编译和实例化带类型数组

获取wasm 示例化的函数

上面的代码中,我们使用 WebAssembly.instantiate()函数一步实现编译和实例化带类型数组,
我们可以根据 instance.exports 获取示例导出的函数

results.instance.exports.wasmLog();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值