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 相关文章推荐
28个JS验证函数收集
Mar 02 Javascript
javascript实现微信分享
Dec 23 Javascript
javascript验证邮件地址和MX记录的方法
Jun 16 Javascript
jquery实现动静态条形统计图
Aug 17 Javascript
简述Matlab中size()函数的用法
Mar 20 Javascript
JavaScript兼容性总结之获取非行间样式案例
Aug 07 Javascript
js 轮播效果实例分享
Dec 28 Javascript
利用node.js如何搭建一个简易的即时响应服务器
May 28 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
Aug 30 Javascript
express.js中间件说明详解
Mar 19 Javascript
vue的三种图片引入方式代码实例
Nov 19 Javascript
解决Vue 刷新页面导航显示高亮位置不对问题
Dec 25 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 n个不重复的随机数生成代码
2009/06/23 PHP
php和nginx交互实例讲解
2019/09/24 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
通过正则表达式获取url中参数的简单实现
2016/06/07 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
2018/09/05 Javascript
Bootstrap 按钮样式与使用代码详解
2018/12/09 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
python 如何停止一个死循环的线程
2020/11/24 Python
Python基于execjs运行js过程解析
2020/11/27 Python
美国嘻哈文化生活方式品牌:GLD
2018/04/15 全球购物
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
工程概预算专业毕业生求职信
2013/10/04 职场文书
党风廉设责任书
2014/04/16 职场文书
家长建议怎么写
2014/05/15 职场文书
小学数学教研活动总结
2014/07/01 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
交通安全主题班会
2015/08/12 职场文书
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis