一、Node深入之邂逅Node和REPL使用

567 阅读2分钟

什么是Node.js

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

Atwood定律

任何可以使用JavaScript来实现的应用,最终都会使用JavaScript实现

浏览器内核

指的是浏览器的排版引擎。在渲染引擎工作的过程中,HTML解析时遇到了JavaScript标签,会停止解析HTML,去加载和执行JavaScript代码。为什么不直接异步加载执行JavaScript?首先,js可以操作DOM;其次浏览器希望将HTML解析的DOM和js操作之后的DOM放在一起生成最终的DOM树,而不是频繁的生成新的DOM树。

WibKit内核

  • WebCore:负责HTML解析、布局、渲染等工作
  • JavaScript:解析、执行js代码

js引擎

  • js代码无论交给浏览器或Node执行,都需要被CPU执行;
  • 但CPU只认识机器语言;
  • js引擎帮我们将js代码翻译成CPU指令来执行 常见的js引擎
  • SpiderMonkey
  • ChaKra
  • JavaScriptCore (小程序)
  • V8

V8

  • 用C++编写Google开源高性能JavaScript和WebAssembly引擎,它用于Chrome和Node.js等
  • 实现ECMAScript和WebAssembly
  • V8可以独立运行,也可以嵌入到任何C++应用程序中

V8引擎原理

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

Node.js架构

  • js代码会经过V8引擎,再通过Node.js的Bindings,将任务放到Libuv的事件循环中
  • libuv是使用C语言编写的库
  • libuv提供了事件循环、文件系统读写、网络IO、线程池等内容

Node.js应用场景

  • 目前前端开发的库都是以node包的形式进行管理
  • npm、yarn工具成为前端开发使用最多的工具
  • 越来越多的公司用Nodejs作为web服务器开发
  • 大量项目需要借助Nodejs完成前后端渲染和同构应用
  • 为项目编写脚本工具
  • Electron开发桌面应用

Node安装

Node版本工具 nvm n

  • nvm install 8.12.0
  • nvm install stable
  • nvm uninstall 8.12.0
  • nvm use 8.12.0

Node的REPL

  • Read-Eval-Print-Loop 翻译为读取-求值-输出

  • REPL是一个简单的交互式的编程环境