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 相关文章推荐
Jquery实现的tab效果可以指定默认显示第几页
Oct 16 Javascript
使用原生js写的一个简单slider
Apr 29 Javascript
jQuery实现个性翻牌效果导航菜单的方法
Mar 09 Javascript
jQuery Pagination分页插件使用方法详解
Feb 28 Javascript
vue.js选中动态绑定的radio的指定项
Jun 02 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
Jun 23 Javascript
three.js搭建室内场景教程
Dec 30 Javascript
Vue-cli项目部署到Nginx服务器的方法
Nov 01 Javascript
JS call()及apply()方法使用实例汇总
Jul 11 Javascript
vue 监听 Treeselect 选择项的改变操作
Aug 31 Javascript
js实现移动端图片滑块验证功能
Sep 29 Javascript
小程序实现左滑删除的效果的实例代码
Oct 19 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产生随机字符串函数
2006/12/06 PHP
Php 构造函数construct的前下划线是双的_
2009/12/08 PHP
学习php设计模式 php实现模板方法模式
2015/12/08 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
基于jquery 的一个progressbar widge
2010/10/29 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
JavaScript中setTimeout和setInterval函数的传参及调用
2016/03/11 Javascript
老生常谈javascript的类型转换
2016/10/12 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
浅谈vue+webpack项目调试方法步骤
2017/09/11 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
vue 组件开发原理与实现方法详解
2019/11/29 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python科学计算之NumPy入门教程
2017/01/15 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
2018/01/04 Python
scrapy spider的几种爬取方式实例代码
2018/01/25 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
python的debug实用工具 pdb详解
2019/07/12 Python
Python logging设置和logger解析
2019/08/28 Python
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
机械工程系毕业生求职信
2013/09/27 职场文书
小学开学寄语
2014/01/19 职场文书
主题婚礼策划方案
2014/02/10 职场文书
银行奉献演讲稿
2014/09/16 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
初中历史教学反思
2016/02/19 职场文书