码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 看看CabloyJS是如何异步加载并执行go wasm模块的


    介绍

    CabloyJS提供了一个内置模块a-wasmgo,将go wasm模块的异步加载运行机制进行了封装,使我们可以非常方便的在CabloyJS项目中引入go wasm,从而支持更多的业务场景开发

    下面,我们以测试模块test-party为例,演示引入go wasm模块并运行需要哪几个步骤

    效果演示

    • 请直接打开此演示页面:https://test.cabloy.com/#!/test/party/wasm_go

    1. 准备工作

    1. 安装go环境:参见 https://go.dev/doc/install

    2. 创建CabloyJS项目:参见 https://cabloy.com/zh-cn/articles/guide-quick-start.html

    3. 安装test-party演示套件:参见 https://store.cabloy.com/zh-cn/articles/test-party.html

    2. 开发一个go wasm模块

    2.1 go源码

    src/suite-vendor/test-party/modules/test-party/front/src/assets/wasm/demo.go

    package main
    
    import (
    	"fmt"
    	"syscall/js"
    )
    
    func main() {
    	fmt.Println("Hello, World!")
    	alert := js.Global().Get("alert")
    	alert.Invoke("alert!")
    }
    
    1. fmt.Println:在控制台输出一个字符串

    2. js.Global().Get(“alert”):获取网页中的window.alert方法

    3. alert.Invoke:执行alert方法

    2.2 编译wasm

    进入源码所在目录,将demo.go编译为demo.wasm

    $ cd src/suite-vendor/test-party/modules/test-party/front/src/assets/wasm/
    $ GOOS=js GOARCH=wasm go build -o demo.wasm demo.go
    
    • 更详细说明,请参见go官方文档:https://github.com/golang/go/wiki/WebAssembly

    3. 加载并运行wasm

    测试模块test-party提供了一个演示页面,页面路径为:http://localhost:9092/#!/test/party/wasm_go

    该页面提供了两个加载并运行wasm的方法:

    3.1 两步执行

    src/suite/test-party/modules/test-party/front/src/pages/wasm_go.jsx

    import wasmDemo from '../assets/wasm/demo.wasm';
    ...
    async onPerformRun1() {
      // go
      let action = {
        actionModule: 'a-wasmgo',
        actionComponent: 'sdk',
        name: 'go',
      };
      const go = await this.$meta.util.performAction({ ctx: this, action });
      // load wasm
      action = {
        actionModule: 'a-wasmgo',
        actionComponent: 'sdk',
        name: 'loadWasm',
      };
      const item = { source: wasmDemo };
      const wasmResult = await this.$meta.util.performAction({ ctx: this, action, item });
      // run
      await go.run(wasmResult.instance);
    },
    
    1. 内置模块a-wasmgo是异步模块,提供了一个sdk组件,用于封装异步加载并运行wasm的逻辑。因此需要通过调用performAction方法异步加载a-wasmgo模块,并调用其中的方法

    2. 第一步,调用performAction取得go实例

    3. 第二步,调用performAction异步加载demo.wasm模块

    4. 调用go.run执行wasm模块的实例

    3.2 一步执行

    src/suite/test-party/modules/test-party/front/src/pages/wasm_go.jsx

    import wasmDemo from '../assets/wasm/demo.wasm';
    ...
    async onPerformRun2() {
      // load&run wasm
      const action = {
        actionModule: 'a-wasmgo',
        actionComponent: 'sdk',
        name: 'run',
      };
      const item = { source: wasmDemo };
      await this.$meta.util.performAction({ ctx: this, action, item });
    },
    
    1. 调用performAction时,直接传入demo.wasm模块,从而一次完成加载与运行的逻辑

    附:performAction说明

    • action
    名称 说明
    actionModule 模块名称,此处为a-wasmgo
    actionComponent 模块提供的组件,此处为sdk
    name 需要调用的方法名称,此处有以下可选值:go/loadWasm/run
    • item
    名称 说明
    source wasm模块的url地址,此处为wasmDemo,指向'../assets/wasm/demo.wasm'

    相关链接

    • 文档:https://cabloy.com/

    • 演示:https://test.cabloy.com/

    • GitHub源码仓库: https://github.com/zhennann/cabloy

  • 相关阅读:
    某瑞集团安全技术研发岗位面试
    学生个人网页设计作品:旅游网页设计与实现——成都旅游网站4个页HTML+CSS web前端网页设计期末课程大作业 学生DW静态网页设计 学生个人网页设计作品
    MUI UI Kit Design System for Figma
    e签宝,再「进化」
    四、在pycharm中添加.gitignore文件的语法使用详解
    ubuntu安装后配置
    (附源码)ssm产品裂变管理系统 毕业设计 100953
    java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
    【车间调度】基于粒子群算法求解生产调度问题附matlab代码
    Vue原理及源码设计模式
  • 原文地址:https://www.cnblogs.com/zhennann/p/cabloy-go-wasm.html
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号