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 相关文章推荐
html下载本地
Jun 19 Javascript
js右键菜单效果代码
Jul 21 Javascript
jquery单行文字向上滚动效果的实现代码
Sep 05 Javascript
jQuery带箭头提示框tooltips插件集锦
Nov 17 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
Mar 28 Javascript
第三章之Bootstrap 表格与按钮功能
Apr 25 Javascript
巧用数组制作图片切换js代码
Nov 29 Javascript
深入理解jQuery.data() 的实现方式
Nov 30 Javascript
以BootStrap Tab为例写一个前端组件
Jul 25 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
Feb 26 Javascript
Vue实现星级评价效果实例详解
Dec 30 Javascript
JavaScript队列结构Queue实现过程解析
Mar 07 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
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
php中注册器模式类用法实例分析
2015/11/03 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
js 函数的副作用分析
2011/08/23 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
javascript轮播图算法
2016/10/21 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
vue router 配置路由的方法
2018/07/26 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
详解微信小程序网络请求接口封装实例
2019/05/02 Javascript
详解async/await 异步应用的常用场景
2019/05/13 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
python实现调用其他python脚本的方法
2014/10/05 Python
python批量提交沙箱问题实例
2014/10/08 Python
Python中的进程分支fork和exec详解
2015/04/11 Python
通过数据库对Django进行删除字段和删除模型的操作
2015/07/21 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
对python中的pop函数和append函数详解
2018/05/04 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
Python 如何批量更新已安装的库
2020/05/26 Python
python 5个顶级异步框架推荐
2020/09/09 Python
web字体加载方案优化小结
2019/11/29 HTML / CSS
马智宇结婚主持词
2014/04/01 职场文书
病媒生物防治方案
2014/05/13 职场文书
2015感人爱情寄语
2015/02/26 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
民事二审代理词
2015/05/25 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
如何通过一篇文章了解Python中的生成器
2022/04/02 Python