咱们为何使用Node

引言:Node 已经迅速成为一个可行而且真正高效的web 开发平台。在Node 诞生以前,在服务端运行JavasScript 是件难以想象的事情,而且对其余的脚本语言来讲,要实现非阻塞I/O 一般须要依赖特殊的类库。但Node 的出现改变了这一切。 本文选自《Node.js硬实战:115个核心技巧》,让咱们跟着本文快速的复习一下Node是什么以及他的主要特性有哪些。

为何使用Node

  假设你正在开发一个广告服务器,每分钟须要发布几百万条的广告。Node 的非阻塞I/O将是一个高效的解决方案,由于服务器可以最大限度地利用到全部的I/O 资源,而这一切不须要你写特殊的底层代码。而且,假如你已经有一支会写JavaScript 的开发团队,那么他们应该能够直接参与到Node 的项目中。传统的web 平台将没法作到这一点,这也是为何像微软这样的公司也在积极地推进Node,尽管他们已经有了像.NET 那么优秀的平台。Visual Studio(.NET IDE) 的用户能够安装一些工具来支持对Node 的智能提示、性能监测,甚至npm。微软还开发了WebMatrix,它不但能直接支持Node,并且还能部署Node 项目。 
  Node 把非阻塞I/O 做为提升某些类型应用的性能的方式。JavaScript 传统的事件机制意味着在异步编程中,它有着相对方便以及容易理解的语法。在传统的编程语言中,I/O的操做将阻塞进程直到它完成为止。Node 的异步文件读写以及网络API 意味着在这些相对较慢的I/O 操做处理的时候主进程仍然能处理其余请求。下图展现了如何使用异步的网络和文件API 同时处理多个任务。 
图片描述
  在图中,Node 的http 模块接收到而且解析了一个新的HTTP 请求① ,而后服务端的应用代码使用异步接口,将一个回调函数传入数据库的读取函数中来进行一次数据查询②。在等待数据返回的同时服务器可以从文件系统中读取网页模板文件③ ,这个模板文件被用来展现网页。一旦数据库完成查询,模板内容和数据库的返回数据将被用来渲染页面④。 
  在服务器处理这个请求的同时,服务器还能够用可用的资源处理其余的请求⑤ 。在不用考虑多线程的状况下开发这个广告服务,你能够仅使用最基本的JavaScript 编程技术,经过Node,很是高效地使用服务器I/O 资源。 
  其余Node 适用的场景是Web API 和网络爬虫,若是你须要下载以及截取网页的内容,那么Node 将是很是完美的解决方案,由于它能模拟DOM 操做,而且运行客户端JavaScript脚本。并且在这个场景中,Node 有着性能优点,由于网络爬虫主要的消耗在于网络和文件读写的I/O。 
  假如你须要调用或者开发一个JSON API,Node 也是一个很是棒的选择,由于它使得操做JavaScript 对象变得很是简单。Node 的一些web 框架(例如express)可以快速地搭建JSON API。 
  Node 不只仅局限于web 应用,你能够建立任意你想要的TCP/IP 服务,好比网络游戏服务器,经过TCP/IP 套接字向各种玩家发送游戏状态,也能够在后台任务中维护游戏数据,将数据发送给玩家。web

何时使用Node

  下面是一些Node 适用的应用例子,来帮你像一个真正的Node 开发者同样来考虑这个问题。数据库

情景:广告分布系统

  Node 的强项: 
  • 有效地分配小块信息 
  • 处理潜在的网络速度慢的链接 
  • 容易扩展为多个处理器或服务器express

情景:游戏服务器

  Node 的强项: 
  • 使用JavaScript 来构建业务逻辑模型 
  • 不使用C 语言来开发迎合特定网络的服务器程序npm

情景:内容管理系统、博客

  Node 的强项: 
  • 对已经有客户端JavaScript 开发经验的团队来讲,能够很轻松地建立RESTful JSON APIs 
  • 轻量的服务器,和浏览器端JavaScript 结合编程

Node 的主要特性

  Node 的主要特性是它的标准类库、模块系统以及npm(包管理系统),固然还有不少其余的。 
  实际上Node 最强大的特性是它的标准类库,它主要由二进制类库以及核心模块两部分组成,二进制类库包括libuv ,它为网络以及文件系统提供了快速的事件轮循以及非阻塞的I/O。同时它还有http 类库,因此你能够很快肯定你的http 客户端与服务端。 
