我们为什么使用Node

标签: node | 发表时间:2016-12-30 10:35 | 作者:博文视点Broadview
出处:http://www.iteye.com
引言: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 套接字向各类玩家发送游戏状态,也可以在后台任务中维护游戏数据,将数据发送给玩家。

什么时候使用Node
  下面是一些Node 适用的应用例子,来帮你像一个真正的Node 开发者一样来考虑这个问题。

情景:广告分布系统
  Node 的强项:
  • 有效地分配小块信息
  • 处理潜在的网络速度慢的连接
  • 容易扩展为多个处理器或服务器

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

情景:内容管理系统、博客
  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个核心技巧》,点此链接可在博文视点官网查看。

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


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [node] 推荐:

什么是Node?

- We_Get - 博客园新闻频道
译者按:前不久Oreilly出了一本小册子“What is Node?”,扼要的讲解了Node的身世和所适用的场景,作者文笔轻松流畅、内容充实,是非常难得的学习资料.   译文全文:http://jayli.github.com/whatisnode/index.html.   作者:Brett McLaughlin ,原文:What is Node?.

Node入门

- - CSDN博客编程语言推荐文章
作者:  Manuel Kiessling. 翻译:  goddyzhao &  GrayZhang &  MondayChen. 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识. 本书绝不是一本“Hello World”的教程. 你正在阅读的已经是本书的最终版.

浅析Hadoop Secondary NameNode,CheckPoint Node,Backup Node

- - CSDN博客云计算推荐文章
Hadoop SecondaryNameNode并不是Hadoop 第二个NameNode,它不提供NameNode服务,而仅仅是NameNode的一个工具. 这个工具帮助NameNode管理Metadata数据. NameNode的HDFS文件信息(即Metadata)记录在内存中,client的文件写操作直接修改内存中的Metadata,同时也会记录到硬盘的Edits文件,这是一个Log文件.

[译]什么是Node?

- blacktulip - Taobao UED Team
译者按:前不久Oreilly出了一本小册子“What is Node?”,扼要的讲解了Node的身世和所适用的场景,作者文笔轻松流畅、内容充实,是非常难得的学习资料. 译文全文:http://jayli.github.com/whatisnode/index.html. 作者:Brett McLaughlin ,原文:What is Node?.

用node作桌面开发

- InterMa - CNode社区
node的定位是,server-side javascript. 但程序员最爱做的事,就是把一个东西用在不该用的地方. 那么,可以把node用在桌面开发上吗. 把Javascript用在桌面开发上,早有先例,比如GTK+的gjs,还有Qt的QML(顺带一提,QML代表着桌面开发的另一个方向,a promising way),GNOME3中,也用javascript作为桌面插件的开发语言.

node js 断点调试

- - Web前端 - ITeye博客
大部分基于 Node.js 的应用都是运行在浏览器中的,. 例如强大的调试工具 node-inspector. node-inspector 是一个完全基于 Node.js 的开源在线调试工具,提供了强大的调试功能和友好. 的用户界面,它的使用方法十分简便. 首先,使用 npm install -g node-inspector 命令安装 node-inspector,然后在终.

Vercel 部署 Node 服务

- - 掘金 前端
之前在写 面试常客:HTTP 缓存时,曾经就强缓存和协商缓存写过两个demo,但缓存要在服务端做,只能贴上代码,不能在网页上感受(虽然我贴了gif). 笔者的所有 demo 例子都放在 github page 上,其特点是不需要服务器即可部署静态资源,但它不具备部署服务端应用能力. 最近笔者在了解 CI/CD 方面的知识点,想起了 Vercel,就想着能否将服务端应用架在 vercel 上呢.

無痛安裝 NodeJS 和 Node Framework Express

- Hming - 小惡魔 - 電腦技術 - 工作筆記 - AppleBOY
直接到官網下載 Stable 的版本吧,目前是 node-v0.4.10.tar.gz,也可以先看看 API Document. 安裝 Ububtu 相關套件. 下面會使用最原始的編譯方式,所以必須安裝 g++ 套件,否則下 ./configure 的時候,會吐出來沒有安裝過的套件. 兩種方法:1.用 apt-get install nodejs 2.

nodejs上HTML分析利器node-jquery

- - 博客园_首页
      首先描述产生这篇随笔的场景:我需要获取项目在jenkins构建的最新Javascript Coverage显示在供管理层次查看的项目情况Report上,但是由于jenkins没有直接的API取得数据所需数据,所以我们只能从自建的容器发布Javascript Coverage数据API,供Report项目使用.