Node的诞生历程

上述这篇文章很好的介绍了Node整个时间历程的重要结点。
为什么Node选择了JavaScript
最主要的原因是Node的作者Ryan Dahl认为设计一个高性能的Web服务器的几个要点: 事件驱动, 非阻塞I/O,而JavaScript不但很好的契合了他的需要, 而且语言本身没有历史包袱, 再加上V8引擎的性能优异, 最终决定选择JavaScript。
Node的组件构成

- V8: Google 开源的高性能 JavaScript 引擎,以 C++ 实现,V8 将你写的 JavaScript 代码编译为机器码(所以它超级快)然后执行。
- libuv: 提供异步功能的 C 库。它在运行时负责一个事件循环(Event Loop)、一个线程池、文件系统 I/O、DNS 相关和网络 I/O,以及一些其他重要功能。
- 其他 C/C++ 组件和库: 如 c-ares、crypto (OpenSSL)、http-parser 以及 zlib。这些依赖提供了对系统底层功能的访问,包括网络、压缩、加密等。
- Application/Modules: 这部分就是所有的 JavaScript 代码:你的应用程序、Node.js 核心模块、任何 npm install 的模块,以及你写的所有模块代码。你花费的主要精力都在这部分。
- Bindings: Binding 是一些胶水代码,能够把不同语言绑定在一起使其能够互相沟通。在 Node.js 中,binding 所做的就是把 Node.js 那些用 C/C++ 写的库接口暴露给 JS 环境。这么做的目的之一是代码重用.
- C/C++ Addons: Binding 仅桥接 Node.js 核心库的一些依赖,zlib、OpenSSL、c-ares、http-parser 等。如果你想在应用程序中包含其他第三方或者你自己的 C/C++ 库的话,需要自己完成这部分胶水代码。你写的这部分胶水代码就称为 Addon。可以把 Binding 和 Addon 视为连接 JavaScript 代码和 C/C++ 代码的桥梁。Node的特点
- 异步IO
异步调用中对于结果值的捕获是符合“Don't call me, I will call you.”的原则的,这是注重结果不关心过程的一种表现。

- 事件与回调函数
Node.js实现异步的核心是事件驱动。也就是说,它把每一个任务都当成事件来处理,然后通过Event Loop模拟了异步的效果, 而能体现事件驱动机制本质的最简单形式就是函数的回调。
Node中的绝大多数对象,比如HTTP请求,响应,流,都是实现了EventEmitter模块,所以它们可以触发或监听事件。
- 单线程
这里的单线程指的是Node保留了JavaScript在浏览器中的单线程特性, 单线程的好处是不像多线程需要考虑状态的同步问题, 死锁, 以及线程之间切换的性能开销。
单线程的弊端:
1. 无法利用多核CPU
2. 健壮性不好
3. 大量计算占用CPU导致无法继续调用异步I/O