关于javascript:Node-笔记1内核引擎

36次阅读

共计 3174 个字符,预计需要花费 8 分钟才能阅读完成。

参照教程:
coderwhy – 深刻 Node.js 技术栈

浏览器内核是什么?

咱们常常会说:不同的浏览器有不同的内核组成

  • Gecko:晚期被 Netscape 和 Mozilla Firefox 浏览器应用;
  • Trident:微软开发,被 IE4~IE11 浏览器应用,然而 Edge 浏览器曾经转向 Blink;
  • Webkit:苹果基于 KHTML 开发、开源的,用于 Safari,Google Chrome 之前也在应用;
  • Blink:是 Webkit 的一个分支,Google 开发,目前利用于 Google Chrome、Edge、Opera 等;

事实上,咱们常常说的浏览器内核指的是浏览器的排版引擎:

  • 排版引擎(layout engine),也称为浏览器引擎(browser engine)
  • 页面渲染引擎(rendering engine)或样版引擎

渲染引擎工作的过程

  • 然而在这个执行过程中,HTML 解析的时候遇到了 JavaScript 标签,应该怎么办呢?

    • 会进行解析 HTML,而去加载和执行 JavaScript 代码;
  • 为什么不间接异步去加载执行 JavaScript 代码,而要在这里进行掉呢?

    • 因为 JavaScript 代码能够操作咱们的 DOM;所以浏览器心愿将 HTML 解析的 DOM 和 JavaScript 操作之后的 DOM 放到一起来生成最终的 DOM 树,而不是 频繁的去生成新的 DOM 树;
  • JavaScript 代码由谁来执行呢?

    • JavaScript 引擎

JavaScript 引擎

为什么须要 JavaScript 引擎呢?

  • 事实上咱们编写的 JavaScript 无论你交给浏览器或者 Node 执行,最初都是须要被 CPU 执行的;
  • 然而 CPU 只意识本人的指令集,实际上是机器语言,能力被 CPU 所执行;
  • 所以咱们须要 JavaScript 引擎帮忙咱们将 JavaScript 代码翻译成 CPU 指令来执行;

    比拟常见的 JavaScript 引擎有哪些呢?

  • SpiderMonkey:第一款 JavaScript 引擎,由 Brendan Eich 开发(也就是 JavaScript 作者);
  • Chakra:微软开发,用于 IT 浏览器;
  • JavaScriptCore:WebKit 中的 JavaScript 引擎,Apple 公司开发;
  • V8:Google 开发的弱小 JavaScript 引擎,也帮忙 Chrome 从泛滥浏览器中怀才不遇;

WebKit 内核

WebKit 事实上由两局部组成的:

  • WebCore:负责 HTML 解析、布局、渲染等等相干的工作;
  • JavaScriptCore:解析、执行 JavaScript 代码;

在小程序中编写的 JavaScript 代码就是被 JSCore 执行的;

V8 引擎

  • V8 是用 C ++ 编写的 Google 开源高性能 JavaScript 和 WebAssembly 引擎,它用于 Chrome 和 Node.js 等。
  • 它实现 ECMAScript 和 WebAssembly,并在 Windows 7 或更高版本,macOS 10.12+ 和应用 x64,IA-32,ARM 或 MIPS 处理器的 Linux 零碎上运行。
  • V8 能够独立运行,也能够嵌入到任何 C ++ 应用程序中。

V8 引擎的原理

Parse 模块会将 JavaScript 代码转换成 AST(形象语法树),这是因为解释器并不间接意识 JavaScript 代码;

Ignition 是一个解释器,会将 AST 转换成 ByteCode(字节码)

TurboFan 是一个编译器,能够将字节码编译为 CPU 能够间接执行的机器码;

Orinoco 模块,负责垃圾回收,将程序中不须要的内存回收;

Node.js 是什么

也就是说 Node.js 基于 V8 引擎来执行 JavaScript 的代码,然而不仅仅只有 V8 引擎:

  • 后面咱们晓得 V8 能够嵌入到任何 C ++ 应用程序中,无论是 Chrome 还是 Node.js,事实上都是嵌入了 V8 引擎 来执行 JavaScript 代码;
  • 然而在 Chrome 浏览器中,还须要解析、渲染 HTML、CSS 等相干渲染引擎,另外还须要提供反对浏览器操作 的 API、浏览器本人的事件循环等;
  • 另外,在 Node.js 中咱们也须要进行一些额定的操作,比方文件系统读 / 写、网络 IO、加密、压缩解压文件等 操作;

浏览器和 Node.js 架构区别

Node.js 架构

  • 咱们编写的 JavaScript 代码会通过 V8 引擎,再通过 Node.js 的 Bindings,将工作放到 Libuv 的事件循环中;
  • libuv(Unicorn Velociraptor—独角伶盗龙)是应用 C 语言编写的库;
  • libuv 提供了事件循环、文件系统读写、网络 IO、线程池等等内容;

Node.js 的利用场景

  • 目前前端开发的库都是以 node 包的模式进行治理;
  • npm、yarn 工具成为前端开发应用最多的工具;
  • 越来越多的公司应用 Node.js 作为 web 服务器开发;
  • 大量我的项目须要借助 Node.js 实现前后端渲染的同构利用;
  • 资深前端工程师须要为我的项目编写脚本工具(前端工程师编写脚本通常会应用 JavaScript,而不是 Python 或者 shell);
  • 很多企业在应用 Electron 来开发桌面应用程序;

Node 的版本工具

  • nvm:Node Version Manager;曾经能够在 Windows 应用
  • n:Interactively Manage Your Node.js Versions(交互式治理你的 Node.js 版本)

Node 的 REPL

REPL 是 Read-Eval-Print Loop 的简称,翻译为“读取 - 求值 - 输入”循环;REPL 是一个简略的、交互式的编程环境;

事实上,咱们浏览器的 console 就能够看成一个 REPL。Node 也给咱们提供了一个 REPL 环境,咱们能够在其中演练简略的代码。

Node 程序传递参数

在某些状况下执行 node 程序的过程中,咱们可能心愿给 node 传递一些参数:

node index.js env=development coderwhy

如果咱们这样来应用程序,就意味着咱们须要在程序中获取到传递的参数:获取参数其实是在 process 的内置对象中的;

argv 属性中蕴含了咱们须要的参数

非凡的全局对象

这些全局对象能够在模块中任意应用,然而在命令行交互中是不能够应用的;

  • __dirname:获取以后文件所在的门路
  • __filename:获取以后文件所在的门路和文件名称、

常见的全局对象

process对象:process 提供了 Node 过程中相干的信息:

  • 比方 Node 的运行环境、参数信息等

console对象:提供了简略的调试控制台,在后面解说输出内容时曾经学习过了。

定时器函数:在 Node 中应用定时器有好几种形式:

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

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

global 和 window 的区别

在浏览器中,全局变量都是在 window 上的,比方有 document、setInterval、setTimeout、alert、console 等等

在 Node 中,咱们也有一个 global 属性,并且看起来它外面有很多其余对象。

然而在浏览器中执行的 JavaScript 代码,如果咱们在顶级范畴内通过 var 定义的一个属性,默认会被增加到 window 对象上

然而在 node 中,咱们通过 var 定义一个变量,它只是在以后模块中有一个变量,不会放到全局中

正文完
 0