NodeJS之C++扩展!

NodeJS天生单线程,在IO密集型项目中可以大展身手,但是掩盖不了CPU密集型项目中的计算短板。
但别忘了NodeJS的大杀器C/C++扩展,javascript不擅长的那就C/C++来凑。

本次演示如何在centOS中编译C代码生成.node文件,并且在javascript中调用。
(为什么是在centOS中,而不是在windows呢?造孽啊,本机windows环境MSbuild版本和node-gyp必备版本对应不上,为此尝试好久无法解决)

首先前戏做足,需要安装的环境还比较多。

  • centOS安装node环境以及如何配置环境变量,扩展需要比较高的Node版本,装最新版本妥妥的
    请参考教程
  • 安装node-gyp模块
    npm install -g node-gyp
  • 安装python(2.7.3版本)
    node-gyp模块源码对python版本有限制。在centOS中可以wget也可以先下载安装包,再离线安装,安装完记得设置环境变量。

上述环境安装好之后,开始撸代码:
先创建目录结构:
—-src
      |-binding.gyp
      |-hello.cc

// 一切求稳,我们先用官网的c语言代码例子,hello.cc _config.yml


// binding.gyp文件:  
{
  "targets": [
    {
      "target_name": "hello",
      "sources": [ "hello.cc" ]
    }
  ]
}

代码文件放好以后,进入src目录下依次执行
node-gyp configure
node-gyp build

  • 如果node-gyp没有加入环境变量,也可以临时用相对路径找到node-gyp可执行文件。
    例如~node-v8.11.4-linux-x64/bin/node-gyp build
  • 如果报错提示找不到binding.gyp文件,可以把src/binding.gyp文件复制到src/build/binding.gyp
    cp binding.gyp build/binding.gyp

所有命令执行完成之后,ls查看src/build/Release目录下生成了.node文件。
_config.yml

顺便测试一下这个.node怎么玩
vi test.js创建一个js文件,输入代码,require(‘./hello.node’),并调用方法:


const addon = require('./hello.node');
addon(msg=>{console.log(msg)});

保存,执行

node test.js
hello world

妥妥的,接下来就可以写一套C语言的加减乘除扩展,以解决javascript中浮点数计算精度问题。

Written on August 28, 2018