Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)

简介: Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)



Node.js 简介

Node.js 是一个开源和跨平台的JavaScript运行时环境。

Node.js 在浏览器之外运行V8 JavaScript引擎(Google Chrome的内核)。

Node.js 可以构建web服务器。

Node.js 是单线程非阻塞的,这允许Node.js使用单个服务器就可以处理数千个并发连接。

Node.js 可以使用新的ECMAScript标准。

Node.js 安装

1、打开nodejs官网:https://nodejs.org/en/

2、下载安装包,安装

3、验证

node -v //查看nodejs版本
npm -v //查看npm版本

Node.js 历史版本下载地址:https://nodejs.org/dist/

运行 Node.js 脚本

1、Node.js REPL

Node.js REPL ,类似 Window 系统的终端,我们可以在终端中输入命令,并接收系统的响应,提供交互式的nodejs编程环境。

       1.1、输入以下命令来启动 Node 的终端:

       1.2、接下来就可以在 > 后面输入一些表达式或者语句,然后按下回车,就会执行代码并给出反馈。

         1.3、退出REPL

          按下两次 ctrl + c 键或者 ctrl + d 就能退出 REPL。

使用REPL可以简单的去调试 Javascript 代码

       1.4、运行脚本文件

node 脚本文件

Node.js 事件循环

Node.js 的事件循环阐明了 Node.js 如何做到异步且具有非阻塞的 I/O。

       1、调用堆栈

       调用堆栈是一个 LIFO 队列(后进先出)。

       事件循环不断地检查调用堆栈,以查看是否需要运行任何函数。

const bar = () => console.log('bar')
const baz = () => console.log('baz')
const foo = () => {
 console.log('foo')
 bar()
 baz()
}
foo()
//foo
//bar
//baz

const bar = () => console.log('bar')
const baz = () => console.log('baz')
const foo = () => {
        console.log('foo')
        setTimeout(bar, 0)
        baz()
}
foo()
//foo
//baz
//bar

消息队列

当调用 setTimeout() 时, Node.js 会启动定时器。 当定时器到期时,则回调函数会被放入 消息队列 中。包括其它的一些异步的操作,网络请求或者一些事件的订阅,得到响应后它们的回调函数也会被放入 消息队列

事件循环会赋予调用堆栈优先级,它首先处理在调用堆栈中找到的所有东西,一旦其中没有任何东西,便开始处理消息队列中的东西。

Node.js 事件循环_ES6 作业队列

ECMAScript 2015 引入了 作业队列 的概念, Promise 使用了该队列。 这种方式会尽快地执行异步函数的结果,而不是放在调用堆栈的末尾。

作业队列的优先级高于消息队列。

const bar = () => console.log('bar')
const baz = () => console.log('baz')
const foo = () => {
 console.log('foo')
 setTimeout(bar, 0)
 new Promise((resolve, reject) =>
  resolve('应该在 baz 之后、bar 之前')
).then(resolve => console.log(resolve))
 baz()
}
foo()
//foo
//baz
//应该在 baz 之后、bar 之前
//bar

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("写入完成。");
})
目录
相关文章
|
1月前
|
存储 JSON JavaScript
Node.js Buffer(缓冲区)
10月更文挑战第4天
25 4
|
4月前
|
前端开发 jenkins 持续交付
不是Jenkins玩不起,而是脚本更有性价比,在1Panel中使用Node搭建前端自动化
不是Jenkins玩不起,而是脚本更有性价比,在1Panel中使用Node搭建前端自动化
167 2
|
4月前
|
JavaScript 前端开发
node.js 导入导出模块(CommonJS模块化规范,ES6模块化规范)
node.js 导入导出模块(CommonJS模块化规范,ES6模块化规范)
51 1
|
5月前
|
存储 JSON JavaScript
Node.js Buffer(缓冲区)
Node.js Buffer(缓冲区)
37 1
|
6月前
|
JavaScript 网络协议 数据处理
Node.js中的Buffer与Stream:深入解析与使用
【4月更文挑战第30天】本文深入解析了Node.js中的Buffer和Stream。Buffer是处理原始数据的全局对象,适用于TCP流和文件I/O,其大小在V8堆外分配。创建Buffer可通过`alloc`和`from`方法,它提供了读写、切片和转换等操作。Stream是处理流式数据的抽象接口,分为可读、可写、双工和转换四种类型,常用于处理大量数据而无需一次性加载到内存。通过监听事件和调用方法,如读取文件的可读流示例,可以实现高效的数据处理。理解和掌握Buffer及Stream能提升Node.js应用的性能。
|
JavaScript 网络协议 存储
Node.js之Stream双工流
Node.js之Stream双工流
1792 0
|
JavaScript 网络协议 存储
|
2月前
|
JavaScript
NodeJs的安装
文章介绍了Node.js的安装步骤和如何创建第一个Node.js应用。包括从官网下载安装包、安装过程、验证安装是否成功,以及使用Node.js监听端口构建简单服务器的示例代码。
NodeJs的安装
|
1月前
|
JavaScript 开发工具 git
已安装nodejs但是安装hexo报错
已安装nodejs但是安装hexo报错
25 2
|
2月前
|
存储 JavaScript 前端开发
Node 版本控制工具 NVM 的安装和使用(Windows)
本文介绍了NVM(Node Version Manager)的Windows版本——NVM for Windows的安装和使用方法,包括如何安装Node.js的特定版本、列出已安装版本、切换使用不同版本的Node.js,以及其他常用命令,以实现在Windows系统上对Node.js版本的便捷管理。
Node 版本控制工具 NVM 的安装和使用(Windows)