简单介绍一下Node.js

356 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

Node.js 简介

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm, 是全球最大的开源库生态系统

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

Node.js 的特点

  • 异步的 I/O
  • 事件机制
  • 单线程
  • 跨平台

image.png

Node.js 的运行机制

  • V8 引擎解析 javaScript 脚本,解析后的代码,调用 NodeAPI
  • libuv 库负责 API 的执行。它将不同的任务分配给不同的线程,形成一个 Event Loop(事件循环),以异步的方式将任务的执行结果返回给 V8 引擎
  • V8 引擎再将结果返回给用户

Node.js 事件循环机制

node 的 Event Loop 发生在 libuv 层,libuv 是一个基于事件驱动的跨平台抽象层,封装了不同操作系统一些底层特性,对外提供统一的 API

1. timers

执行 setTimeout()setInterval()中的 callback

2. pending callback

执行上一次推迟到这一次循环迭代的 I/O 回调

3. idle, prepare

只在内部使用

4. poll

检索新的I/O事件; 执行与I/O相关的回调(几乎所有的回调,由setTimeout()setInterval()setImmediate()除外),Node将在适当的时候阻塞这里。

主要做了两件事:

  1. 计算应该阻塞多长时间并轮询I/O (1. Calculating how long it should block and poll for I/O, then)
  2. 处理 轮询 队列里的事件。(Processing events in the poll queue)

5. check

执行 setImmediate()callback

6. close callback

执行close事件的callback。e.g:socket.on('close', ...).

image.png

setImmediate() 对比 setTimeout()

  • setImmediate() 一旦在当前 轮询 阶段完成, 就执行脚本。
  • setTimeout() 在最小阈值(ms 单位)过后运行脚本。

如果你把这两个函数放入一个 I/O 循环内调用,setImmediate 总是被优先调用

fs.readFile(__filename, () => {
  setTimeout(() => {
    console.log('timeout');
  }, 0);
  setImmediate(() => {
    console.log('immediate');
  });
})

immediate
timeout

process.nextTick()

任何时候在给定的阶段中调用 process.nextTick(),所有传递到 process.nextTick() 的回调将在事件循环继续之前解析。

作用:

  1. 允许用户处理错误,清理任何不需要的资源,或者在事件循环继续之前重试请求。
  2. 有时有让回调在栈展开后,但在事件循环继续之前运行的必要。

结语

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。

文章如有错误之处,希望在评论区指正🙏🙏。

附: