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 相关文章推荐
DOM精简教程
Oct 03 Javascript
Js 订制自己的AlertBox(信息提示框)
Jan 09 Javascript
JavaScript 替换Html标签实现代码
Oct 14 Javascript
JavaScript中清空数组的三种方法分享
Apr 07 Javascript
Dom 结点创建 基础知识
Oct 01 Javascript
浅析Js中的单引号与双引号问题
Nov 06 Javascript
实现非常简单的js双向数据绑定
Nov 06 Javascript
js插件dropload上拉下滑加载数据实例解析
Jul 27 Javascript
jQuery给指定的table动态添加删除行的操作方法
Oct 12 Javascript
详解Vue前端生产环境发布配置实战篇
May 07 Javascript
vue登录以及权限验证相关的实现
Oct 25 Javascript
JavaScript实现Tab选项卡切换
Feb 13 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
大师制作的中短波矿石收音机
2020/04/02 无线电
咖啡语言
2021/03/03 咖啡文化
php access 数据连接与读取保存编辑数据的实现代码
2010/05/12 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
PHP制作用户注册系统
2015/10/23 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
GreyBox技术总结(转)
2010/11/23 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
jQuery Real Person验证码插件防止表单自动提交
2015/11/06 Javascript
jquery实现具有嵌套功能的选项卡
2016/02/12 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
jQuery居中元素scrollleft计算方法示例
2017/01/16 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
微信小程序实现手指拖动选项排序
2020/04/22 Javascript
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
2020/02/20 Python
keras load model时出现Missing Layer错误的解决方式
2020/06/11 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
2020/07/13 Python
HTML+CSS3 模仿Windows7 桌面效果
2010/06/17 HTML / CSS
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
车间工艺员岗位职责
2013/12/09 职场文书
纪念建党演讲稿范文
2014/01/13 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
销售团队获奖感言
2014/08/14 职场文书
大学军训通讯稿
2015/07/18 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers