发布于 1 年前 作者 Acceptedlc 3183 次浏览 来自 分享

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引擎相关推荐

  1. CentOS6.8升级gcc;编译node.js的V8

    1.我系统是centOS 6.8. gcc的版本是4.4.7:因为需要编译node.js的C++扩展插件,所以安装了V8引擎,可是编译时报错.gcc不支持C++11.所以手动升级gcc一下: 2.获取 ...

  2. 深入浅出JS—01 V8引擎与浏览器内核

    前言 先说几句 基础不牢,地动山摇.切忌JS没学好就盲目搞一些框架,追一些潮流,纯属舍本逐末. JS写起来容易,掌握很难.之前贪快,潦潦草草的看书看视频写代码,以为自己会了,其实并不知其所以然,现在又 ...

  3. 在Windows下安装和配置Node.js环境v8.11.3与遇到的问题

    公司同事给了一个版本为8.11.3的node安装包,安装步骤请查看点击打开链接 但是在安装完成之后,发现执行cnpm -v检查是否安装cnpm成功时报错:不是内部或外部命令,具体解决办法请查看点击打开 ...

  4. 关于node.js的web框架的应用及并发性能测试

    "Node.js 是服务器端的 JavaScript 运行环境,它具有无阻塞(non-blocking)和事件驱动(event-driven)等的特色,Node.js 采用 V8 引擎,同样 ...

  5. .net core高并发_高并发下的Node.js与负载均衡

    阅读本文约需要6分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下浅谈前端自动化构建的相关知识,今天跟大家分享浅谈前端自 ...

  6. 了解 node.js

    原文为: 我们为什么要使用NodeJS 写的好,就收藏于此,供学习之用. 科普文一则,说说我对NodeJS(一种服务端JavaScript实现)的一些认识,以及我为什么会向后端工程师推荐NodeJS. ...

  7. Node.js概述及编程基础

    目录 Node.js概述 什么是Node.js Node的特点 Node程序的运行方式 Node.js编程基础 JavaScript语句与注释 变量 变量的提升和泄露 变量提升 变量泄露 全局作用域和 ...

  8. 前端工程化----Node.js基础篇

    文章目录 1.认识Node.js Node.js是什么 Node.js应用场景 2.Node.js安装和版本管理 Node.js安装 Node.js版本工具 3.Node.js执行文件 4.Node. ...

  9. 【Node.js】node入门全攻略

    文章目录 一.初识 Node.js (一)JS 解析引擎 (二)JS 运行环境 (三)Node.js 1.作用 2.命令 二.fs 文件系统模块 (一)fs 模块 (二)方法 1.fs.readFil ...

  10. node.js搭建文件服务器,Node.js创建HTTP文件服务器的使用示例

    Node.js创建HTTP文件服务器的使用示例 发布时间:2020-08-26 01:41:13 来源:脚本之家 阅读:103 作者:foruok HelloWorld示例只有演示意义,这次我们来搞一 ...

最新文章

  1. PrintWriter用法简析
  2. sor迭代法matlab实例,Jacobi G-S SOR迭代法在matlab中例子.pdf
  3. weblogic获取文件的路径问题
  4. oracle commit session,Oracle session总结
  5. 2021牛客暑期多校训练营1 H Hash Function FFT\NTT
  6. 学习笔记13-C语言-字符串函数、缓冲区
  7. java if emun_关于java:Enum与If-else
  8. 大四课程设计之基于RFID技术的考勤管理系统(四)Qt界面设计
  9. android http 慢,android httpurlconnection數據連接速度慢
  10. 芝加哥计算机科学硕士录取难度,美国cs研究生申请难度有多大?
  11. [转] Windows Server 2012 Beta (Hyper-V 3.0) VM Replica與Live Migration Winout Shared Storage
  12. Redis的安装和使用之二------phpredis与phpRedisAdmin
  13. 解决织梦CMS友情链接的字数个数限制
  14. 运用python》pyautogui自动刷智慧树网课的脚本
  15. android剪贴板数据来源,Android判断程序回到前台并获取剪贴板数据
  16. python psutil 汇总 tcy
  17. Sublime 如何替换换行符
  18. 计算机系统的图像编码方式,彩色图像编码方案
  19. 03.07:BT下载&区块链技术
  20. Eclipse(Windows)下第一个动态Java Web项目(Tomcat部署)

热门文章

  1. Bridge(桥模式)
  2. java 运算符的程序_【Java】运算符
  3. dateframe取某列数据_数据清洗amp;预处理入门完整指南
  4. oracle 日志解析工具,Oracle logminer 日志分析工具使用
  5. php禁止外部域名请求,php-阻止来自其他域的请求
  6. 流类库——输入输出流控制详解
  7. centos7修改命令行或图形界面启动模式
  8. Android源码分析:Activity启动流程
  9. [官方消息]优秀云大使推广经验分享合集
  10. es6异步编程 Promise 讲解 --------各个优点缺点总结