Node简介
Node 的命名与起源
在Node的官方网站nodejs.org之外,Node具有很多别称:Nodejs、NodeJS、Node.js等。
为什么是JavaScript
Ryan Dahl是一名资深的C/C++程序员,在创造出Node之前,他的主要工作都是围绕高性能Web服务器进行的。经历过一些尝试和失败之后,他找到了设计高性能,Web服务器的几个要点:事件驱动、非阻塞I/O。
所以Ryan Dahl最初的目标是写一个基于事件驱动、非阻塞I/O的Web服务器,以达到更高的性能,提供Apache等服务器之外的选择。他提到,大多数人不设计一种更简单和更有效率的程序的主要原因是他们用到了阻塞I/O的库。写作Node的时候,Ryan Dahl曾经评估过C、Lua、Haskell、Ruby等语言作为备选实现,结论为:C的开发门槛高,可以预见不会有太多的开发者能将它用于日常的业务开发,所以舍弃它;Ryan Dahl觉得自己还不足够玩转Haskell,所以舍弃它;Lua自身已经含有很多阻塞I/O库,为其构建非阻塞I/O库也不能改变人们继续使用阻塞I/O库的习惯,所以也舍弃它;而Ruby的虚拟机由于性能不好而落选。
相比之下,JavaScript比C的开发门槛要低,比Lua的历史包袱要少。尽管服务器端JavaScript存在已经很多年了,但是后端部分一直没有市场,可以说历史包袱为零,为其导入非阻塞I/O库没有额外阻力。另外,JavaScript在浏览器中有广泛的事件驱动方面的应用,暗合Ryan Dahl喜好基于事件驱动的需求。当时,第二次浏览器大战也渐渐分出高下,Chrome浏览器的JavaScript引 擎V8摘得性能第一的桂冠,而且其基于新BSD许可证发布,自然受到Ryan Dahl的欢迎。考虑到高性能、符合事件驱动、没有历史包袱这3个主要原因,JavaScript成为了Node的实现语言。
为什么叫Node
起初,Ryan Dahl称他的项目为web.js,就是一个Web服务器,但是项目的发展超过了他最初单纯开发一个Web服务器的想法,变成了构建网络应用的一个基础框架,这样可以在它的基础上构建更多的东西,诸如服务器、客户端、命令行工具等。Node发展为一个强制不共享任何资源的单线程、单进程系统,包含十分适宜网络的库,为构建大型分布式应用程序提供基础设施,其目标也是成为一个构建快速、可伸缩的网络应用平台。它自身非常简单,通过通信协议来组织许多Node,非常容易通过扩展来达成构建大型网络应用的目的。每一个Node进程都构成这个网络应用中的一个节点,这是它名字所含意义的真谛。
Node与浏览器的对比
V8给Chrome浏览器带来了一个强劲的心脏,使得它在浏览器大战中脱颖而出,也使得Ryan Dahl在语言评估中为选择JavaScript增加了一个极大的权重值。这里我们要谈谈Node给JavaScript带来的一个新局面。鉴于Node之前那些不给力的后端JavaScript实现,在性能和编程模型等方面没能达到与其他语言一较高下的程度,这里先撇开不谈,先谈谈Node与浏览器的对比。
我们知道浏览器中除了V8作为JavaScript引擎外,还有一个WebKit布局引擎。 HTML5在发展过程中定义了更多更丰富的API。在实现上,浏览器提供了越来越多的功能暴露给JavaScript和HTML标签。这个愿景美好,但对于前端浏览器的发展现状而言,HTML5标准统一的过程是相对缓慢的。JavaScript作为一门图灵完备的语言,长久以来却限制在浏览器的沙箱中运行,它的能力取决于浏览器中间层提供的支持有多少。
除了HTML、WebKit和显卡这些UI相关技术没有支持外,Node的结构与Chrome十分相似。它们都是基于事件驱动的异步架构,浏览器通过事件驱动来服务界面上的交互,Node通过事件驱动来服务I/O。在Node中,JavaScript可以随心所欲地访问本地文件,可以搭建WebSocket服务器端,可以连接数据库,可以如Web Workers一样玩转多进程。
如今,JavaScript可以运行在不同的地方,不再继续限制在浏览器中与CSS样式表、DOM树打交道。如果HTTP协议栈是水平面,Node就是浏览器在协议栈另一边的倒影。Node不处理UI,但用与浏览器相同的机制和原理运行。Node打破了过去JavaScript只能在浏览器中运行的局面。前后端编程环境统一,可以大大降低前后端转换所需要的上下文交换代价。对于前端工程师而言,自己所熟悉的JavaScript如今竟然可以在另一个地方放出异彩,不谈其他原因,仅仅因为好奇,就值得去关注和探究它。