webassembly入门篇

背景

随着职业的发展看到的东西也越来越多,webassembly也慢慢进入了视野。老哥铁柱公司做渲染用到webassembly、有幸参加掘金前端沙龙线下活动大佬们也在讲webassembly(大佬叫它wasm)等等,wasm有强于js的性能以及各种低级语言(go/c/rust)支持编译的特点。webassembly为后缀为.wasm的二进制文件它可以被js的WebAssembly api调用,对于前端出身的我来说可以预见的是webassembly很重要。

简介

WebAssembly(缩写为Wasm)是一种基于堆栈的虚拟机的二进制指令格式。Wasm 被设计为编程语言的可移植编译目标,支持在网络上部署客户端和服务器应用程序。准确的来说wasm不是一种语言而是一个由go/c/rust等等编译出来的标准协议。wasm具有高效快速、安全的特点。

简单的案例

主要语言毕竟是js,我考虑了两种语言go和rust来开发wasm。go和rust的性能差距不大go能做的rust也能做,因此在后续的学习中更多的是以go为主,毕竟go的上手难度比rust低得多而且有谷歌背书以及市场需求上也比rust高。

go

Go 复制代码
package main

func main() {
	println("adding two numbers:", add(2, 3)) // expecting 5
}

//export add
func add(x, y int) int

//export multiply
func Multiply(x, y int) int {
	return x * y
}

这里说一下,在go中"方法"大写开头是表示导出。

bash 复制代码
// go项目初始化
go mod init XXXX

go代码有了那么就要打包成.wasm文件。需要用到这个工具tinygo

bash 复制代码
// 打包命令
tinygo build -o XXXXX.wasm

项目目录如下:

前端调用wasm计算

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite App</title>
  </head>

  <body>
    <script src="./wasm_exec.js"></script>
    <script>
      const go = new Go(); // Defined in wasm_exec.js
      const WASM_URL = "wasm.wasm";
      var wasm;
      go.importObject.env = {
        add: function (x, y) {
          // 设置go代码执行环境中的方法
          return x + y;
        },
      };

      if ("instantiateStreaming" in WebAssembly) {
        WebAssembly.instantiateStreaming(fetch(WASM_URL), go.importObject).then(
          function (obj) {
            wasm = obj.instance;
            console.log(wasm.exports, wasm.exports.multiply(2, 4)); // 执行go中暴露的方法
            go.run(wasm); // 执行go函数中的main方法
          }
        );
      } else {
        fetch(WASM_URL)
          .then((resp) => resp.arrayBuffer())
          .then((bytes) =>
            WebAssembly.instantiate(bytes, go.importObject).then(function (
              obj
            ) {
              wasm = obj.instance;
              go.run(wasm);
            })
          );
      }
    </script>
  </body>
</html>

对应的说明都在代码注释中了这里主要说下go编译的wasm文件前端要调用需要用到官方提供的一个wasm_exec.js脚本。wasm_exec.js

总结

go开发wasm整体的流程还是比较清晰简单的,往后还会出一篇rust编译wasm的文档。后续就是好好学习go了。

我不管这个世上的人怎麽说我...我只想依照我的信念做事,绝不后悔,不管现在将来都一样!

相关推荐
梦想很大很大4 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰9 小时前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘12 小时前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤13 小时前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt111 天前
AI DDD重构实践
go
Grassto3 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto4 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
狗都不学爬虫_5 天前
JS逆向 -最新版 盼之(decode__1174、ssxmod_itna、ssxmod_itna2)纯算
javascript·爬虫·python·网络爬虫·wasm
程序设计实验室5 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题5 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo