首页 > 其他分享 >tinygo webassembly 试用

tinygo webassembly 试用

时间:2023-11-01 09:56:25浏览次数:42  
标签:webassembly tinygo const wasm 试用 go vite

主要是简单测试下tinygo 的使用,同时基于vite 进行web 的集成构建

wasm 生成

注意只测试标注类型支持比较多,其他的就没添加,其他类型的需要自己处理,这点上wasm-pack 处理的比较好

  • main.go
package main
 
//go:wasm-module
//export add
func add(x, y uint32) uint32 {
    return x + y + 100
}
 
//go:wasm-module
//export printName
func printName() int {
    return 1111
}
 
// main is required for the `wasi` target, even if it isn't used.
func main() {}
  • 构建
tinygo build -o main.wasm -target=wasi main.go

web 集成

会有wasm 文件的加载,webassembly 实例的初始化,以及方法的导出使用,这点vite 实际上支持支持wasm 文件的初始化
测试中我直接使用了tinygo 官方的示例,实际上可以参考vite 对于webassembly 支持进行调整

  • package.json
 
{
  "name": "tinygo",
  "version": "1.0.0",
  "type": "module",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "build": "vite build",
    "dev": "vite",
    "preview": "vite preview"
  },
  "devDependencies": {
    "vite": "^4.5.0"
  }
}
  • index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Hello World - Go</title>
  </head>
  <body>
    <!-- 
    The wasm_exec.js must come before our Javascript (index.js), 
    as it defines some global objects 
    -->
    <script type="module" src="./wasm_exec.js"></script> // 此文件是从tinygo 安装中拷贝的,比较重要
    <script type="module" src="./index.js"></script>
  </body>
</html>
  • index.js
    实际上就是调用webassembly 初始化工具类的方法
 
// Imports are from the demo-util folder in the repo
// https://github.com/torch2424/wasm-by-example/blob/master/demo-util/
import { wasmBrowserInstantiate } from "./instantiateWasm.js";
 
import wasmUrl from './main.wasm?url'
 
const go = new Go(); // Defined in wasm_exec.js. Don't forget to add this in your index.html.
 
const runWasmAdd = async () => {
  // Get the importObject from the go instance.
  const importObject = go.importObject;
 
  // Instantiate our wasm module
  const wasmModule = await wasmBrowserInstantiate(wasmUrl, importObject);
 
  // Allow the wasm_exec go instance, bootstrap and execute our wasm module
  go.run(wasmModule.instance);
 
  // Call the Add function export from wasm, save the result
  const addResult = wasmModule.instance.exports.add(2433, 24);
 
  const printName = wasmModule.instance.exports.printName();
  // Set the result onto the body
  document.body.textContent = `Hello World! addResult: ${addResult} -- printName: ${printName}`;
};
runWasmAdd();
  • instantiateWasm.js 是一个工具类
    实际上可以使用vite 的记性呢替代
 
export const wasmBrowserInstantiate = async (wasmModuleUrl, importObject) => {
    let response = undefined;
 
    if (!importObject) {
      importObject = {
        env: {
          abort: () => console.log("Abort!")
        }
      };
    }
 
    if (WebAssembly.instantiateStreaming) {
      response = await WebAssembly.instantiateStreaming(
        fetch(wasmModuleUrl),
        importObject
      );
    } else {
      const fetchAndInstantiateTask = async () => {
        const wasmArrayBuffer = await fetch(wasmModuleUrl).then(response =>
          response.arrayBuffer()
        );
        return WebAssembly.instantiate(wasmArrayBuffer, importObject);
      };
      response = await fetchAndInstantiateTask();
    }
 
    return response;
  };
  • 运行效果
yarn dev

 

  • 构建
yarn build

 

说明

vite 对于webassembly 的支持还是比较方便的,可以快速的进行项目打包

参考资料

https://tinygo.org/docs/guides/webassembly/wasi/
https://vitejs.dev/guide/features.html#webassembly
https://tinygo.org/docs/guides/webassembly/wasm/

标签:webassembly,tinygo,const,wasm,试用,go,vite
From: https://www.cnblogs.com/rongfengliang/p/17802366.html

相关文章

  • java webassembly 集成试用
    wasmerio这个组织实现了不少webassembly周边的工具,以下是一个简单的java集成试用安装命令因为java包默认没有发布到中央仓库,需要自己本地安装localmavenmvninstall:install-file-Dfile=./wasmer-jni-amd64-darwin-0.3.0.jar-DgroupId=org.wasmer-Dartifac......
  • 代码 测试用例 测试用例 测试结果 26. 删除有序数组中的重复项
    给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通......
  • ffmpeg实现视频的分割生成测试用的图片视频和音频
    测试代码如下:#!/bin/bash#提示用户输入参数read-p"请输入要切分的MP4文件名:"filenameread-p"请输入要生成的视频数量:"video_countread-p"请输入视频文件的大小范围(单位MB,例如10-20):"video_size_rangeread-p"请输入要生成的图片数量:"image_countread-......
  • opencv wasm 试用
    基于webassembly的opencvnodejs开发是一个很不错的体验,不用考虑nodeaddon的各种问题,而且性能也不错以下是基于echamudi/opencv-wasm构建的4.8.1版本的试用,代码来自opencv-wasm的示例demo试用pacakge.json {"name":"opencv-wasm","version":......
  • emscripten基于llvm的webassembly 编译器
    emscripten是一个基于llvm的webassembly编译器包含的特性可移植支持编译现有的c,c++以及其他语言项目,使用lvvm编译为支持nodejs,浏览器,以及wasm运行时运行的服务提供apis支持将openGL转换为WebGL,pthreads转换为webapi。。。快速集成了不少工具(llvm,emscripten,binar......
  • graalvm 23.1.0 python 试用
    graalvm23.1.0开始python集成也做为一个独立的包了,同时官方文档也有一些安装说明,比如下载包的,基于pyenv的目前pyenv的是不成功的(repo似乎还没更新)安装直接使用安装包,直接可以github下载,包含了不同的版本,直接可以下载企业版使用参考代码app.py print("demo")运行可以通过gr......
  • graalvm 23.1.0 独立nodejs docker 镜像&简单试用
    graaljsdocker镜像很简单就是下载官方包,集成下,然后进行一些简单的配置DockerfileFROMdebian:bullseye-backportsLABELauthor="rongfengliang"LABELemail="[email protected]"WORKDIR/opt/RUN/bin/cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime\&&am......
  • Python给你一个字符串,你怎么判断是不是ipv4地址?手写这段代码,并写出测试用例【杭州多测
    ipv4地址的格式:(1~255).(0 ~255).(0 ~255).(0 ~255)1.正则表达式importredefcheck_ip(one_str):compile_ip=re.compile('^(([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$')ifcompile_ip.match(one_str):......
  • 基于测试数据、测试方法和测试执行的测试用例设计
    测试用例的重要性不言而喻,如何让测试用例设计的更好、更有效是所有测试团队需要深入研究的问题。一般来说,测试用例的设计可以分为三个方向,测试数据的用例设计、测试方法的用例设计和测试执行的用例设计。接下来我们将从这三个方面一一讲解。基于测试数据的测试用例设计边界值分......
  • 安装卸载测试用例
    安装测试用例1.   启动安装程序序号01功能描述测试自动启动安装程序用例目的测试系统是否能够自动启动安装程序测试类型安装测试前提条件程序的安装文件已经存在安装盘,电脑安装了CD-ROM或其他光驱测试方法与步骤输入插入系统的安装盘期望输出电脑能自动播放安装盘的内容测试结......