Node.js与V8引擎
Node.js是一个基于Chrome V8 JavaScript engine的JavaScript运行时环境。从另一个角度来说,Node.js使用V8扩展了JavaScript这门语言的边界,让它走出了浏览器,直接可以在操作系统层面运行起来。
Node是如何使用V8的囊?
ps:本文中研究的Node.js 的版本是6.10.3
起点:main
main函数位于src/node_main.cc当中
intmain(intargc,char*argv[]){// Disable stdio buffering, it interacts poorly with printf()// calls elsewhere in the program (e.g., any logging from V8.)setvbuf(stdout,nullptr,_IONBF,0);setvbuf(stderr,nullptr,_IONBF,0);returnnode::Start(argc,argv);}
从代码可以看出,就是调用了node命名空间下的Start函数,没做啥实际的事情
node::Start位于src/node.cc的line 4709
开始为libuv(本文暂不讨论,后面会有专门的文章)和V8准备启动的参数
这里重点关注line 4742
StartNodeInstance(&instance_data);
从方法名上可以看出,在这个function中正式启动了node实例
启动Node实例
这个方法位于src/node.cc的line 4604
对于这个方法重点关注下面的内容
Isolate*isolate=Isolate::New(params);//line 4612Isolate::Scopeisolate_scope(isolate);//line 4628HandleScopehandle_scope(isolate);Local<Context>context=Context::New(isolate);Context::Scopecontext_scope(context);//line 4633LoadEnvironment(env);//line 4651
4612行node实例为自己创建了V8 引擎的实例。在V8的官方文档中,说Isolate代表一个独立的V8引擎的实例,不同的Isolate是完全隔离的。
紧接着在,4628进入了这个引擎当中,在其中创建了Context。关于Content这个概念需要多说几句了。
In V8, a context is an execution environment that allows separate, unrelated, JavaScript applications to run in a single instance of V8. You must explicitly specify the context in which you want any JavaScript code to be run.
从官方的解释中,我们可以看出Content也是一个沙箱的感觉。只不过与isolate相比是一个更轻的沙箱。为啥需要这个一个东西囊,比如在浏览器中,有一个iframe,我们就可以新建立一个Content,从而复用原有的全局对象方法等。
在4633行进入这个运行环境,然后执行一个很重要的方法LoadEnvironment,在这个方法中从cpp的世界进入了JavaScript当中
LoadEnvironment
这个方法位于 src/node.cc line 3482
对于这个方法,重点关注下面几行
//line 3500Local<String>script_name=FIXED_ONE_BYTE_STRING(env->isolate(),"bootstrap_node.js");Local<Value>f_value=ExecuteString(env,MainSource(env),script_name);//line 3508CHECK(f_value->IsFunction());Local<Function>f=Local<Function>::Cast(f_value);//line 3547Local<Value>arg=env->process_object();f->Call(Null(env->isolate()),1,&arg);
f_value的内容就是bootstrap_node.js,这个js文件的结构如下,f_value就是匿名函数在cpp中的对象
(function(process){functionstartup(){...//line 137// read the sourceconstfilename=Module._resolveFilename(process.argv[1]);varsource=fs.readFileSync(filename,'utf-8');// remove shebang and BOMsource=internalModule.stripBOM(source.replace(/^#!.*/,''));// wrap itsource=Module.wrap(source);// compile the script, this will throw if it failsnewvm.Script(source,{filename:filename,displayErrors:true});preloadModules();run(Module.runMain);...}startup()})
接下来在3547行,调用了这个方法的Call,从而进入了js的世界。
在js的137行会读取命令行指定的脚本文件,然后运行。
总结
node的启动过程分为下面几步
- 初始化V8 Engine
- 编译运行bootstrap_node.js
- 获得一个js functin在V8模型中的实例
- 运行这个js function,在这个function中会读取命令行中指定的脚本并运行
试验小程序:https://github.com/Acceptedlc/wddlc_js/blob/lanch1/src/lanch_stage_1.cc
ps:运行环境为Ubuntu 16.04 x86_64
Node.js与V8引擎相关推荐
- CentOS6.8升级gcc;编译node.js的V8
1.我系统是centOS 6.8. gcc的版本是4.4.7:因为需要编译node.js的C++扩展插件,所以安装了V8引擎,可是编译时报错.gcc不支持C++11.所以手动升级gcc一下: 2.获取 ...
- 深入浅出JS—01 V8引擎与浏览器内核
前言 先说几句 基础不牢,地动山摇.切忌JS没学好就盲目搞一些框架,追一些潮流,纯属舍本逐末. JS写起来容易,掌握很难.之前贪快,潦潦草草的看书看视频写代码,以为自己会了,其实并不知其所以然,现在又 ...
- 在Windows下安装和配置Node.js环境v8.11.3与遇到的问题
公司同事给了一个版本为8.11.3的node安装包,安装步骤请查看点击打开链接 但是在安装完成之后,发现执行cnpm -v检查是否安装cnpm成功时报错:不是内部或外部命令,具体解决办法请查看点击打开 ...
- 关于node.js的web框架的应用及并发性能测试
"Node.js 是服务器端的 JavaScript 运行环境,它具有无阻塞(non-blocking)和事件驱动(event-driven)等的特色,Node.js 采用 V8 引擎,同样 ...
- .net core高并发_高并发下的Node.js与负载均衡
阅读本文约需要6分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下浅谈前端自动化构建的相关知识,今天跟大家分享浅谈前端自 ...
- 了解 node.js
原文为: 我们为什么要使用NodeJS 写的好,就收藏于此,供学习之用. 科普文一则,说说我对NodeJS(一种服务端JavaScript实现)的一些认识,以及我为什么会向后端工程师推荐NodeJS. ...
- Node.js概述及编程基础
目录 Node.js概述 什么是Node.js Node的特点 Node程序的运行方式 Node.js编程基础 JavaScript语句与注释 变量 变量的提升和泄露 变量提升 变量泄露 全局作用域和 ...
- 前端工程化----Node.js基础篇
文章目录 1.认识Node.js Node.js是什么 Node.js应用场景 2.Node.js安装和版本管理 Node.js安装 Node.js版本工具 3.Node.js执行文件 4.Node. ...
- 【Node.js】node入门全攻略
文章目录 一.初识 Node.js (一)JS 解析引擎 (二)JS 运行环境 (三)Node.js 1.作用 2.命令 二.fs 文件系统模块 (一)fs 模块 (二)方法 1.fs.readFil ...
- node.js搭建文件服务器,Node.js创建HTTP文件服务器的使用示例
Node.js创建HTTP文件服务器的使用示例 发布时间:2020-08-26 01:41:13 来源:脚本之家 阅读:103 作者:foruok HelloWorld示例只有演示意义,这次我们来搞一 ...
最新文章
- PrintWriter用法简析
- sor迭代法matlab实例,Jacobi G-S SOR迭代法在matlab中例子.pdf
- weblogic获取文件的路径问题
- oracle commit session,Oracle session总结
- 2021牛客暑期多校训练营1 H Hash Function FFT\NTT
- 学习笔记13-C语言-字符串函数、缓冲区
- java if emun_关于java:Enum与If-else
- 大四课程设计之基于RFID技术的考勤管理系统(四)Qt界面设计
- android http 慢,android httpurlconnection數據連接速度慢
- 芝加哥计算机科学硕士录取难度,美国cs研究生申请难度有多大?
- [转] Windows Server 2012 Beta (Hyper-V 3.0) VM Replica與Live Migration Winout Shared Storage
- Redis的安装和使用之二------phpredis与phpRedisAdmin
- 解决织梦CMS友情链接的字数个数限制
- 运用python》pyautogui自动刷智慧树网课的脚本
- android剪贴板数据来源,Android判断程序回到前台并获取剪贴板数据
- python psutil 汇总 tcy
- Sublime 如何替换换行符
- 计算机系统的图像编码方式,彩色图像编码方案
- 03.07:BT下载&区块链技术
- Eclipse(Windows)下第一个动态Java Web项目(Tomcat部署)