Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)(上):https://developer.aliyun.com/article/1420284
Node.js process.nextTick()
当将一个函数传给 process.nextTick(callFn) 时,则指示引擎在当前操作结束(在下一个事件循环开始之前)时调用此函数:传递给 process.nextTick(callFn) 的函数会在 当前 的这次事件循环末尾被立即执行。
const bar = () => console.log('bar') const baz = () => console.log('baz') const foo = () => { console.log('foo') new Promise((resolve, reject) => resolve('应该在 bar之后') ).then(resolve => console.log(resolve)) process.nextTick(bar) baz() } foo() //foo //baz //bar //应该在 bar之后
Node.js 全局对象
在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global ,所有全局变量(除了 global 本身以外)都是global 对象的属性。
全局变量可以直接进行使用,不需要引入。
1、__filename:表示当前正在执行的脚本的文件名,输出文件所在位置的绝对路径
2、__dirname:表示当前执行脚本所在的目录
3、setTimeout(cb, ms)
4、clearTimeout(t)
5、setInterval(cb, ms)
6、console
7、process:用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口
7.1、process.exit()—退出当前的node进程
7.2、process.env—获取所有环境变量
7.3、process.on('uncaughtException',callFn)—捕获未捕获的异常
Node.js 模块规范
Node.js模块规范遵循CommonJs模块规范。
1、require —导入要使用的模块
2、module.exports—导出要供其它模块使用的功能
3、exports—导出要供其它模块使用的功能
注意: 不可以直接对exports赋值
Node.js 事件
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件。
所有这些产生事件的对象都是 events.EventEmitter 的实例,实例化生成的对象叫做事件触发器。
实例化:
// 引入 events 事件模块 var events = require('events'); // 创建 eventEmitter 对象 var eventEmitter = new events.EventEmitter();
1、添加事件监听器: eventEmitter.on(event, listener)
eventEmitter.on('some_event', function(e) { console.log('some_event 事件触发'); console.log(e); });
2、触发事件: eventEmitter.on(event,[arg1],[arg2],..)
eventEmitter.emit('some_event','params')
3、移除事件监听器: eventEmitter.removeAllListeners([event])
eventEmitter.removeAllListeners([event])
Node.js Buffer(缓冲区)
Buffer 是内存区域,一个专门存放二进制数据的缓冲区。
1、创建buffer
将数据写入缓冲区: Buffer.from(string[, encoding])
const buf = Buffer.from('tong');
2、从缓冲区读取数据: Buffer.toString([encoding[, start[, end]]])
console.log(buf.toString()) console.log(buf.toString('utf-8',0,2))
3、合并Buffer
const buf1 = Buffer.from('小童'); const buf2 = Buffer.from('程序员'); const buf3=Buffer.concat([buf1,buf2]) console.log(buf3.toString()) //console.log(buf1+buf2)
Node.js Stream(流)(一)
流是为 Node.js 应用程序提供动力的基本概念之一。
流是一种以高效的方式处理读/写文件、网络通信、或任何类型的端到端的信息交换。
stream 提供了构建所有流 API 的基础。 所有的流都是 EventEmitter 的实例。
举例:
var fs = require("fs"); fs.readFile(__dirname + '/input.txt', (err, data) => { console.log(data.toString()) })
//可读流可以从一文件中读取信息。 //读取的数据可以暂时存放在缓存(Buffer)里,防止应用程序无法及时处理。 //创建可读流 var readerStream = fs.createReadStream('input.txt'); // 处理流事件 readerStream.on('data', function(chunk) { data += chunk; });
流基本上提供了两个主要优点:
1、内存效率: 无需加载大量的数据到内存中即可进行处理。
2、时间效率: 当获得数据之后即可立即开始处理数据,这样所需的时间更少,而不必等到整个数据有效负载可用才开始。
创建可读流
const Stream = require('stream') //首先创建流对象 const readableStream = new Stream.Readable() //实现 readable._read() 方法 readableStream._read=()=>{} //监听可读流里面是否有可读的数据 readableStream.on('data',(chunk)=>{ console.log(chunk.toString()) }) //发送数据 readableStream.push('小童') readableStream.push('程序员')
Node.js Stream(流)(二)
Stream 有四种流类型:
1、Readable - 可读操作。
2、Writable - 可写操作。
3、Duplex - 可读可写操作。
4、Transform - 操作被写入数据,然后读出结果。
流常用的事件有:
1、data - 当有数据可读时触发。
2、end - 没有更多的数据可读时触发。
3、error - 在接收和写入过程中发生错误时触发。
4、finish - 所有数据已被写入到底层系统时触发。
创建可写流:
//创建可写流对象 const Stream = require('stream') const writableStream = new Stream.Writable() //实现_write writableStream._write = (chunk, encoding, next) => { console.log(chunk.toString()) next() } //写入数据 writableStream.write('hellow') writableStream.write('world')
写入文件:
//可写流可以将数据写入文件中。 //为了防止因为写入目标处理速度太慢导致数据丢失,写入的数据可以暂存在可写流 //内部的缓存(Buffer)中。 //创建文件可写流对象 const fs=require('fs') const writableStream =fs.createWriteStream('output.txt'); // 使用 utf8 编码写入数据 writableStream.write('hello','UTF8'); writableStream.write('xiaotong','UTF8'); // 标记文件末尾 writableStream.end(); // 监听写入文件完成 writableStream.on('finish', function() { console.log("写入完成。"); })