node原生编写3种方法

node


设置打印层数

util.inspect(resInfo, { depth: 4 }

路径

除了require,用相对路径时要使用以下方式,因为直接./或者../是相对于node启动目录
console.log(path.resolve(__dirname, '../../../../static'));
  • 脚本执行路径:process.cwd()

console加色

  • console.log(’\x1b[36m%s\x1b[0m’, ‘I am cyan’); //cyan

  • console.log(’\x1b[33m%s\x1b[0m’, stringToMakeYellow); //yellow

Reset = "\x1b[0m"
Bright = "\x1b[1m"
Dim = "\x1b[2m"
Underscore = "\x1b[4m"
Blink = "\x1b[5m"
Reverse = "\x1b[7m"
Hidden = "\x1b[8m"

FgBlack = "\x1b[30m"
FgRed = "\x1b[31m"
FgGreen = "\x1b[32m"
FgYellow = "\x1b[33m"
FgBlue = "\x1b[34m"
FgMagenta = "\x1b[35m"
FgCyan = "\x1b[36m"
FgWhite = "\x1b[37m"

BgBlack = "\x1b[40m"
BgRed = "\x1b[41m"
BgGreen = "\x1b[42m"
BgYellow = "\x1b[43m"
BgBlue = "\x1b[44m"
BgMagenta = "\x1b[45m"
BgCyan = "\x1b[46m"
BgWhite = "\x1b[47m"

不同环境的c++编译工具

  • windows
1.visual studio
2.不下载完整的vs,也能编译c++
`npm install --global --production windows-build-tools`‘
  • linux
python2.7、make、GCC
  • osx
xcode

nodejs 原生模块编写 (.node模块编写)

  • 原生模块是二进制文件
  • 是动态链接库
  • 用require引入时,调用底层的DLOpen

初级方式 直接使用nodejsAPI(node0.8 ~node0.10.x)

  • 缺点,不同node版本,Node.js 的底层 API 以及 Google V8 的 API 发生变化,所以编译后的.node代码不能被所有node环境识别(注意,不是node-gyp不能编译,是编译成了.node之后,在nodejs里面引用,然后node编译器不识别.node

1.编写c++源码

#include <node.h>  // 里面有V8::
#include<vector>

/**
 * Native method, calculate all ways frog jump to a target stair.
 */
int climbStairs(int n) {
  std::vector<int> dp(n);

  dp[1] = 1;
  dp[2] = 2;

  for (int i = 3; i <= n; i ++ ) {
    dp[i] = dp[i - 1] + dp[i - 2];
  }
  return dp[n];
}

/**
 * Export native method jumpTo
 */
void JumpTo(const v8::FunctionCallbackInfo<v8::Value>& 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!")));
  }

  int value = climbStairs(args[0] -> NumberValue());
  v8::Local<v8::Number> num = v8::Number::New(isolate, value);

  args.GetReturnValue().Set(num);
}

// init is entry point.
void init(v8::Local<v8::Object> exports) {
  NODE_SET_METHOD(exports, "jumpTo", JumpTo);
}

NODE_MODULE(frog_jump, init)  
注意事项
// 必须调用NODE_MODULE,NODE_MODULE是一个宏,它会进行模块注册操作。
//c++的变量赋值给JS时,要用js可以识别的v8::类型
  1. 编译c++ 源码成 .node,可以让nodejs执行
1.创建bingding.gyp文件,定义build配置,例如
{
  "targets": [
    {
      "target_name": "frog_jump",
      "sources": [ "frog_jump.cc" ]
    }
  ]
}
2.用node-gyp 编译成 .node
$ npm install node-gyp -g
$ node-gyp configure  // 根据binding.gyp生成打包文件,unix环境会生成Makefile,windows环境生成vcxproj。
$ node-gyp build // 在build/Release/生成.node 文件(里面调用了C++的编译工具,也先回在本地node-gype目录下找在c++里引用的头文件和静态链接库,不存在再去网上下载)

3.nodejs中调用

const frogJump = require('./build/Release/frog_jump');

frogJump.jumpTo(20);  //青蛙跳到第20个台阶的所有方法

nan方式编写原生模块(Native Abstractions for Node.js)

  • 基于Node.js API
  • 目前主流编写方式
  • 兼容所有Node版本。先读取版本号,根据不同版本展开不同代码(里面有些宏判断,类似if判断,不同node版本,同一句话生成的代码不同),这样在用node-gype编译出的.node代码,是可以被node是别的,因为版本对应
NAN_METHOD(Echo)  //宏判断
{
}
//上面的宏判断会根据node版本生成下面2中代码
Handle<Value> Echo(const Arguments& args);    // 0.10.x
void Echo(FunctionCallbackInfo<Value>& args); // 6.x

N-api方式

  • 实验阶段
  • 提供通用的abi接口(Application Binary Interface),只有abi版本一样,所有的node环境都可以识别这一套代码
  • 真正的兼容所有版本,不需要编译成对应的node版本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值