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(1.6.3) 中css方法对浮动的实现缺陷分析
Sep 09 Javascript
为JavaScript类型增加方法的实现代码(增加功能)
Dec 29 Javascript
jquery二级导航内容均分的原理及实现
Aug 13 Javascript
Javascript 浮点运算精度问题分析与解决
Mar 26 Javascript
一个css与js结合的下拉菜单支持主流浏览器
Oct 08 Javascript
AngularJS表单基本操作
Jan 09 Javascript
JS模拟超市简易收银台小程序代码解析
Aug 18 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
Jul 29 Javascript
深入学习js函数的隐式参数 arguments 和 this
Jun 24 Javascript
vue实现多组关键词对应高亮显示功能
Jul 25 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
Apr 13 Javascript
js获取图片的base64编码并压缩
Dec 05 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
Look And Say 序列php实现代码
2011/05/22 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
执行iframe中的javascript方法
2008/10/07 Javascript
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
python实现中文输出的两种方法
2015/05/09 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
Python工程师必考的6个经典面试题
2020/06/28 Python
CSS3 仿微信聊天小气泡实例代码
2017/04/05 HTML / CSS
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
椰子猫砂:CatSpot
2018/08/27 全球购物
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
美国在线家具网站:GDFStudio
2021/03/13 全球购物
介绍一下Make? 为什么使用make
2016/07/31 面试题
质检部岗位职责
2013/11/11 职场文书
员工合理化建议书
2014/05/19 职场文书
基于JavaScript实现年月日三级联动
2021/06/22 Javascript