我们为什么使用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 套接字向各类玩家发送游戏状态,也可以在后台任务中维护游戏数据,将数据发送给玩家。
什么时候使用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个核心技巧》,点此链接可在博文视点官网查看。
想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
我们为什么使用Node的更多相关文章
- babeljs源码
babel.min.js!function(e,t){"object"==typeof exports&&"object"==typeof mo ...
- NPM (node package manager) 入门 - 基础使用
什么是npm ? npm 是 nodejs 的包管理和分发工具.它可以让 javascript 开发者能够更加轻松的共享代码和共用代码片段,并且通过 npm 管理你分享的代码也很方便快捷和简单. 截至 ...
- node服务的监控预警系统架构
需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作.不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性.高可靠性.鲁棒性以及直观的监控和报警 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 细说WebSocket - Node篇
在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...
- 高大上的微服务可以很简单,使用node写微服务
安装 npm install m-service --save 使用 编写服务处理函数 // dir1/file1.js // 使用传入的console参数输出可以自动在日志里带上request id ...
- 构建通用的 React 和 Node 应用
这是一篇非常优秀的 React 教程,这篇文章对 React 组件.React Router 以及 Node 做了很好的梳理.我是 9 月份读的该文章,当时跟着教程做了一遍,收获很大.但是由于时间原因 ...
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
- Node.js:进程、子进程与cluster多核处理模块
1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...
- Node.js:理解stream
Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...
随机推荐
- 奇异值分解(SVD)原理与在降维中的应用
奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域.是 ...
- .Net中的AOP系列之构建一个汽车租赁应用
返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...
- 浅谈我对DDD领域驱动设计的理解
从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...
- requests的content与text导致lxml的解析问题
title: requests的content与text导致lxml的解析问题 date: 2015-04-29 22:49:31 categories: 经验 tags: [Python,lxml, ...
- [APUE]系统数据文件与信息
一.口令文件 UNIX口令文件包含下表中的各个字段,这些字段包含在 由于历史原因,口令文件是/bin/passwd,而且是一个文本文件,每一行都包括了上表中的七个字段,字段之间用":&quo ...
- jQuery学习之路(4)- 动画
▓▓▓▓▓▓ 大致介绍 通过jQuery中基本的动画方法,能够轻松地为网页添加非常精彩的视觉效果,给用户一种全新的体验 ▓▓▓▓▓▓ jQuery中的动画 ▓▓▓▓▓▓ show()和hide()方法 ...
- C#多线程之线程池篇1
在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
- $ORACLE_HOME变量值末尾多“/”惹的祸
之前一直误以为$ORACLE_HOME变量的路径中末尾多写一个"/"不会有影响. 今天做实验时碰到一个情景,发现并不是这样. 环境:OEL 5.7 + Oracle 10.2.0. ...
- 缓存、队列(Memcached、redis、RabbitMQ)
本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...
- Android:Activity+Fragment及它们之间的数据交换.
Android:Activity+Fragment及它们之间的数据交换 关于Fragment与Fragment.Activity通信的四种方式 比较好一点的Activity+Fragment及它们之间 ...