当前位置: 首页 > 后端技术 > Node.js

Node.js源码分析-加载js文件

时间:2023-04-03 21:15:28 Node.js

标题:Node.js源码分析-加载js文件日期:2018-11-3021:04:49tags:-Node.js-Node.js源码分析-源码分析类:-Node.js源码分析本文四年前原发于个人网站,现转载于此,原文链接:https://laogen.site/nodejs/no...《Node.js 源码分析》系列目录页:https://laogen.site/nodejs/no...提个问题了解加载js文件前的准备工作在本文《从 main 函数开始》中提到LoadEnvironment()函数负责用于加载js代码,但不继续说明加载细节。本文从LoadEnvironment()入手,探究js代码加载的详细过程。LoadEnvironment()LoadEnvironment()的逻辑分为两部分:加载并执行两个js文件:loaders.jsnode.js,执行后得到两个启动函数;分别调用这两个启动函数:loaders_bootstrapper()和node_bootstrapper();这段代码比较长,我们省略不影响主要逻辑的代码,然后直接在代码中以注释的形式进行说明:voidLoadEnvironment(Environment*env){//.../**************************************************************//****第一步,加载并执行两个js文件:`loaders.js``node.js`****//*****************************************************************///引导程序脚本是lib/internal/bootstrap/loaders.js和//lib/internal/bootstrap/node.js,每个都包含为静态C字符串//在node_javascript.h中定义,在node_javascript.cc中生成通过//node_js2c。//这两个js文件在节点构建过程中被转化为C++代码,即以C++字符串的形式存在于C++代码中。根据这个文件名,可以直接得到对应的js代码串;//loaders.js的文件名Localloaders_name=FIXED_ONE_BYTE_STRING(env->isolate(),"internal/bootstrap/loaders.js");//执行loaders.js获取函数:`loaders_bootstrapper`beLocal<函数>loaders_bootstrapper=GetBootstrapper(env,LoadersBootstrapperSource(env),loaders_name);//node.js文件名Localnode_name=FIXED_ONE_BYTE_STRING(env->isolate(),"internal/bootstrap/node.js");//执行loaders.js获取函数:`loaders_bootstrapper`MaybeLocalnode_bootstrapper=GetBootstrapper(env,NodeBootstrapperSource(env),node_name);//上面代码中:LoadersBootstrapperSource()&NodeBootstrapperSource()//在/src/node_javascript.h中声明在头文件中,node源码中没有具体实现,//生成了它们的实现代码在节点本身的构建过程中;//对于GetBootstrapper(),其作用是编译执行js代码,返回执行结果如果(loaders_bootstrapper.IsEmpty()||node_bootstrapper.IsEmpty()){返回;}Localglobal=env->context()->Global();//...//将全局对象公开为自身的属性//(允许您从JavaScript中的任何位置设置`global`的内容。)global->Set(FIXED_ONE_BYTE_STRING(env->isolate(),"global“),全球的);/*******************************************************************************//*第二步。调用这两个启动函数:loaders_bootstrapper,node_bootstrapper****//********************************************************************************///创建绑定加载器//创建基于GetBinding()函数模板的get_binding_fn函数//基于GetLinkedBinding()函数模板创建get_linked_binding_fn函数Localget_linked_binding_fn=env->NewFunctionTemplate(GetLinkedBinding)->GetFunction(env->context()).ToLocalChecked();//基于GetInternalBinding()函数模板创建get_internal_binding_fn函数//以上三个函数会在调用loaders_bootstrapper()时作为参数Localloaders_bootstrapper_args[]={env->process_object(),get_binding_fn,get_linked_binding_fn,get_internal_binding_fn,Boolean::New(env->isolate(),env->options()->debug_options->break_node_first_line)};//loaders_bootstrapper()的调用结果会保存在这个变量中,//接下来会作为参数传递给另一个启动函数:node_bootstrapper()Localbootstrapped_loaders;//调用启动函数loaders_bootstrapper()}//引导Node.jsLocalbootstrapper=Object::New(env->isolate());SetupBootstrapObject(env,bootstrapper);本地<值>bootstrapped_node;Localnode_bootstrapper_args[]={env->process_object(),引导程序,bootstrapped_loaders};//调用启动函数loaders_bootstrapper()}}总结LoadEnvironment()主要调用了两个Function(Bootstrapper)loaders_bootstrapper()node_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是一个开源的云开发平台,前端变成全栈,不需要服务器。