官方文档链接: https://nodejs.org/dist/latest-v5.x/docs/api/addons.html
需要有C++文件,编译配置文件以及nodejs调用文件;
需要用到的命令node-gyp configure build;
具体见官方文档。
关于node-gyp的安装使用:
node-gyp的github链接:https://github.com/nodejs/node-gyp
github上的installation中给出了必须的环境,我的是win8,所以就记录一下win8的环境搭建:
1、npm install node-gyp@latest -g
测试:node-gyp list 显示出已安装的node development files则安装成功
如果报错command not found,需要安装工具(见【error】npm安装express报错: command not found),安装了express-generator以后node-gyp也正常了,不过不知道是不是这个原因0 0
2、安装 Python (v2.7.10 recommended, v3.x.x is not supported)
安装完需要将Python的安装路径加到计算机》属性》高级系统设置》环境变量》系统变量path中去,记得加分号
测试:cmd中输入python -V 输出版本号,注意V是大写(不知道为何gitbash中就没有python命令= =)
3、安装 Microsoft Visual Studio C++ 2013 for Windows Desktop (Express version works well)
建议下载几百M的那个,比较快,下下来再慢慢装
各种node-gyp的报错:
1、先自查:node-gyp是否为最新版本,python是否正确安装且为v2.7,VS是否安装,是否关闭代理,是否有binding.gyp文件,c文件代码是否正确。
2、node-gyp版本问题,解决方案:uninstall以后安装最新版本
$ node-gyp configure
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | win32 | x64
gyp http GET https://nodejs.org/download/release/v5.7.1/node-v5.7.1-headers.tar. gz
gyp WARN install got an error, rolling back install
gyp ERR! configure error
gyp ERR! stack Error: read ECONNRESET
gyp ERR! stack at exports._errnoException (util.js:856:11)
gyp ERR! stack at TLSWrap.onread (net.js:550:26)
gyp ERR! System Windows_NT 6.3.9600
gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Users\\XXX\\AppD ata\\Roaming\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "configure"
gyp ERR! cwd C:\Users\XXX
gyp ERR! node -v v5.7.1
gyp ERR! node-gyp -v v3.3.1
gyp ERR! not ok
3、没有binding.gyp文件或者格式不正确
gyp: binding.gyp not found (cwd: C:\Users\XXX) while trying to load binding.gyp
gyp ERR! configure error
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack at ChildProcess.onCpExit (C:\Users\XXX\AppData\Roaming\npm\nod e_modules\node-gyp\lib\configure.js:305:16)
gyp ERR! stack at emitTwo (events.js:100:13)
gyp ERR! stack at ChildProcess.emit (events.js:185:7)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js: 200:12)
gyp ERR! System Windows_NT 6.3.9600
gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Users\\XXX\\AppData\\ Roaming\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "configure"
gyp ERR! cwd C:\Users\XXX
gyp ERR! node -v v5.7.1
gyp ERR! node-gyp -v v3.3.1
gyp ERR! not ok
——————————————————————————————————————————————————————————————
node-gyp configure build 就好了,生成的文件在build文件夹下
具体使用的例子在官方文档中有
QAQ 希望不要再遇到报错了。。windows跟nodejs好不和= =
——————————————————————————————————————————————————————————————
补充:
nodejs用到V8 JavaScript引擎,扩展c++模块也用到V8命名空间,所以简单介绍一下v8。
参考:http://www.programgo.com/article/352653138/
http://blog.pluskid.org/?p=186
摘录:
Isolate表示一个独立的v8引擎实例,每个实例维护不同的状态。一个Isolate中的对象不能在其他Isolate中使用。当v8被初始化的时候,一个默认isolate被默认创建。开发者可以通过创建额外的Isolate在多线程环境下并行使用。一个Isolate任意时间只允许一个线程在其中运行,可以使用Locker和Unlocker来进行多个线程对一个Isolate的同步。
V8允许不同的JavaScript代码运行在完全不同的环境下,其运行环境称为Context。不同的Context下拥有自己的全局对象(PersistentHandle),运行代码时必须指定所在的Context。最典型的例子就是Chrome的标签,每个标签都拥有自己的Context。
Context拥有自己的全局代理对象(global proxy object),每个Context下的全局对象都是这个全局代理对象的属性。通过Context::Global ()可以得到这个全局代理对象。新建Context时你可以手动指定它的全局代理对象,这样每个Context都会自动拥有一些全局对象,比如DOM。
Context也是一种scope,通过Context::Enter ()和Context::Exit ()来进入、退出,或者使用类似于HandleScope的Context::Scope来隐式进入。
V8里使用Handle类型来托管 JavaScript对象,与C++的std::shared_pointer类似,Handle类型间的赋值均是直接传递对象引用,但不同的是,V8使用自己的GC来管理对象生命周期,而不是智能指针常用的引用计数。如果一个v8对象没有任何Handle与之相关联(不再被访问),那么这个对象很快就会被垃圾回收器回收掉。
Handle有两种类型,Local Handle和Persistent Handle,类型分别是Local : Handle和Persistent : Handle,前者和Handle没有区别,生存周期都在scope内。而后者的生命周期脱离scope,你需要手动调用Persistent::Dispose结束其生命周期。也就是说Local Handle相当于在C++在栈上分配对象,而Persistent Handle相当于C++在堆上分配对象。
一个函数中,可以有很多Handle,而HandleScope则相当于用来装Handle(Local)的容器,当HandleScope生命周期结束的时候,Handle也将会被释放,会引起Heap中对象引用的更新。HandleScope是分配在栈上,不能通过New的方式进行创建。对于同一个作用域内可以有多个HandleScope,新的HandleScope将会覆盖上一个HandleScope,并对Local Handle进行管理。
v8 是一个javascript解释引擎,跟传统javascript引擎不同,主要有四个特性