Node.js实战1.5 默认DIRT_Node.js实战1.5 默认DIRT试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > Node.js实战 > 1.5 默认DIRT

Node.js实战——1.5 默认DIRT

Node从构建开始就有一个事件驱动和异步的模型。JavaScript从来没有过标准的I/O库,那是服务端语言的常见配置。对于JavaScript而言,这总是由“宿主”环境决定的。JavaScript最常见的宿主环境,也是大多数开发人员所用的,就是浏览器,它是事件驱动和异步的。 Node重新实现了宿主中那些常用的对象,尽量让浏览器和服务器保持一致,比如: 计时器API(比如setTimeout); 控制台API(比如console.log)。 Node还有一组用来处理多种网络和文件I/O的核心模块。其中包括用于HTTP、TLS、HTTPS、文件系统(POSIX)、数据报(UDP)和NET(TCP)的模块。这些核心模块刻意做得很小、底层并且简单,只包含要给基于I/O的程序用的组成部分。第三方模块基于这些核心模块,针对常见的问题进行了更高层的抽象。 平台与框架 Node是JavaScript程序的平台,不要把它跟框架相混淆。很多人都误把Node当做JavaScript上的Rails或Django,实际上它更底层。 但如果你对Web程序的框架感兴趣,本书后面会介绍在Node中非常流行的Express框架。 聊了这么多了,你可能很想知道Node程序的代码长什么样子。我们来看几个简单的例子: 一个简单的异步程序; 一个Hello World Web服务器; 一个数据流的例子。 我们先来看一个简单的异步程序。 1.5.1 简单的异步程序 你应该在1.2节见过下面这个使用jQuery的Ajax例子: 我们要在Node里做一个跟这个差不多的例子,不过这次是用文件系统(fs)模块从硬盘中加载resource.json。注意看下面这个程序跟前面那个jQuery的例子有多像: 这段程序要从硬盘里读取resource.json文件。当所有数据都读出来后,会调用那个匿名函数(即“回调函数”),传给它的参数是er(如果出现错误)和data(文件中的数据)。 这个过程是在后台完成的,这样在该过程中,我们可以继续处理其他任何操作,直到数据准备好。我们之前说过的那些事件触发和异步的好处都是自动实现的。差别在于,这个不是在浏览器中用jQuery发起一个Ajax请求,而是在Node中访问文件系统抓取resource.json。后面这个过程如图1-5所示。 图1-5 Node中的非阻塞I/O示例 1.5.2 Hello World HTTP服务器 Node常被用来构建服务器。有了Node,创建各种服务器变得非常简单。如果你过去习惯于把程序部署到服务器中运行(比如把PHP程序放到Apache HTTP服务器上),可能会觉得这种方式很怪异。在Node中,服务器和程序是一样的。 下面是个简单的HTTP服务器实现,它会用“Hello World”响应所有请求: 只要有请求过来,它就会激发回调函数function (req, res),把“Hello World”写入到响应中返回去。这个事件模型跟浏览器中对onclick事件的监听类似。在浏览器中,点击事件随时都可能发生,所以要设置一个函数来执行对事件的处理逻辑,而Node在这里提供了一个可以随时响应请求的函数。 下面是同一服务器的另一种写法,这样看起来request事件更明显: 1.5.3 流数据 Node在数据流和数据流动上也很强大。你可以把数据流看成特殊的数组,只不过数组中的数据分散在空间上,而数据流中的数据是分散在时间上的。通过将数据一块一块地传送,开发人员可以每收到一块数据就开始处理,而不用等所有数据都到全了再做处理。下面我们用数据流的方式来处理resource.json: 只要有新的数据块准备好,就会激发data事件,当所有数据块都加载完之后,会激发一个end事件。由于数据类型不同,数据块的大小可能会发生变化。有了对读取流的底层访问,程序就可以边读取边处理,这要比等着所有数据都缓存到内存中再处理效率高得多。 Node中也有可写数据流,可以往里写数据块。当HTTP服务器上有请求过来时,对其进行响应的res对象就是可写数据流的一种。 可读和可写数据流可以连接起来形成管道,就像shell脚本中用的|(管道)操作符一样。这是一种高效的数据处理方式,只要有数据准备好就可以处理,不用等着读取完整个资源再把它写出去。 我们借用一下前面那个HTTP服务器,看看如何把一张图片流到客户端: 在这行代码中,数据从文件中读进来(fs.createReadStream),然后数据随着进来就被送到(.pipe)客户端(res)。在数据流动时,事件轮询还能处理其他事件。 Node在多个平台上均默认提供了DIRT方式,包括各种Windows和类UNIX系统。底层的I/O库(libuv)特意屏蔽了宿主操作系统的差异性,提供了统一的使用方式,如果需要的话,程序可以在多个设备上轻松移植和运行。

展开全文


推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《Node.js实战》其他试读目录

• 1.1 构建于JavaScript之上
• 1.2 异步和事件触发:浏览器
• 1.3 异步和事件触发:服务器
• 1.4 DIRT程序
• 1.5 默认DIRT [当前]
• 1.6 小结
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  •