Node启动源码学习笔记
发布于 5 年前 作者 chengang4505 2901 次浏览 来自 分享

站在大神的肩膀上好走路,很多东西都是参考 @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的启动过程大致走了一遍

问题:

  1. 怎么去加载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模块的字节数组,以及各个模块的配置信息 字节数组 模块的配置信息

有错的地方,希望大家指教。待续:、。。。

1 回复

先马再看

来自长者的自传

回到顶部