今天写一篇水文,借用java平台中对应的概念,谈谈对node.js的理解


as a Runtime


node中最重要的组件或许是v8引擎(其他如libeio、libev初学者不需要关注)。这是一个javascript的运行环境,类似于java中的jvm。java代码需要运行在虚拟机里,同样javascript代码也需要一个运行的环境

在node出现之前,运行环境一般就是浏览器。但是有了node就不一样了,不借助浏览器,开发者同样可以得到一个javascript的运行环境。以前想写一段javascript代码执行,一般需要写一个空的html,然后用<script>引入js,在浏览器里跑。现在有了node,可以直接用node xxx.js的方式跑起来,比原来方便很多。所以,即使不准备用node写web app,用node来作为学习javascript的环境也是不错的选择

console.log("hello node");

当然,node环境毕竟不同于浏览器环境。node的top object是global,而不是浏览器的window,所以在浏览器里能执行的代码,在node里不一定能执行(比如DOM API),但是javascript的语法特征则是完全一致的


as a module system


node与浏览器里的javascript还有一个显著的不同,就是node支持模块,遵循CommonJS的模块规范。这点对于一个编程语言来说非常重要。在浏览器里,a.js想引用b.js里的代码,如果不借助框架,原生的办法只有依赖全局变量。比如自定义的js,使用jQuery框架的方式,就是依赖$变量,这是一个global function

在java里,通过import语句,就可以把其他编译单元的代码引用过来,但是js缺乏类似的机制。node通过模块化解决了这个问题,通过require(),module.exports,可以比较简单地实现模块划分和依赖,就类似于java平台的import


as a develop kit


jdk里提供了丰富的API,来支持各种编程任务。比如File来支持文件操作,Socket支持网络编程等,这原本是javascript缺乏的,主要原因是浏览器为了安全目的而故意不提供。这也造成javascript无法胜任服务端编程的工作。但是node提供了类似的丰富API,使得javascript也可以在server端完成这些工作了

比如:

HTTP API

File System API

这里node起的作用,就类似于jdk


as a webserver


以下几行代码,就可以启动一个最基本的http server

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, '127.0.0.1');

而在java平台,这需要一个servlet容器,比如tomcat,jboss等。这个时候,node就类似于java平台中的servlet container。这里说得太简单了,事实上,node的设计与tomcat等thread per request的设计有明显区别,node不仅是一个web server,而且是一个高性能的web server


as a specification


在java平台,开发web app需要遵循servlet规范,否则的话,开发者就需要自己处理http协议,线程管理……还需要自己实现一个服务器。但只要遵循servlet规范来开发,这些都是现成的,而且如果针对接口编程,还不需要绑定具体的容器,可以在servlet container中间件中自由选择。这是java平台规范的威力,但是有的时候也是负担,因为太笨重了

在node中开发一个web app明显没有这么复杂。事实上只有一种实现,所以也谈不上规范,因此也没有很多的server可供选择。究竟是node的简单小巧更好,还是java里由jcp牵头的非常繁杂的jsr更好呢?现在我也不太清楚。但在这里,node就类似于java规范,区别在于只有一种实现


as a framework


用servlet规范完全可以写出一个完整的web app,但是还有谁会这么做呢?一般都会在某种web框架的基础上开发,比如struts2,spring mvc等。同样,在node里只用http module来开发也没问题,但是有框架更好,比如express。所以,基于node的各种package module,就类似于java里的各种web框架


总结


第一次知道node大概是半年之前,那时候就问自己一个问题:node究竟是什么玩意,好像不止是个服务器,也不止是一堆开发API。现在有了更多一点的了解,还是感觉很难用一句话回答node是什么,所以用java里相似的概念,来形容一下node都能做什么

如果整体来比较的话,node应该和java一样,都是一个完整的平台,提供了执行环境、服务、API……但是目前有一个显著的区别,在于java的规范体系比node要更加成熟,所以中间件厂商非常地繁荣,任何一种规范都有很多厂商提供了实现,产品的选择余地很大,而且不与具体的实现耦合。在node里貌似就没有这个现象,反正就只有一种,也没什么可选的

此外利用npm,可以拿到各种各样的package module,质量也是良莠不齐,这点和java也是差不多,java平台上也有各种或好或坏的第三方库,同样需要开发者自己筛选鉴别

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