图片描述
  上图是对Node 内部的高层次概述,展现了各个模块是如何组合的。 
  Node 的核心模块主要由JavaScript 编写,也就是说,假如你不理解或者你想了解更多细节,你能够直接阅读Node 的源码。这不但包括像网络、文件操做、模块系统,以及stream 这些模块,还包括Node 特有的特性,例如,经过cluster 模块同时运行多个Node进程,以及能够将代码片断封装在事件驱动的异常处理中的domain 模块。 
接下来,咱们将从事件开始深刻每一个核心模块。浏览器

1. EventEmitter 事件的接口

  每一个Node 开发者早晚会碰到EventEmitter ,一开始,它像是那些只有类库开发者才会使用的东西,但实际上它是大多数Node 核心模块的基础,Stream、网络、文件系统所有继承于它。 
你能够基于EventEmitter 来建立本身基于事件的API,例如你要开发一个paypal 付款处理的模块,你可让它基于事件,这样Payment 对象的实例能够触发像paid 和refund 这样的事件,经过这样的设计,你能够将这个模块从你的业务逻辑中分离出来,让它能够在其余项目中被重用。 
一个有意思的地方是,stream 模块也是基于EventEmitter 的。安全

2. Stream:高可扩展性I/O 的基础

  Streams 继承于EventEmitters ,能被用来在不可预测的输入下建立数据,好比网络链接,数据传输速度取决于其余用户正在干什么。经过Node 的stream API,你能够建立一个对象接收关于链接的事件,在接收到新数据时触发data 事件,在结束链接时触发end 事件,在有错误发生时触发error 事件。 
  相比较把许多的回调函数传入一个readable stream 的构造函数,你只订阅你关心的事件要好得多,多个streams 也能够链接起来,这样你能够用一个stream 对象从网络读取数据,把读取到的数据输送到另一个stream 中加工成另一个对象,能够把xml 文件的数据读取出来转换成JSON 格式,让JavaScript 操做起来更容易。 
  你可能以为stream 和事件听上去很抽象,没错,它们的确很抽象,但它们是I/O 模块(例如文件系统和网络)的基础。服务器

3. FS:处理文件

  Node 的文件模块不但能够经过非阻塞的I/O 读写文件,并且它也有同步的方法。你能够经过fs.stat 异步获取文件的信息,也能够经过fs.statSync 同步读取。 
  若是你想经过Stream 的方式高效地处理文件内容,那么你能够经过fs.createReadStream来得到一个ReadableSream 对象。微信

4. 网络:建立网络客户端与服务端

  网络模块是http 模块的基础,也能够用来建立通用的网络客户端与服务端。尽管Node开发一般指的是web 开发,在第7 章你会看到如何建立TCP 和UDP 的服务,这意味着你并不局限于http 开发。网络

5. 全局对象与其余模块

  假如你有用Node 开发web 应用的经验,也许是Express 框架,那么你也许并不知道你已经使用了http 、net 以及fs 等核心模块。其余的内置模块也许不那么吸引眼球,但也是相当重要的。 
  全局对象与方法的设计就是其中一例,好比process 对象,它让你能够把数据传入或者传出标准I/O 流(stdout、stdin)。就像在UNIX 或者Windows 脚本中,你能够把数据经过cat 直接传给Node 程序。还有无处不见的console 对象,全部的JavaScript 开发都爱它,也是一个全局对象。

  了解Node特性后,咱们来看看《Node.js硬实战:115个核心技巧》一书的精简版目录。 
第一部分Node 基础 
1 入门 
2 全局变量:Node 环境 
3 Buffers:使用比特、字节以及编码 
4 Events:玩转EventEmitter 
5 流:最强大和最容易误解的功能 
6 文件系统:经过异步和同步的方法处理文件 
7 网络:Node 真正的“Hello, World” 
8 子进程:利用Node 整合外部应用程序 
第二部分实践中的技巧 
9 网络:构建精简的网络应用 
10 测试:编写健壮代码的关键 
11 调试:用于发现和解决问题 
12 生产环境中的Node:安全地部署应用程序 
第三部分编写模块 
13 编写模块,掌握Node 的全部

  本文选自《Node.js硬实战:115个核心技巧》,点此连接可在博文视点官网查看

                      ​​​​​​​​​​​​​​
​  

  想及时得到更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                        图片描述

相关文章
相关标签/搜索