文档章节

如何在Node.js中使用WebAssembly

yushulx
 yushulx
发布于 2018/08/14 11:18
字数 272
阅读 73
收藏 0

WebAssembly的一个优点是编译生成的wasm文件,既可以用于Web客户端,也可以用于运行在任何操作系统的Node.js服务端。

编译

创建一个简单的test.c:

#include <stdlib.h>
#include <stdint.h>
#include <emscripten.h>

EMSCRIPTEN_KEEPALIVE
int add(int a, int b) {
  return a + b;
}

使用Emscripten编译生成test.js和test.wasm文件

emcc test.c -O2 -s WASM=1 -Wall -s MODULARIZE=1 -o test.js

Node.js应用

创建index.js:

const Module = require('./test.js');
const wasm = Module({wasmBinaryFile: 'test.wasm'});
wasm.onRuntimeInitialized = function() {
    console.log(wasm._add(40, 40));
};

通过onRuntimeInitialized事件可以知道wasm文件已经被加载完了。接下来就可以调用C的接口。

Web应用

在HTML页面中导入test.js

<script src="test.js">

监听wasm文件的加载状态:

var wa_add;
if (Module) {
    wasm = Module({
        wasmBinaryFile: 'test.wasm'
    });
    wasm.onRuntimeInitialized = function () {
        document.getElementById('anim-loading').style.display = 'none';
        wa_add = wasm._add;
    };
}

这里的Module已经被定义在test.js中。

webassembly demo

源码

https://github.com/yushulx/webassembly-nodejs

© 著作权归作者所有

yushulx
粉丝 29
博文 107
码字总数 60955
作品 0
杭州
私信 提问
Node.js中的WebAssembly入门

Node.js中的WebAssembly入门 WebAssembly是一种令人兴奋的新语言,许多JavaScript引擎都支持它。WebAssembly有望使编译C和C ++等语言变得更容易在浏览器中运行。不过,我最兴奋的是能够编写优...

幸运券发放
2018/06/20
0
0
「2019 JSConf.Asia - Kas Perch」JS 的未来和 Web 多语言开发

特别说明 这是一个由 simviso 团队对 JSConf.Asia 中关于 WebAssembly 相关话题进行翻译的文档,内容并非直译,其中有一些是译者自身的思考。分享者是 Kas Perch,Cloudflare 的一名开发人员...

qiangdada
08/08
0
0
JavaScript条形码SDK比较:Node.js C/C++扩展 vs WebAssembly

高性能的算法库通常都是用C/C++编写。当你想要用JavaScript来开发条形码商业应用,你有两个选择:1.通过node-gyp来编译一个Node.js C/C++扩展。2.把C/C++代码编译成WebAssembly。这里基于Dyn...

yushulx
2018/08/14
61
0
使用 Rust + WebAssembly 编写 crc32

使用 Rust + WebAssembly 编写 crc32 const POLY = 0xedb88320;const TABLE = makeTable(POLY);const TABLE8 = (function () {const tab = Array(8);for (let i = 0; i < 8; i++) { }tab[0] ......

神机算子
2018/10/23
0
0
Deno 并不是下一代 Node.js

这几天前端圈最火的事件莫过于 ry(Ryan Dahl) 的新项目 deno 了,很多 IT 新闻和媒体都用了标题:“下一代 Node.js”。这周末读了一遍 deno 的源码,特意写了这篇文章。长文预警(5000字,1...

justjavac
2018/06/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL8.0.17 - Multi-Valued Indexes 简述

本文主要简单介绍下8.0.17新引入的功能multi-valued index, 顾名思义,索引上对于同一个Primary key, 可以建立多个二级索引项,实际上已经对array类型的基础功能做了支持 (感觉官方未来一定...

阿里云官方博客
30分钟前
3
0
make4.1降级 make-3.81、2错误

在编译 make-3.82 的时候出现如下错误提示 glob/glob.c:xxx: undefined reference to `__alloca'` 修改 /glob/glob.c // #if !defined __alloca && !defined __GNU_LIBRARY__ # ifdef __GNUC......

Domineering
31分钟前
2
0
Rainbond集群的安装和运维的原理

本文将解读Rainbond集群的安装和运维的原理,使用户基本了解Rainbond的安装机制和运维重点,便于用户搭建大型Rainbond集群。 1.Rainbond集群节点概述 1.1 节点分类 属性 类型 说明 manage 管...

好雨云帮
42分钟前
5
0
好程序员大数据学习路线分享UDF函数

1.为什么需要UDF? 1)、因为内部函数没法满足需求。 2)、hive它本身就是一个灵活框架,允许用自定义模块功能,如可以自定义UDF、serde、输入输出等。 2.UDF是什么? UDF:user difine fun...

好程序员官方
45分钟前
4
0
Groovy中 Base64 URL和文件名安全编码

Base64 URL和文件名安全编码 Groovy支持Base64编码很长一段时间。 从Groovy 2.5.0开始,我们还可以使用Base64 URL和Filename Safe编码来使用encodeBase64Url方法对字节数组进行编码。 结果是...

白石
48分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部