node 加载内置函数

部分参考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/




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值