nodejs 本地化模块
由于nodejs脱离了浏览器的限制、更接近系统,所以难免会遇到调用本地模块(即js调用C/C++)的情况。使用nodejs调用本地模块有多种方案可以实现,例如:
-
IPC
zeromq
、web服务器、WebSocket 等。这种方案的好处是本地化模块和node运行时彼此分离,相互之间影响较小。 -
node-ffi是一个用于使用纯JavaScript加载和调用动态库的Node.js插件。它可以用来在不编写任何C ++代码的情况下创建与本地DLL库的绑定。同时它负责处理跨JavaScript和C的类型转换。
本文内容即为记录node-gyp入门使用
1. 环境搭建
node-gyp模块使用npm
即可简单安装,此外其需要依赖Python 2.7 和 编译工具
其中Python版本必须为 2.7,其作用是生成编译工具需要的配置文件(例如Makefile)。而编译工具视平台不同而有所区别: Make/gcc on Linux | windows-build-tools/VS on Windows | Xcode on OSX
具体安装过程可查看官方的Readme#Installation章节
2. 使用
-
构建项目目录
mkdir my_node_addon cd my_node_addon
-
建立编译配置模板文件(binding.gyp)
-
生成编译配置文件
node-gyp configure
-
编译
node-gyp build
具体使用过程可查看官方的Readme#How to Use章节
3. 开发
node-gyp涉及到nodejs的底层,包括node运行时、V8引擎、libuv,使用C++开发本地模块有点类似于绕过V8引擎编译Javascript环节,直接实现V8虚拟机执行时的机器码。关于node/V8/libuv,可以阅读一下此系列文章
1. HelloWorld
使用node-gyp开发的组件在js层几乎等同于js module,因此在C++的代码中也可以与js module的结构对应。
一个简单JS模块(CommonJS模块规范)的结构可以如下所示:
var str = "Hello World";
// var hi = () => str