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 相关文章推荐
图片按比例缩放函数
Jun 26 Javascript
JavaScript关于select的相关操作说明
Jan 13 Javascript
javascript图像处理—仿射变换深度理解
Jan 16 Javascript
JS获取html对象的几种方式介绍
Dec 05 Javascript
详解vue-cli开发环境跨域问题解决方案
Jun 06 Javascript
js链表操作(实例讲解)
Aug 29 Javascript
微信小程序中setInterval的使用方法
Sep 29 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
Sep 14 Javascript
Element ui 下拉多选时新增一个选择所有的选项
Aug 21 Javascript
转换layUI的数据表格中的日期格式方法
Sep 19 Javascript
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
js中Map和Set的用法及区别实例详解
Feb 15 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
1982年日本摄影师镜头下的中国孩子 那无忧无虑的童年
2020/03/12 杂记
PHP 中的一些经验积累
2006/10/09 PHP
PHP 中的批处理的实现
2007/06/14 PHP
php计算十二星座的函数代码
2012/08/21 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
2013/09/30 PHP
php while循环得到循环次数
2013/10/26 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
分享php邮件管理器源码
2016/01/06 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
2017/10/19 PHP
Laravel框架FormRequest中重写错误处理的方法
2019/02/18 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
var与Javascript变量隐式声明
2009/09/17 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
javascript输出AscII码扩展集中的字符方法
2016/12/26 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
React中jquery引用的实现方法
2017/09/12 jQuery
vue中element-ui表格缩略图悬浮放大功能的实例代码
2018/06/26 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
微信小程序搜索功能(附:小程序前端+PHP后端)
2019/02/28 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
利用python爬取散文网的文章实例教程
2017/06/18 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
2014年资料员工作总结
2014/11/18 职场文书
幼师小班个人总结
2015/02/12 职场文书
2015年学生会干事工作总结
2015/04/09 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
2016年小学中秋节活动总结
2016/04/05 职场文书
2016年五一国际劳动节活动总结
2016/04/06 职场文书