您的位置:首页 > Web前端 > Node.js

node 加载内置函数

2013-11-29 19:32 281 查看
部分参考http://hi.baidu.com/brauceunix/item/808e27d00ac3b0d8241f4077

1 入口文件与入口函数

src/node_main.cc->main->node::Start->node.cc:Start //如无特别说X->Y-Z. 这里的X、Y、Z可能是两种情况。一个是C++、Javascript文件名(加后缀的), 其于是各自的函数名. 工具:vim+ctags.

2 src/node.js文件是如何被解释成机器指令的?(lib/*.js也可以走这条路,而像现实世界用的那些个库,也走这个,像express.socketio)

通过v8. src/node.cc->Load函数->ExecuteString->v8::Script::Compile, script->Run

3 像getuid, setuid这些函数如何通过javascript传递给c++,类似这些称为built-in 函数

src/node.cc->SetupProcessObject->NODE_SET_MOETHOD集函数->node::SetMethod

void SetMethod(target_t obj, const char* name,

v8::InvocationCallback callback)

{

obj->Set(v8::String::NewSymbol(name),

v8::FunctionTemplate::New(callback)->GetFunction());

}

初始化的内建模块有process,process有一些绑定的函数,如binding很有用。

然后执行Node.js 文件,里面有个函数NativeModule.require会继续引用一些内置模块

如:NativeModule.require('os'),进而会执行os.js的内置模块,在这个文件中,可以看到导出的函数都是来自

process.binding('os');

然后,我们看Bingding函数, 调用get_builtin_module(*module_v),查找os模块,os在node_extensions中使用NODE_EXT_LIST_ITEM(node_os)定义的,所以找到了;

然后调用 modp->register_func(exports, Undefined());调用os模块的注册函数register_func,它是个函数指针,是在nodeos类文件中使用

NODE_MODULE(node_os, node::OS::Initialize)初始化过的,所以,我们就找到了所有的os的所调用的c++具体的函数。

这个初始化函数只会调用一次,是在binding模块的时候调用;

exports, require, module, __filename, __dirname变量的由来:

NativeModule.prototype.compile中会对源码调用NativeModule.wrap,对源码进行包装,添加

'(function (exports, require, module, __filename, __dirname) { ',

'\n});'

然后eval源码,得到匿名函数fn,然后 fn(this.exports, NativeModule.require, this, this.filename);

所以每个js文件都可以直接使用上面五个变量

更好的一篇:http://blog.cnbang.net/tech/1658/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: