title: Node.js 源码分析 - 加载 js 文件
date: 2018-11-30 21:04:49
tags:
- Node.js
- Node.js 源码分析
- 源码分析
categories:
- Node.js 源码分析
此文最初于四年前发布在个人站上的,现迁移至此重发,原链接:https://laogen.site/nodejs/nodejs-src/bootstrap-js/
《Node.js 源码分析》 系列目录页:https://laogen.site/nodejs/nodejs-src/index/让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:国际域名空间、网页空间、营销软件、网站建设、兴平网站维护、网站推广。
了解 js 文件加载前的准备工作
在《从 main 函数开始》这篇中说到了 LoadEnvironment()
函数负责加载 js 代码,但并没有继续说明加载细节。
这篇从 LoadEnvironment()
开始探究 js 代码加载的详细过程。
LoadEnvironment()
的逻辑分两部分:
loaders.js
node.js
,执行后得到两个启动函数;这段代码比较长,我们把不影响主逻辑的代码省略掉,然后直接在代码中以注释的形式来解释:
void LoadEnvironment(Environment* env) {
// ...
/************************************************************/
/**** 第一步.加载并执行两个 js 文件:`loaders.js` `node.js`****/
/************************************************************/
// The bootstrapper scripts are lib/internal/bootstrap/loaders.js and
// lib/internal/bootstrap/node.js, each included as a static C string
// defined in node_javascript.h, generated in node_javascript.cc by
// node_js2c.
// 这两个 js 文件在 node 构建过程中就被转换成了 C++ 代码,即以 C++ 字符串的
// 形式存在于 C++ 代码中,根据这个文件名就可以直接获取相应的 js 代码字符串;
// loaders.js 的文件名
Local loaders_name =
FIXED_ONE_BYTE_STRING(env->isolate(), "internal/bootstrap/loaders.js");
// 执行 loaders.js 得到函数: `loaders_bootstrapper`
MaybeLocal loaders_bootstrapper =
GetBootstrapper(env, LoadersBootstrapperSource(env), loaders_name);
// node.js 文件名
Local node_name =
FIXED_ONE_BYTE_STRING(env->isolate(), "internal/bootstrap/node.js");
// 执行 loaders.js 得到函数: `loaders_bootstrapper`
MaybeLocal node_bootstrapper =
GetBootstrapper(env, NodeBootstrapperSource(env), node_name);
// 上面代码中:LoadersBootstrapperSource() & NodeBootstrapperSource() 是
// 在 /src/node_javascript.h 头文件中声明的,node 源码中并没有它们的具体实现,
// 它们的实现代码是在 node 本身构建过程中生成的;
// 至于 GetBootstrapper(),它的作用是编译&执行 js 代码,返回执行结果。
if (loaders_bootstrapper.IsEmpty() || node_bootstrapper.IsEmpty()) {
return;
}
Local
LoadEnvironment()
主要是调用了两个 启动函数(Bootstrapper)
其中 loaders_bootstrapper() 主要实现了一个简单的模块加载机制名为 NativeModule
,主要用于加载内部模块的,会在 node_bootstrapper() 中用到;
而在 node_bootstrapper() 则加载并执行了用户的 js 文件(也就是通常的 app.js 或 index.js)。
这两个启动函数分别定义在 /lib/internal/bootstrap/loaders.js
和 /lib/internal/bootstrap/node.js
文件中;
接下来的两篇文,会分别对这两个文件进行详细的探究,弄清楚 js 文件加载执行的细节;
Maslow (wangfugen@126.com), laf.js 作者。
lafyun.com 开源云开发平台,前端变全栈,无需服务端。