Node.js 是什么?
node.js是一个javascript运行时环境,javascript的运行平台。
那么问题来了,为什么node.js
可以运行javascript
呢?
node.js
内置了v8
,V8
是google
开源的JavaScript
引擎,用于将JavaScript
代码转换成机器码,然后执行。v8
是以C++
语言开发的。 node.js=V8+内置基本模块(大多用JavaScript编写),类似JRE=JVM+java标准.
Node.js架构
要想深入理解 Node.js,我们需要把 Node.js 进行必要的拆解,了解每个组成部分的作用,它们之间如何交互,最终构成 Node.js 这个强大的运行时环境。
上图是 Node.js
的内部结构图。我们可以看到,自底向上主要可以分成三层:最底层是 Node.js
依赖的各种库,有 V8
、libuv
等;中间层是各种 Binding
,也就是胶水代码;最上层是应用代码,可使用 Node.js
的各种 API
。
·v8
Google
开源的高性能JavaScript
引擎,它将JavaScript
代码转换成机器码,然后执行,因此速度非常快。V8
以 C++
语言开发,Google
的Chrome
浏览器正是使用的 V8
引擎。
·libuv
libuv
以C
语言开发,内部管理着一个线程池。在此基础之上,提供事件循环(Event Loop
)、异步网络I/O
、文件系统 I/O
等能力。
·其他底层依赖库
如 c-ares
、crypto
(OpenSSL
)、http-parser
以及zlib
。这些依赖提供了对系统底层功能的访问,包括网络、压缩、加密等。
Node.js
底层的依赖库,有的以C
语言开发,有的以 C++
语言开发,如何让应用代码(JavaScript
)能够与这些底层库相互调用呢?这就需要中间层的 Binding
来完成。Binding
是一些胶水代码,能够把不同语言绑定在一起使其能够互相沟通。在 Node.js
中,binding
所做的就是把 Node.js
那些用 C/C++
写的库接口暴露给 JS
环境。 中间层中,除了 Binding
,还有 Addon
。Binding
仅桥接Node.js
核心库的一些依赖,如果你想在应用程序中包含其他第三方或者你自己的 C/C++
库的话,需要自己完成这部分胶水代码。你写的这部分胶水代码就称为 Addon
。本质上都是完成桥接的作用,使得应用与底层库能够互通有无。这么做的目的之一是代码重用:这些功能已经有现存的成熟实现,没必要只是因为换个语言环境就重写一遍,如果桥接调用一下就足够的话。另一个原因是性能:C/C++
这样的系统编程语言通常都比其他高阶语言(Python
、JavaScript
、Ruby
等等)性能更高,所以把主要消耗 CPU
的操作以 C/C++
代码来执行更加明智。