Day 11 - wat、wasm 文件 wat2wasm wasm 的 helloworld wasm 的导入

本贴最后更新于 386 天前,其中的信息可能已经斗转星移

image

你首先需要 rust 和 Npm 的环境

WebAssmembly 的两种文件格式

wasm

  • 二进制文件
  • 用于执行

wat

  • 文本文件
  • 用于编写代码
  • 利用 wabt 将 wat 转化成 wasm

wat 文件的格式

image

我们可以利用网站:https://webassembly.github.io/wabt/demo/wat2wasm/将 wat 转化为 wasm

简单的创建一个项目

cmd 执行以下的命令

cargo new --lib wasm_game
mkdir www
cd www
npm install --save-dev webpack-dev-server
npm install --save-dev webpack-cli
npm install --save-dev copy-webpack-plugin

然后我们在 www 中创建文件: index.jswebpack.config.js

const path = require("path");
const CopyWebpackPlugin = require("copy-webpack-plugin");

module.exports = {
  entry: "./index.js",
  output: {
    path: path.resolve(__dirname, "public"),
    filename: "index.js",
  },
  mode: "development",
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: "ts-loader",
        exclude: /node_modules/,
      },
    ],
  },
  resolve: {
    extensions: [".tsx", ".ts", ".js"],
  },
  plugins: [
    new CopyWebpackPlugin({
      patterns: [{ from: "./index.html", to: "./" }],
    }),
  ],
};

package.json

"scripts": {
    "dev": "webpack-dev-server", // 开发网页
    "build":"webpack build" // 打包
},


项目结构: image

使用 wasm

我们直接下载之前网页上的 wasm,然后放在 public 中


async function run(){
    // 加载 wasm 需要时异步加载
    const response = await fetch("test1.wasm")
    const buffer = await response.arrayBuffer();
    const wasm = await WebAssembly.instantiate(buffer, fn_do);
  
    const func = wasm.instance.exports.add;
    let ret = func(3,4);
    console.log(ret);
}

run();

我们也可以让 wasm 执行 js 的函数


async function run(){
    const fn_do = {
        console:{
            log: ()=>{
                console.log("你好")
            },
            error: ()=>{
                console.log("错误")
            }
        }
    }
    // 加载 wasm 需要时异步加载
    const response = await fetch("test1.wasm")
    const buffer = await response.arrayBuffer();
    const wasm = await WebAssembly.instantiate(buffer, fn_do);
  
    const func = wasm.instance.exports.add;
    let ret = func(3,4);
    console.log(ret);
}

run();

我们在网页上写入下列代码:

(module
(import "console" "log" (func $log))
(import "console" "error" (func $error))
(func (export "add") (param i32 i32) (result i32)
local.get 0
local.get 1
call $log
call $error
i32.add))

下载他的 wasm 并且替换之前的 wasm 即可

  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    57 引用 • 22 回帖 • 5 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...