什么是Node

-Node.js是一个基于V8 JavaScript引擎的Javascript运行时环境

浏览器内核

  • 不同浏览器有不同内核组成
    • Gecko
    • Trident
    • Webkit
    • Blink :Webkit 的一个分支
  • 浏览器内核是浏览器的排版引擎
    • 排版引擎也称为浏览器引擎页面渲染引擎,或者样版引擎

渲染引擎工作过程

JavaScript引擎

在编写js时 无论交给浏览器或者Node执行,最后都是需要被CPU执行, CPU只认是自己的指令集, 实际上是机器语言才能被CPU所执行 所以需要Js引擎帮助我们将JS代码翻译成CPU指令来执行

常见的JS引擎

  • SpiderMonkey 第一款 Js作者开发
  • Chakra 微软
  • JavaScriptCore Webkit中的Js引擎 apple
  • V8 Google Chrome

Webkit内核

由两部分组成

  • WebCore:负责HTML解析 布局 渲染等相关工作
  • JavaScriptCore : 解析执行JS代码

V8引擎

  • V8是用C++编写的Google开源高性能JS和WebAssembly引擎,用 于Chrome和Node.js等

  • Node.js是跨平台的

  • 可以嵌入到任何C++程序

V8引擎执行js原理

  • Parse模块 将 JavaScript 代码转换成AST(抽象语法树) 因为解释器并不直接会认是JavaScript代码
    • 如果函数没有被调用 是不会被转换成AST的
  • Ignition是一个解释器 会将AST转换成ByteCode(字节码)
    • 同时会收集TurboFan优化所需要的信息(比如函数参数的类型信息,有了类型才能真实的运算)
    • 如果函数只调用一次 Ignition会执行解释Byte-Code
  • TurboFan是一个编译器 将字节码编译为CPU可以直接执行的机器码
    • 如果一个函数被多次调用 会被标记为热点函数 会经过TurboFan转换成优化的机器码,提高代码的执行性能
    • 机器码实际上会被还原为ByteCode 因为如果后续执行函数的过程中,类型发生了变化,(比如一个sum函数原来执行的是number类型,后来变成了string类型) 之前优化的机器码不能正确的处理运算 就会逆向的转换成字节码
  • V8内存回收
    • Orinoco模块 负责垃圾回收 将程序中不需要的内存回收

Node.js架构

浏览器和Node.js架构区别

Node.js

  • 我们编写的JavaScript代码会经过V8引擎,再通过Node.js的Bindings,将任务放到Libuv的事件循环中;

  • Libuv是使用C语言编写的库

  • libuv提供了事件循环 文件系统读写 网络IO 线程池等内容

Node.js使用

  • 安装
    • LTS稳定 线上
    • Current 支持新特性
    • 安装过程配置环境变量(让我们在命令行使用) 并且安装npm(Node Package Manage)
  • 管理Node 的版本 更新切换版本的工具
    • nvm
    • n (交互式管理Node.js版本)

Node 的REPL

  • REPL是 Read-Eval-Print Loop 的简称
  • REPL是一个简单的、交互式的编程环境

process 全局对象

Node程序传入参数

  • 正常情况执行node程序
    • node index.js
  • 给node传参
    • node index.js hyp age=18
  • argv属性
    • process是一个全局对象,argv返回的是一组包含命令行参数的数组。
    • 第一项为”node”,第二项为执行的js的完整路径,后面是附加在命令行后的参数

Node的输出

常见的全局对象

  • process对象

    • process提供了Node进程中相关的信息: 比如Node的运行环境、参数信息等;
  • console对象

  • 定时器函数:在Node中使用定时器有好几种方式:

    • setTimeout(callback, delay[, …args]):callback在delay毫秒后执行一次;
    • setInterval(callback, delay[, …args]):callback每delay毫秒重复执行一次;
    • setImmediate(callback[, …args]):callback I / O事件后的回调的“立即”执行
    • process.nextTick(callback[, …args]):添加到下一次tick队列中;

    特殊的全局对象

  • 这些全局对象可以在模块中任意使用,但是在命令行交互中是不可以使用的

  • _dirname 当前文件所在路径

  • _filename 当前路径+文件名

Global全局对象

global是一个全局对象,事实上前端我们提到的process、console、setTimeout等都有被放到global中

global和window的区别

在node中,我们通过var定义一个变量,它只是在当前模块中有一个变量,不会放到全局中: