有很多介绍nodejs的文章,也有很多教程,覆盖了服务器开发、桌面开发、移动端等等,但是鲜有文章明确的回答过一个问题:Node是什么?
这看起来是一个再简单过的问题了,真要答起来可不容易,不去深入研究的话可能会认为Node就是javascript,javascript就是Node,笔者最初也是这么认为的,但这种想法并不正确。
要寻求正确的答案首先要弄明白Node与JavaScript的关系,在Node官网是这样描述的:
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
大概的意思就是Node是一个支持javascript的运行时(runtime),是用来完成运行脚本所需要的系统底层支持。严格的说来,Node支持的只是ECMAScript语法,它属于javascript的一部分。
① ECMAScript:描述了该语言的语法和基本对象。
② DOM:文档对象模型,处理网页内容的方法和接口。
③ BOM:浏览器对象模型,与浏览器进行交互的方法和接口。
对于编程语言而言,语法的作用是面向开发者所体现的,最终交付于硬件执行的效果却是体现在解释/编译器上的。Node采用C++实现与系统底层的互动,遵循的语法是ECMAScript,当然如果把内核的V8引擎更换一下,完全可以实现对Ruby或Python的支持。
为什么Node选择了javascript?完全是因为出色的V8引擎。
Node.js里头没有DOM和BOM的操作,只保留的JavaScript的语法核心(ES), 并且增加了事件驱动的非阻塞 I/O 模型,使其轻量级和高效,并且V8是基于ECMAScript标准实现的,因此Node.js作为服务运行在Windows、Linux、Mac设备时,把JavaScript的角色从前台开发,转移到了后台开发。
Node.js完成了javascript和硬件之间的沟通,充当翻译官的角色。这过程中涉及了两个重要的概念:
· runtime
· VM
最出名的runtime当属VC++,借助微软推出的VC++,开发者只需要编写C/C++代码即可完成Windows程序开发,而不需要考虑与硬件交互的底层操作。同样的,V8在Node中作为javascript的runtime出现,,这与chrome内嵌V8的作用是一样的,不过node针对IO做了更多的扩展,比如FS模块的实现等等。
这里关于另一个概念VM,泛指二进制文件与硬件之间的交互层。作为开发者所熟知的对比,C++编译后的二进制文件可以直接被系统调用,但对于java而言,编译好的字节码虽然也是二进制文件,单必须交给虚拟机运行,虚拟机完成与系统和硬件的互动。这样的好处是开发者无需顾忌系统和硬件的差异,由虚拟机完成不同系统的抽象来实现同样的运行时。
因此借助Node.js,目前出现了大批跨平台的桌面端开发工具,比如老牌的NW.js和新兴的electron等等。这也引起了javascript语言生命力大爆发,无论是传统设备还是物联网等各方面都能看到它的影子。