JavaScript挺入服务器端开发语言序列(1)(2)
Node入门
下面是试用最新版Node最简单的方法。
- $ git clone git://github.com/ry/node.git
- $ cd node
- $ ./configure
- $ make
- $ sudo make install
- $ node-repl
比较独特的是,Node.js会假设你是在POSIX环境下运行它Linux 或 Mac OS X。如果你是在Windows下,那就需要安装MinGW以获得一个仿POSIX的环境。在Node中,Http是首要的。Node为创建http服务器作了优化,所以你在网上看到的大部分示例和库都是集中在web上(http框架、模板库等)。下面是一个简单的hello worldWeb服务器:
- var sys = require(sys),
- http = require(http);
- server = http.createServer(function (req, res) {
- res.writeHeader(200, {Content-Type: text/plain});
- res.write(Hello World);
- res.close();
- })
- server.listen(8000);
- sys.puts(Server running at a href="http://127.0.0.1:8000/);
让我们分别来看这段代码的各个部分:
- var sys = require(sys),
- http = require(http);
这就是CommonJS API导入的地方。require函数是导入模块的标准方式。在CommonJS出现之前,JavaScript程序员得使用类似于Python中的import语句或是Ruby中的require一样导入代码包。
- server = http.createServer(function (req, res) {
- res.writeHeader(200, {Content-Type: text/plain});
- res.write(Hello World);
- res.close();
- })
createServer函数需要设置一个回调函数,以便每次有新的请求到来时回调函数都会运行。以下是如何运行该Web服务器示例:
- $ node hello-world.js
- Server running at a href="http://127.0.0.1:8000/
即使是只用这么少量的代码,Node都能快速地部署一个真正的服务器。如果要测试服务器的性能,Apache Bench是一个优秀的负载测试小工具。在我的MacBook Pro(3.0 GHz Intel Core 2 Duo 以及4GB 1067 MHz 内存)上,这就是"hello world"服务器在每次4个请求、总共10,000个请求下的表现:
- $ ab -c 4 -n 10000 a href="http://127.0.0.1:8000/
- ...
- Requests per second: 6560.50 [#/sec] (mean)
- ...
当然,大多数的基准测试数据都不可信。上面的这个数据尤甚,因为它是在一台笔记本电脑上运行的,而不是通过一个真正的网络。然而,对每秒6560次请求进行处理,这并没有什么可笑之处。V8是一个强大快速的JavaScript解释器,Node又进一步对它进行了改进,让它成为一个引人注目的、可用于构建服务器的平台。
那么,它有什么缺陷吗?
随着Node的出现,Rails和Django 认为有一些特性还不完备,这是理所当然的。在开发过程中,有一个很小、但是却很重要的特性还没实现,那就是在服务器的源代码改动之后自动重启服务器。其它的一些功能,像步进调试器(step-debugger)和REPL交互提示都已经可用并且很管用,但这跟Python和Ruby中的相应工具比较起来还是稍显粗糙。
在Node的代码库中正在发生许多变动,各个版本的核心API也会不同。当然,这些变化会让API更一致,所以我也不会埋怨什么。Node的开发速度让人想起了Ruby on Rails的初期,大量的创意付诸实施,一个星期不关注,你就会发现很多东西都改变了。这就是这个项目最好的、也是最不好的地方。更多的眼球关注会让更多的bug得到修复,新功能也将更快地得以实现,这是好事;但坏处就是你得努力跟上它的变化。
在Node出现之前,有许多更好,更快的技术可供选择。但现在,情况已经改变了,Node参与到竞争中来了,并且是你下一个服务器软件开发语言选项中的有力竞争者。