nodejsソース分析
2839 ワード
(簡単にnodejsのコードを分析して、大体のものを見てください.)
node_main.cc:入り口だけです.
ロード:すべてのシナリオはこの時にロードされます.
uv_run(uvudfaultuloop):これはnodejsメッセージループのものですが、直接使うものです.
まとめ:本質的にはnode.jsはlibevとv 8だけを組み合わせてjsのサーバー環境を作っています.それ自体は限られた機能を提供しています.例えば、v 8はブザーのサポートが足りなくて、自分でこれを強化しました.
node_main.cc:入り口だけです.
int main(int argc, char *argv[]) {
return node::Start(argc, argv);
}
node.cc:int Start(int argc, char *argv[]) {
// This needs to run *before* V8::Initialize()
// Use copy here as to not modify the original argv:
Init(argc, argv_copy);
V8::Initialize();
{
// Create all the objects, load modules, do everything.
// so your next reading stop should be node::Load()!
Load(process_l);
// All our arguments are loaded. We've evaluated all of the scripts. We
// might even have created TCP servers. Now we enter the main eventloop. If
// there are no watchers on the loop (except for the ones that were
// uv_unref'd) then this function exits. As long as there are active
// watchers, it blocks.
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
EmitExit(process_l);
RunAtExit();
}
return 0;
}
Init:入力パラメータに関するものを方法で処理し、また初期時間を得ました.ロード:すべてのシナリオはこの時にロードされます.
uv_run(uvudfaultuloop):これはnodejsメッセージループのものですが、直接使うものです.
void Load(Handle<Object> process_l) {
// Compile, execute the src/node.js file. (Which was included as static C
// string in node_natives.h. 'natve_node' is the string containing that
// source code.)
// The node.js file returns a function 'f'
atexit(AtExit);
Local<Value> f_value = ExecuteString(MainSource(),
IMMUTABLE_STRING("node.js"));
assert(f_value->IsFunction());
Local<Function> f = Local<Function>::Cast(f_value);
// Now we call 'f' with the 'process' variable that we've built up with
// all our bindings. Inside node.js we'll take care of assigning things to
// their places.
// We start the process this way in order to be more modular. Developers
// who do not like how 'src/node.js' setups the module system but do like
// Node's I/O bindings may want to replace 'f' with their own function.
// Add a reference to the global object
Local<Object> global = v8::Context::GetCurrent()->Global();
Local<Value> args[1] = { Local<Value>::New(process_l) };
f->Call(global, 1, args);
}
ここからコードがnode.jsに移行することが分かります.これもこのオープンソースプロジェクトの名前がnode.jsです.C部分のコードは実際にロードと実行の役割を果たします.本当の内容はjsの部分で、node.jsはjsの部分の根です.まとめ:本質的にはnode.jsはlibevとv 8だけを組み合わせてjsのサーバー環境を作っています.それ自体は限られた機能を提供しています.例えば、v 8はブザーのサポートが足りなくて、自分でこれを強化しました.