Node.js实战10:“流”是Node.js最强大的功能之一。
流是Nodejs的高级应用,掌握流的使用,才能真正胜任NodeJS开发。
Nodejs中,流是基于事件的API,用于管理和处理数据,而且效率很好!
什么是流?
流是一个抽象接口,Node 中有很多对象实现了这个接口。
例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)等。
流的四种类型
dable - 可读操作。
Writable - 可写操作。
Duplex - 可读可写操作.
Transform - 操作被写入数据,然后读出结果。
流的事件
所有的流对象都是 EventEmitter 的实例,流常用的事件有:
data - 当有数据可读时触发。
end - 没有更多的数据可读时触发。
error - 在接收和写入过程中发生错误时触发。
finish - 所有数据已被写入到底层系统时触发。
什么时候使用流?
举例说明:
1、当使用fs.readFileSync同步读取一个文件的时候,所有的数据会被全部读到内存中,这个操作过程中程序会被阻塞。
2、如果使用fs.readFile,由于它是异步方法,那么阻塞不会发生,但数据仍会被全部读到内存中再处理。
当处理大文件压缩、媒体文件等的时候,无疑会很吃力。那么这时,就是使用流的时候了。
3、流会将分批次的读取适量的内容到缓存区进行操作,而不是一次性读取所有目标内容。
这样,程序对内存的使用量会极大减少、执行性能会提升很多:
举例说明,使用流的优势
先使用node内置的核心模块http实现一个简单的静态web服务器:
var http = require("http");
var fs = require("fs");
http.createServer(function(req,res){
fs.readFile(__dirname + "/test10.js",function(err,data){
if(err){
res.statusCode = 500;
res.end(String(err));
}else{
res.end(data);
}
})
}).listen(8000);
这段代码使用非阻塞的fs.readfile的方法。
当被访问时,读取文件内容(代码中读取的是本举程代码)并发送给访问者。
测试访问,效果:
可能说,功能并无问题。但如果被读取的文件test10.js文件非常大呢。就会有效率问题。
这时,可以改用流的方式:
注意图中标识出的内容,是修改的内容:使用流的方式读取,通过管道(pipe)传给res。
var http = require("http");
var fs = require("fs");
http.createServer(function(req,res){
fs.createReadStream(__dirname+"/test10.js").pipe(res);
}).listen(8000);
执行效果一样,但对内存的使用得到优化,性能得到提升。
同时,代码也更简洁。
流不仅高效优雅,扩展性也更强。比如对上面的代码稍做改动,就可以实现gzip压缩传输数据,可以使网页打开更快。
var http = require("http");
var fs = require("fs");
var zlib = require("zlib");
http.createServer(function(req,res){
res.writeHead(200,{"content-encoding":"gzip"});
fs.createReadStream(__dirname+"/test10.js").pipe( zlib.createGzip() ).pipe(res);
}).listen(8000);
从浏览器信息中可以看到,内容已启用gzip压缩。
Node.js实战10:“流”是Node.js最强大的功能之一。的更多相关文章
- Node.js实战(四)之调试Node.js
当项目逐渐扩大以后,功能越来越多,这时有的时候需要增加或者修改,同时优化某些功能,就有可能出问题了.针对于线上Linux环境我们应该如何调试项目呢? 别怕,Node.js已经为我们考虑到了. 通过 n ...
- [Node.js] Node.js中的流
原文地址:http://www.moye.me/2015/03/29/streaming_in_node/ 什么是流? 说到流,就涉及到一个*nix的概念:管道——在*nix中,流在Shell中被实现 ...
- 10个最佳Node.js企业应用案例:从Uber到LinkedIn
译者按: Node.js 8已经发布了,NPM模块每周下载量早已超过10亿,从Uber到LinkedIn都在使用Node.js,谁说JavaScript不能写后台? - 原文: 10 best Nod ...
- 《Node.js实战(双色)》作者之一——吴中骅访谈录
- Node.js v0.10.31API手冊-控制台
Node.js v0.10.31API手冊-文件夹 控制台 Object 用于向 stdout 和 stderr 打印字符.类似于大部分 Web 浏览器提供的 console 对象函数,在这里则是输出 ...
- Node.js v0.10.31API手冊-事件
Node.js v0.10.31API手冊-文件夹 Events(事件) Node里面的很多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStrea ...
- Node.js v0.10.31API手工-DNS
原版的API品种,这是从以前的翻译和翻译风格不同 Node.js v0.10.31API手冊-文件夹 DNS 使用 require('dns') 引入此模块. dns 模块中的全部方法都使用了 C-A ...
- iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备
安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...
- Node.js实战项目学习系列(1) 初识Node.js
前言 一直想好好学习node.js都是半途而废的状态,这次沉下心来,想好好的学习下node.js.打算写一个系列的文章大概10几篇文章,会一直以实际案例作为贯穿的学习. 什么是node Node.js ...
随机推荐
- PAT Basic 1032 挖掘机技术哪家强 (20 分)
为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 1 的正整数 N,即参赛人数.随后 N 行, ...
- python碎片化 - 集合set
集合set:无序,不重复的数据类型 list1={1,2,3,4,5} list2={6,5,4,7,8,9,} list3={1,2,3} s = set([3,5,9,10]) #交集 print ...
- 「版本升级」界面控件Kendo UI正式发布R2 2019|附下载
通过70多个可自定义的UI组件,Kendo UI可以创建数据丰富的桌面.平板和移动Web应用程序.通过响应式的布局.强大的数据绑定.跨浏览器兼容性和即时使用的主题,Kendo UI将开发时间加快了50 ...
- Maven Pom文件标签详解
<span style="padding:0px; margin:0px"><project xmlns="http://maven.apache.or ...
- 一、创建并打包Cordova的App工程
1.创建ionic4 & Angular项目 ionic start myApp tabs --type=angular 2.添加ios和android平台 ionic cordova pre ...
- MySQL/mariadb知识点总结
1.mysql/mariadb知识点总结:事务相关概念(事务总结-1) http://www.zsythink.net/archives/1204 2.mysql/mariadb知识点总结:事务控制语 ...
- react native 之 在现有的iOS工程中集成react native
在现有的iOS工程中集成react native, 或者说将react native引入到iOS 项目,是RN和iOS混合开发的必经之路 参考官网教程:https://reactnative.cn/d ...
- cookie、session和会话保持
1.会话 在程序中,会话跟踪是很重要的事情.理论上,一个已登录用户,在这次登录后进行的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆.例如,用户 A 在 ...
- eclipse配置Maven——菜鸟篇
首先解释关于webservice: Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序, 可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现 ...
- jdk7.x对Jenkins上的SonarQube Plugin的支持不足,替换方式
Jenkins.war放在Tomcat7下,完成各种配置,包括Jenkins中JDK,Maven,Git等. 最初的配置为Tomcat7, JDK7.x. 因为要在Jenkins上安装SonarQub ...