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 相关文章推荐
javascript之水平横向滚动歌词同步的应用
May 07 Javascript
经常用的图片在容器中的水平垂直居中实例
Jun 10 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
Apr 03 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
Jan 13 Javascript
JavaScript声明变量名的语法规则
Jul 10 Javascript
基于OL2实现百度地图ABCD marker的效果
Oct 01 Javascript
最佳的JavaScript错误处理实践
Jul 16 Javascript
Highcharts入门之简介
Aug 02 Javascript
Vue.js实现简单动态数据处理
Feb 13 Javascript
js处理包含中文的字符串实例
Oct 11 Javascript
JavaScript中concat复制数组方法浅析
Jan 20 Javascript
带你使用webpack快速构建web项目的方法
Nov 12 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
模仿OSO的论坛(五)
2006/10/09 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
ExtJS GTGrid 简单用户管理
2009/07/01 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
JS动态添加Table的TR,TD实现方法
2015/01/28 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
列举Python中吸引人的一些特性
2015/04/09 Python
Sublime开发python程序的示例代码
2018/01/24 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
python ChainMap 合并字典的实现步骤
2019/06/11 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
django admin组件使用方法详解
2019/07/19 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
Python实现病毒仿真器的方法示例(附demo)
2020/02/19 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
如何查找和删除数据库中的重复数据
2014/11/05 面试题
《赵州桥》教学反思
2014/02/17 职场文书
《与象共舞》教学反思
2014/02/24 职场文书
学校花圃的标语
2014/06/18 职场文书
法学自荐信
2014/06/20 职场文书
学校门卫岗位职责范本
2014/06/30 职场文书
护士年终考核评语
2014/12/31 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS