当前位置: 首页 > news >正文

Node.js:Stream、模块系统

Stream流

Stream是一个抽象接口,Node中有很多的对象实现了这个接口。例如,对这个http服务器发起请求的一个request对象就是一个Stream,还有stdout(标准输出)

  • Readable 可读操作
  • Writable 可写操作
  • Durplex 可读可写操作
  • Transform 操作被写入数据,然后读出结果
    所有的Stream对象都是EventEmitter的实例
  • data 当有数据可读时触发
  • end 没有更多的数据可读时触发
  • error 在接收和写入过程中发生错误时触发
  • finish 所有数据已被写入到底层系统时触发

从流中读取数据

创建input.txt文件,内容如下:

var fs = require('fs');
var data = '';
//创建可读流
var readerStream = fs.createReadStream('input.txt');
//设置编码为utf-8
readerStream.setEncoding('UTF8');
//处理流事件-->data,end,and error
readerStream.on('data',function(chunk){data += chunk;
});
readerStream.on('end', function(){console.log(data);
});
readerStream.on('error', function(err){console.log(err.stack);
});
console.log("程序执行完毕!");

写入流

var fs = require('fs');
var data = 'DooooooooG';
//创建可读流
var writeStream = fs.createWriteStream('input.txt');
//设置编码为utf-8
writeStream.write(data,'UTF8');
//标记文件末尾
writeStream.end();
//处理时间-->finish、error
writeStream.on('finish', function(){console.log("写入完成");
});
writeStream.on('error', function(err){console.log(err.stack);
})
console.log("程序执行完毕!");

管道流

管道提供了一个输出流到输入流的机制,通常我们用于从一个流中获取数据并且将数据传递到另一个流当中
下面的实例中,将一个文件的内容通过管道写入到另一个文件

var fs = require("fs");
var inputStream = fs.createReadStream("input.txt");
var outputStream = fs.createWriteStream("output.txt");
inputStream.pipe(outputStream);
console.log("程序执行完毕!");

链式流

链式流是通过链接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作
接下来我们用管道和链式流来压缩和解压文件

  • 压缩文件
var fs = require("fs");
var zlib = require("zlib");
fs.createReadStream("input.txt").pipe(zlib.createGzip()).pipe(fs.createWriteStream('input.txt.gz'));
console.log("文件压缩完成!");
  • 解压文件
var fs = require("fs");
var zlib = require('zlib');
// 解压 input.txt.gz 文件为 input.txt
fs.createReadStream('input.txt.gz').pipe(zlib.createGunzip()).pipe(fs.createWriteStream('input.txt'));console.log("文件解压完成。");

Node.js模块系统

为了让Node.js的文件可以相互调用,Node.js提供了简单的模块系统
模块Node.js应用程序的基本组成部分,文件和模块是一一对应的,一个node.js文件就是一个和模块,这个文件可能是js代码,可能是JSON或者编译过的C/C++拓展


引入模块

在Node.js中引入一个模块非常简单,直接创建文件然后引入代码即可

var hello = require('./hello');
hello.world();

默认node.js引入文件的后缀是.js文件,我们在hello.js中这样定义一个外部函数

//hello.js
export.world = function(){console.log("Hello world!");
}

引入对象模块

可以把一个类的定义写在外部的模块中,就像这样

//dog.js
function Dog(){var uname = "Default";var age = 0;this.show=function(){console.log(this.uname + " " + this.age);};this.Sayhello = function(){console.log("Hello World!");};
};
module.exports = Dog;//demo.js
var Dog = require('./dog');
var coco = new Dog("Coco", 2);
coco.uname = "Coco";
coco.age = 2;
coco.show();
coco.Sayhello();

Coco 2
Hello World!


服务端的模放在哪里

Node.js 中自带了一个叫做 http 的模块,在我们的代码中请求它并把返回值赋给一个本地变量。
这把我们的本地变量变成了一个拥有所有 http 模块所提供的公共方法的对象。
Node.js 的 require 方法中的文件查找策略如下:
由于 Node.js 中存在 4 类模块(原生模块和3种文件模块),尽管 require 方法极其简单,但是内部的加载却是十分复杂的,其加载优先级也各自不同。
请添加图片描述

从文件模块缓存中加载

尽管原生模块与文件模块模块的优先级不同,但是都会优先从文件模块中加载已经存在的模块

从原生模块加载

原生模块的优先级仅次于文件模块缓存的优先级。require 方法在解析文件名之后,优先检查模块是否在原生模块列表中。

以http模块为例,尽管在目录下存在一个http/http.js/http.node/http.json 文件,require(“http”) 都不会从这些文件中加载,而是从原生模块中加载。

原生模块也有一个缓存区,同样也是优先从缓存区加载。如果缓存区没有被加载过,则调用原生模块的加载方式进行加载和执行。

从文件中加载

当文件模块的缓存不存在而且不是原生模块的时候,node.js会解析require方法传入的参数,并且从文件中加载实际的文件。

http://www.lryc.cn/news/593223.html

相关文章:

  • 鸿蒙与web混合开发双向通信
  • Linux:多线程---深入生产消费模型环形队列生产消费模型
  • Nestjs框架: RxJS 核心方法实践与错误处理详解
  • 告别项目混乱:基于 pnpm + Turborepo 的现代化 Monorepo 工程化最佳实践
  • win10连接鼠标自动关闭触摸板/win10关闭触摸板(笔记本)
  • 深度学习图像分类数据集—六十种植物病害分类
  • ABP VNext + Temporal:分布式工作流与 Saga
  • install_arm_docker.sh
  • Django接口自动化平台实现(三)
  • Django母婴商城项目实践(八)- 数据渲染与显示之首页
  • LLM 的Top-P参数 是在LLM中的每一层发挥作用,还是最后一层?
  • 【设计模式C#】外观模式(用于解决客户端对系统的许多类进行频繁沟通)
  • Django母婴商城项目实践(七)- 首页数据业务视图
  • 洛谷 P2947:[USACO09MAR] Look Up S ← 数组模拟+单调栈
  • 使用 Gunicorn 部署 Django 项目
  • 5 基于STM32单片机的绝缘检测系统设计(STM32代码编写+手机APP设计+PCB设计+Proteus仿真)
  • 6 STM32单片机的智能家居安防系统设计(STM32代码+手机APP设计+PCB设计+Proteus仿真)
  • 对话访谈 | 盘古信息×锐明科技:中国企业高质量出海“走进去”和“走上去”
  • 家庭KTV v1.1.9 | 曲库丰富,无限制免费K歌
  • 驾驭 Spring Boot 事件机制:8 个内置事件 + 自定义扩展实战
  • 《一行注解解决重复提交:Spring Boot 接口幂等实战》
  • 深入理解设计模式:策略模式的艺术与实践
  • 在非Spring Boot的Spring项目中使用Lock4j
  • 用graphviz画一个关系图
  • 云服务器磁盘IO性能优化的测试与配置方法
  • 2025年7月19日,二维矩阵
  • 智能制造——解读39页汽车行业数字化工厂解决方案【附全文阅读】
  • 异世界历险之数据结构世界(二叉树-leetcode)
  • 国产电科金仓数据库:融合进化,智领未来
  • 【Unity3D实例-功能-移动】角色移动-通过WSAD(Rigidbody方式)