共计 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 定义一个变量,它只是在以后模块中有一个变量,不会放到全局中