JS如何调用WebAssembly编译出来的.wasm文件


Posted in Javascript onNovember 05, 2020

WebAssembly也叫浏览器字节码技术 这里就不过多的解释了网上很多介绍

主要是让大家知道在js里面如何调用执行它,我之前看WebAssemblyAPI时候反正是看得一脸懵逼

也是为了大家能更快的入手这个比较新的技术吧

这边写的一个dom是官方推荐的c/c++编译的

c代码

int add (int x, int y) {
 return x + y;
 }
 
 int square (int x) {
 return x * x;
 }

属性c但是对字节码不熟悉的朋友可能会不理解,为什么没有main函数

这里主要是把这个c代码当成一个模块调用不需要它自己执行所以没有,官方也有有main函数的能直接生成js和html但是太过雍于,

这种方式比较推荐,也是让js能直接调用比较方便

之后使用 emscripten进行编译 emcc math.c -Os -s WASM=1 -s SIDE_MODULE=1 -o math.wasm

然后就有math.wasm文件了,如果没装emscripten的话我博客里面有一篇是关于安装的

有了math.wasm文件后就该用js调用它了

新建math.html加入调用的方法如下:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
</head>
<body>
 <h1>

 </h1>
 <script>
 /**
 * @param {String} path wasm 文件路径
 * @param {Object} imports 传递到 wasm 代码中的变量
 */
  function loadWebAssembly (path, imports = {}) {
   return fetch(path) // 加载文件
   .then(response => response.arrayBuffer()) // 转成 ArrayBuffer
   .then(buffer => WebAssembly.compile(buffer))
   .then(module => {
    imports.env = imports.env || {}

    // 开辟内存空间
    imports.env.memoryBase = imports.env.memoryBase || 0
    if (!imports.env.memory) {
    imports.env.memory = new WebAssembly.Memory({ initial: 256 })
    }

    // 创建变量映射表
    imports.env.tableBase = imports.env.tableBase || 0
    if (!imports.env.table) {
    // 在 MVP 版本中 element 只能是 "anyfunc"
    imports.env.table = new WebAssembly.Table({ initial: 0, element: 'anyfunc' })
    }

    // 创建 WebAssembly 实例
    return new WebAssembly.Instance(module, imports)
   })
  }
  //调用
  loadWebAssembly('./math.wasm')
  .then(instance => {
   const add = instance.exports._add//取出c里面的方法
   const square = instance.exports._square//取出c里面的方法

   console.log('10 + 20 =', add(10, 20))
   console.log('3*3 =', square(3))
   console.log('(2 + 5)*2 =', square(add(2 + 5)))
  })

 </script>
</body>
</html>

我这里的路径math.html和math.wasm是同级的

现在就可以打开浏览器查看了 但是fetch方法在本地是不能使用的它是网络请求 所有这里需要来个web服务器

打开终端之间键入 npm install -g serve

下载web服务器

然后serve . 启动

有点的 .

启动完成效果:

JS如何调用WebAssembly编译出来的.wasm文件

然后通过web服务器访问就能看到调用c方法后的计算结果:

JS如何调用WebAssembly编译出来的.wasm文件

到此这篇关于关于WebAssembly编译出来的.wasm文件js如何调用的文章就介绍到这了,更多相关js调用.wasm文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
[原创]用javascript实现检测指定目录是否存在的方法
Jan 12 Javascript
JavaScript 加号(+)运算符号
Dec 06 Javascript
js获取指定的cookie的具体实现
Feb 20 Javascript
jQuery预加载图片常用方法
Jun 15 Javascript
Javascript 是你的高阶函数(高级应用)
Jun 15 Javascript
解决JS无法调用Controller问题的方法
Dec 31 Javascript
Jquery操作cookie记住用户名
Mar 29 Javascript
仿iframe效果Aajx文件上传实例
Nov 18 Javascript
JavaScript定时器setTimeout()和setInterval()详解
Aug 18 Javascript
10个最优秀的Node.js MVC框架
Aug 24 Javascript
详解vue axios中文文档
Sep 12 Javascript
angularjs 动态从后台获取下拉框的值方法
Aug 13 Javascript
nuxt.js写项目时增加错误提示页面操作
Nov 05 #Javascript
Vue实现Header渐隐渐现效果的实例代码
Nov 05 #Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
Nov 05 #Javascript
Vue2.x和Vue3.x的双向绑定原理详解
Nov 05 #Javascript
nuxt引入组件和公共样式的操作
Nov 05 #Javascript
jQuery列表动态增加和删除的实现方法
Nov 05 #jQuery
nuxt 实现在其它js文件中使用store的方式
Nov 05 #Javascript
You might like
关于PHP中的Class的几点个人看法
2006/10/09 PHP
PHP+DBM的同学录程序(2)
2006/10/09 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
composer.lock文件的作用
2016/02/03 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
JavaScript confirm选择判断
2008/10/18 Javascript
Javascript 类与静态类的实现(续)
2010/04/02 Javascript
文本框输入时 实现自动提示(像百度、google一样)
2012/04/05 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
jQuery插件实现无缝滚动特效
2015/11/24 Javascript
图解js图片轮播效果
2015/12/20 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
js实现鼠标切换图片(无定时器)
2021/01/27 Javascript
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
2019/06/19 Python
Python 占位符的使用方法详解
2019/07/10 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
2020/06/01 Python
通过代码实例了解Python sys模块
2020/09/14 Python
python urllib和urllib3知识点总结
2021/02/08 Python
Python中Qslider控件实操详解
2021/02/20 Python
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
高中生学习总结的自我评价范文
2013/10/13 职场文书
采购类个人求职的自我评价
2014/02/18 职场文书
自习课吵闹检讨书范文
2014/09/26 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python
Python 避免字典和元组的多重嵌套问题
2022/07/15 Python