【安装】nodesj的addon模块配置使用&报错处理

官方文档链接: 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

Isolate表示一个独立的v8引擎实例,每个实例维护不同的状态。一个Isolate中的对象不能在其他Isolate中使用。当v8被初始化的时候,一个默认isolate被默认创建。开发者可以通过创建额外的Isolate在多线程环境下并行使用。一个Isolate任意时间只允许一个线程在其中运行,可以使用Locker和Unlocker来进行多个线程对一个Isolate的同步。

Context

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来隐式进入。

Handle

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++在堆上分配对象。

HandleScope

一个函数中,可以有很多Handle,而HandleScope则相当于用来装Handle(Local)的容器,当HandleScope生命周期结束的时候,Handle也将会被释放,会引起Heap中对象引用的更新。HandleScope是分配在栈上,不能通过New的方式进行创建。对于同一个作用域内可以有多个HandleScope,新的HandleScope将会覆盖上一个HandleScope,并对Local Handle进行管理。



v8 是一个javascript解释引擎,跟传统javascript引擎不同,主要有四个特性

  • 快速的属性访问(隐藏类)
  • 动态机器码生成
  • 高效的垃圾收集(停止所有进程来执行垃圾回收)
  • 内联缓存机制










你可能感兴趣的:(笔记,安装,npm,nodejs)