站在大神的肩膀上好走路,很多东西都是参考 @bigtree9307大神的几篇文章,在这里顺便记录下自己的学习路程。
1 . node 启动过程
那我们还是从main开始: 文件:node_main.cc ==> main
文件:node.cc ==> Start
==> StartNodeInstance
==> LoadEnvironment
==> ExecuteString
编译node.js(其实是 bootstrap_node.js ,这个js最终是被工具生成了一个字节数组到node_natives.h文件中)
==> f->Call 执行 bootstrap_node.js 的逻辑 由于ExecuteString 编译之后返回一个function,这个function就是 bootstrap_node.js最外层的匿名函数 参数 arg 是一个process 对象 对应 bootstrap_node.js 中匿名函数传入的参数process
文件:bootstrap_node.js ==> startup 对process做一部分信息的初始化 更多信息参考 @bigtree9307的文章
文件:lib/module.js==> Module.runMain()
==> Module._load 加载我们想要执行的js ,比如 app.js
==> module.load
==> Module._extensions 根据文件后缀用相应的加载函数加载我们的文件,这里用 Module._extensions[’.js’] 加载js文件
==> module._compile 编译执行js文件
到这里基本上对node的启动过程大致走了一遍
问题:
- 怎么去加载node.js ( bootstrap_node.js )的
回到 == > ExecuteString 步骤 执行ExecuteString的时候有一个MainSource调用
文件:node_javascript.cc ==> MainSource 这里有一个变量 internal_bootstrap_node_native ,这个变量定义在 node_natives.h (这个文件是编译时工具生成的)中,internal_bootstrap_node_native是一个字节数组,并对应着 bootstrap_node.js 文件的文件内容,好奇的朋友可以把它用Buffer.toString打出来看一下。
补充:
基本上lib文件夹(js部分的native 模块)下面的js都是通过这种字节数组的形式被编译到Node二进制执行文件中的
node_natives.h 文件的大致内容:
生成的js native模块的字节数组,以及各个模块的配置信息 字节数组 模块的配置信息
有错的地方,希望大家指教。待续:、。。。
先马再看
来自长者的自传