引言: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 的所有
相关推荐
在本文中,我们探讨了 Nodered 与 MySQL 的使用方法,包括使用 Docker 安装 MySQL、使用 Navicat 监控 MySQL 和使用 Nodered 集成 MySQL 服务。这些技术可以帮助我们更好地处理和分析数据,提高生产效率和数据分析...
例如,你可以通过HTTP请求接收订单数据,然后使用"node-escpos"将订单信息转化为打印机可识别的格式并发送到打印机。 在开发过程中,"node-escpos"的API文档是必不可少的参考资料。它详细介绍了如何初始化打印机...
在选择使用Node.js v14还是v16时,开发者需要考虑项目需求和兼容性。如果你正在启动一个新项目,推荐使用v16,因为它包含最新的特性并享有长期支持。而对于已有的v14项目,如果没有紧迫的需求,可以继续使用v14,...
`node-inspector`是一个强大的工具,它允许我们使用Web Inspector(Chrome或Safari浏览器的开发者工具)来调试Node.js应用。这篇博文将详细介绍如何利用`node-inspector`进行高效的Node.js调试。 首先,我们需要...
在"node-node-modules下"的描述中,我们可以理解为这是一个关于Node.js项目依赖管理的知识点。 在Node.js中,开发者可以使用`npm`(Node Package Manager)来管理这些依赖。`npm`是全球最大的开源库生态系统,它...
1.下载node安装包v10.15.0 链接:https://pan.baidu.com/s/1Lgpx0rPRqCBkxeH6IkVnTQ 提取码:5i9j 2.解压文件 本地创建/usr/local/node/ 复制 node-v10.15.0-linux-x64.tar.xz到当前目录下 解压文件:tar -xvf ...
为了安装 Node.js 各版本,我们可以使用 NVM(Node Version Manager),下面我们将详细介绍如何使用 NVM 安装 Node.js 各版本(以 v9.6.1 为例)。 首先,我们需要安装 NVM,使用以下命令: ``` [root@bogon ~]# ...
nodered加载外部js的使用
1. **获取插件**:你可以使用npm(Node.js包管理器)在命令行中运行`npm install node-red-node-mysql`来下载并安装此插件。 2. **重启Node-RED**:安装完成后,你需要重启Node-RED服务以使新安装的插件生效。 3. **...
标题 "Node.js-一个使用node将word转成html的小工具" 涉及到的知识点主要是使用 Node.js 和 Koa 框架处理文件上传和转换。在这个项目中,开发者创建了一个简单的Web应用,允许用户上传Microsoft Word文档,并将其...
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者在服务器端使用 JavaScript 进行编程。然而,为了扩展 Node.js 的功能,开发者有时需要编写使用 C++ 编写的原生模块,这些模块可以利用底层...
《Node应用程序构建:使用MongoDB和Backbone》是一本深入探讨使用Node.js、MongoDB以及Backbone.js构建高效网络应用的书籍。源码提供给读者更直观的学习体验,通过实际操作加深理论理解。以下是该书涉及的主要知识点...
在本文中,我们将深入探讨excel4node的特性、使用方法以及它如何简化Excel文件的生成过程。 ### excel4node概述 excel4node允许开发者使用JavaScript语法来创建和修改Microsoft Excel的.xlsx文件,这些文件基于...
Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 Node.js 内部使用 Google V8 JavaScript 引擎来执行代码;大部分基本模块都是用...
通过快速解压和安装,可以立即开始使用Node.js进行各种开发工作,比如搭建Web服务器、编写CLI工具、处理文件系统操作、实现WebSocket通信等。同时,借助npm,可以轻松管理和分享项目依赖,进一步提高开发效率。
Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 Node.js 内部使用 Google V8 JavaScript 引擎来执行代码;大部分基本模块都是用...
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程,极大地推动了前后端一体化的开发模式。Node.js 使用了一个事件驱动、非阻塞I/O模型,使其轻量又高效...
通过理解这些知识点,你就能有效地在项目中使用Node-Sass 4.12、4.14.1、5版本以及Sass-Loader,享受到它们带来的便利和效率提升。在实际操作中,根据项目的具体需求选择合适的版本,并遵循最佳实践进行配置和使用。
Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 Node.js 内部使用 Google V8 JavaScript 引擎来执行代码;大部分基本模块都是用...
在使用Node-Red-Node-Serialport时,首先需要安装这个插件。通常,这可以通过Node-Red管理界面中的“ pallet manager ”完成,或者使用npm命令行工具在全局或项目本地环境中安装。安装完成后,用户可以在Node-Red...