准备工作
如果熟悉node开发,只是想了解Addon的部分,可以直接略过Node安装部分。
搭建环境
Linux (我用的是Ubuntu 12.04), git, gcc/g++ 4.9以上版本 (由于新的V8版本头文件使用了c11语法,不支持c11语法的gcc编译新版本v8头文件会失败).
Node管理工具
Node管理工具有nvm, n和nvs,nvm应该是大家用得比较多的,最近也刚刚用了一下nvs,看自己的需要和习惯选择一个,在本次试验中需要切换不同的node版本。
安装Node/npm
安装完Node管理工具后,接下来可以安装不同版本node了,安装node会一并安装该node版本对应的npm包管理工具. 按照npmjs社区网站上的解释,npm可以指:
- npm网站
- Package Repository
- npm客户端工具:NodeJS的包管理工具,类似Java里的maven, Ruby里的Gem或者PHP的Pear.
不特别说明,文中提到npm都是指作为NodeJS包管理工具的npm. 关于npm的详细使用,可以参考
安装运行例子所需版本node,顺便安装了一个较新的node 7.2.0版本
nvs add 0.12
nvs add 0.10
nvs ls
>node/7.2.0/x64
node/0.12.17/x64
node/0.10.48/x64
nvs use 0.12
node/7.2.0/x64
>node/0.12.17/x64
node/0.10.48/x64
安装成功后,可以通过下面方法查看node和其中v8对应的版本:
$ node
> process.versions
{ http_parser: '2.7.0',
node: '5.12.0',
v8: '4.6.85.32',
uv: '1.8.0',
zlib: '1.2.8',
ares: '1.10.1-DEV',
icu: '56.1',
modules: '47',
openssl: '1.0.2h' }
> .exit
安装编写Node Addon的工具和库
node-gyp
node-gyp是从Google的GYP (Generate Your Project)改进来的,是node addon的跨平台编译工具,通过编写JSON格式的配置文件(binding.gyp),运行相应命令后生成目标平台上的native程序编译文件(Linux上的Makefile或者Windows上的vcxproj),完成编译后生成目标平台上的链接库xxx.node (相当于Linux上的.so或者Windows上的dll).
$ npm install node-gyp -g
nan
nan是Native Abstractions for Node.js的缩写,由于V8和Node版本演进,使用nan可以编写兼容不同版本的node的native程序,如果不考虑兼容性问题,就可以忽略nan.
$ npm install nan -g
or
$ npm install nan@latest -g
bindings
native程序编译后根据不同配置(debug版还是release版)会把链接库声称到不同的目录中,在JS中引用native模块时,就需要写明引用的是哪个路径上的库文件,有了bindings,就能简化这部分工作:
“Because the exact path to the compiled Addon binary can vary depending on how it is compiled (i.e. sometimes it may be in ./build/Debug/), Addons can use the bindings package to load the compiled module.”
npm install bindings -g
$ npm install bindings -g
运行例子
Node addon example
总共8个例子,每个例子包括三种不同的版本
* Node 0.10: Mostly compatible with Node 0.8 and even 0.6, older style V8 programming
* Node 0.12: Newer style V8 programming, compatible with Node 0.11+
* NAN: The example rewritten using NAN for compatibility with Node 0.8 -> 0.11+
切换当前node到对应例子需要的版本,在每个例子的目录中执行:
$ npm install
$ node-gyp rebuild
$ node ./
NAN example
Nan example
这个例子利用NAN编写了一个用蒙特卡洛方法计算π的程序,在例子目录中运行后会得到类似下面的结果:
$ node-gyp rebuild
$ node ./addon.js
Sync method:
π ≈ 3.14157864 (0.000014013589793027137 away from actual)
Took 2050ms
Async method:
π ≈ 3.14190464 (0.0003119864102067993 away from actual)
Took 549ms
下一部分中将分析上面例子中的程序细节,并尝试打造一个自己的addon.
http://javascript.ruanyifeng.com/nodejs/npm.html
https://www.npmjs.com/