导语:当 Javascript 的性能遭遇瓶颈,或者需要增强 Javascript 能力的时候,就需要依赖 native 模块来实现了。
日常工作中,我们经常需要将原生的 Node.js 模块做为依赖并在项目中进行使用。下面有个列表,你可能对它们的名字很熟悉:
通常,我们开发原生 Node.js 模块包括但不仅限于以下原因:
Node.js Addons 是动态链接的可共享对象,由 C/C++ 编写而成。可以在 Node.js 中通过
方法进行调用,使用起来像调用 Node.js 普通模块一样。 —— 来自 Node.js 官方文档
- require()
这意味着如果处理得当的话,模块调用者使用由 C/C++ 编写的原生模块的方式和由 Node.js 编写的模块一样。想要编写 Node.js addons,你需要了解一些基本知识:
推荐阅读这些资料。
下面我以一个常见的动态规划问题 - 青蛙跳台阶为例子来说明如何创建一个原生的 Node.js 模块。青蛙跳台阶描述为:一只青蛙一次可以跳上一级台阶,也可以跳上 2 级台阶,求该青蛙跳上 n 级台阶的共有多少种跳法?
首先创建一个 frog_jump.cc 原生文件,.cc 的意思是 c with class,扩展名也可以是. cpp。Google Style Guide 建议使用. cc,那么此处还是以. cc 做为扩展名吧。代码如下:
- #include <node.h>
- #include<vector>
- /*** Native method, calculate all ways frog jump to a target stair.
- */intclimbStairs(intn) {
- std::vector<int> dp(n);
- dp[1] =1;
- dp[2] =2;for(inti =3; i <= n; i ++ ) {
- dp[i] = dp[i -1] + dp[i -2];
- }returndp[n];
- }/*** Export native method jumpTo
- */voidJumpTo(constv8::FunctionCallbackInfo& args) {
- v8::Isolate* isolate = args.GetIsolate();
- // Check input type
- if(!args[0] -> IsNumber()) {
- isolate -> ThrowException(v8::Exception::TypeError(
- v8::String::NewFromUtf8(isolate,"Wrong arguments type!")));
- }intvalue = climbStairs(args[0] -> NumberValue());
- v8::Local num = v8::Number::New(isolate, value);
- args.GetReturnValue().Set(num);
- }
- // init is entry point.
- voidinit(v8::Local exports) {
- NODE_SET_METHOD(exports, "jumpTo",JumpTo);
- }
- NODE_MODULE(frog_jump, init)
对这段代码的解释:
标志来访问 v8 的接口。访问所有 v8 的类型,都需要使用 v8:: 标志
- v8::
一旦源代码编写完成,需要将它编译成二进制的
文件,之后才能被 Node.js require。为了完成编译操作,需要在项目的根目录创建 binding.gyp 文件,里面定义了 Build 的配置。binding.gyp 的内容是一个 JSON。
- addon.node
- {
- "targets": [
- {
- "target_name": "frog_jump",
- "sources": [ "frog_jump.cc" ]
- }
- ]
- }
编译环境配置:
虽然 npm 内置了一个 node-gyp 版本,但是这个版本没有开放给开发者进行调用。npm install 的时候会调用它来进行编译和安装工作。因此,开发者想要调用 node-gyp 必须自己安装一个全局的 node-gyp 版本。
- $npminstall node-gyp -g
- $node-gypconfigure
- $node-gypbuild
运行 node-gyp configure 命令会生成一个跨平台的 build 文件,unix 环境会生成 Makefile,windows 环境会在 build 目录里面生成 vcxproj。 运行 node-gyp build 命令会生成可被 Node.js 调动的 addon.node 二进制文件。
- const frogJump = require('./build/Release/frog_jump');
- frogJump.jumpTo(20); //青蛙跳到第20个台阶的所有方法
项目源代码:frog-jump
nan,即 Native Abstractions for Node.js。它基于 Node.js API 接口,兼容所有 Node 版本,目前的最佳实践是基于 nan 来扩展原生模块,而不是直接使用 Node.js API。 N-API,Node 官方推出的用来编写原生 Node 扩展模块,是 V8 和 nan 的替代,目前处于实验阶段。
来源: http://www.cnblogs.com/cpselvis/p/6926157.html