1.3 Node给JavaScript带来的意义

V8给Chrome浏览器带来了一个强劲的心脏,使得它在浏览器大战中脱颖而出,也使得Ryan Dahl在语言评估中为选择JavaScript增加了一个极大的权重值。这里我们要谈谈Node给JavaScript带来的一个新局面。鉴于Node之前那些不给力的后端JavaScript实现,在性能和编程模型等方面没能达到与其他语言一较高下的程度,这里先撇开不谈,先谈谈Node与浏览器的对比。

Chrome浏览器和Node的组件构成如图1-1所示。我们知道浏览器中除了V8作为JavaScript引擎外,还有一个WebKit布局引擎。HTML5在发展过程中定义了更多更丰富的API。在实现上,浏览器提供了越来越多的功能暴露给JavaScript和HTML标签。这个愿景美好,但对于前端浏览器的发展现状而言,HTML5标准统一的过程是相对缓慢的。JavaScript作为一门图灵完备的语言,长久以来却限制在浏览器的沙箱中运行,它的能力取决于浏览器中间层提供的支持有多少。

图1-1 Chrome浏览器和Node的组件构成

除了HTML、WebKit和显卡这些UI相关技术没有支持外,Node的结构与Chrome十分相似。它们都是基于事件驱动的异步架构,浏览器通过事件驱动来服务界面上的交互,Node通过事件驱动来服务I/O,这个细节将在第3章中详述。在Node中,JavaScript可以随心所欲地访问本地文件,可以搭建WebSocket服务器端,可以连接数据库,可以如Web Workers一样玩转多进程。如今,JavaScript可以运行在不同的地方,不再继续限制在浏览器中与CSS样式表、DOM树打交道。如果HTTP协议栈是水平面,Node就是浏览器在协议栈另一边的倒影。Node不处理UI,但用与浏览器相同的机制和原理运行。Node打破了过去JavaScript只能在浏览器中运行的局面。前后端编程环境统一,可以大大降低前后端转换所需要的上下文交换代价。

对于前端工程师而言,自己所熟悉的JavaScript如今竟然可以在另一个地方放出异彩,不谈其他原因,仅仅因为好奇,就值得去关注和探究它。


随着Node的出现,关于JavaScript的想象总是无限的。目前,社区已经出现node-webkit这样的项目,这个项目在2012年的沪JS会议上首次介绍给了公众。如同上文提及的关于浏览器的优势和限制,在node-webkit项目中,它将Node中的事件循环和WebKit的事件循环融合在一起,既可以通过它享受HTML、CSS带来的UI构建,也能通过它访问本地资源,将两者的优势整合到一起。桌面应用程序的开发可以完全通过HTML、CSS、JavaScript完成。