node.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > node.js > nodejs执行JS原理

nodejs执行javaScript原理超详细讲解

作者:zhousenshan

Node.js是目前非常流行的JavaScript运行环境,其背后有着强大的libuv库支撑其非阻塞I/O操作,这篇文章主要介绍了nodejs执行javaScript原理的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

Node.js 执行 JavaScript 的过程可以分解为一个高效、事件驱动的运行模型。它与浏览器中的 JavaScript 引擎有相似的核心,但有不同的全局环境和能力。

简单来说,Node.js 使用 V8 引擎 来执行 JavaScript 代码,并通过 事件循环(Event Loop) 来处理异步操作。

下面我们来详细拆解这个过程。

核心架构:不只是 V8

Node.js 的运行时环境主要由以下几个部分组成:

  1. V8 引擎:来自 Google,负责编译和执行 JavaScript 代码。它将 JS 代码转换成更快的机器码,而不是一行行地解释执行。

  2. LibUV:一个用 C 编写的库,它提供了 事件循环(Event Loop)线程池 和异步 I/O 操作(如文件系统、网络操作)的能力。这是 Node.js 实现非阻塞 I/O 的关键。

  3. 其他底层库:如 http-parserc-aresOpenSSL 等,分别用于处理 HTTP、DNS 和加密等。

执行流程详解

当你运行 node app.js 时,会发生以下步骤:

第 1 步:初始化环境

第 2 步:加载并执行你的代码

第 3 步:处理同步与异步操作(关键阶段)

这是 Node.js 并发模型的核心。

第 4 步:LibUV 与事件循环的工作

LibUV 通过事件循环来协调这些异步操作。事件循环是一个无限循环,它不断地检查是否有待处理的事件。其简化模型如下:

   ┌───────────────────────────┐
┌─>│          定时器            │ (执行到点的 setTimeout、setInterval 回调)
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │     pending callbacks     │ (执行大部分系统操作的回调,如 TCP 错误)
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │       idle, prepare       │ (内部使用)
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │          轮询 poll         │ ◄─── 最重要的阶段
│  └─────────────┬─────────────┘      - 检索新的 I/O 事件
│  ┌─────────────┴─────────────┐      - 执行与 I/O 相关的回调
│  │          检查 check        │ (执行 setImmediate 的回调)
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
└──┤     关闭事件回调 close     │ (执行关闭事件的回调,如 socket.on('close', ...))
   └───────────────────────────┘

不同类型的异步任务被放入不同的队列:

第 5 步:执行回调

当异步操作完成时(例如,文件读取完毕或定时器超时),LibUV 会将对应的回调函数放入相应的队列中。事件循环在到达对应阶段时,会从队列中取出回调函数,送到 V8 引擎中去执行。

一个简单的例子

// 同步代码
console.log('Script start'); // 1. 立即执行

// 异步代码 - 定时器
setTimeout(() => {
  console.log('setTimeout'); // 4. 在定时器阶段执行
}, 0);

// 异步代码 - Promise (微任务)
Promise.resolve().then(() => {
  console.log('Promise'); // 3. 在同步代码执行后,事件循环下一个阶段前执行
});

// 同步代码
console.log('Script end'); // 2. 立即执行

输出顺序为:

Script start
Script end
Promise
setTimeout

总结:Node.js 如何执行 JS

  1. 核心引擎:使用 V8 来编译和执 JavaScript 代码。

  2. 非阻塞 I/O:通过 LibUV 来处理所有异步操作,使其不阻塞主线程。

  3. 事件驱动事件循环 是中枢,它不断地轮询,检查已完成的事件,然后安排对应的回调函数执行。

  4. 单线程但高效你的 JavaScript 代码(回调)是在单个主线程上运行的,但所有的 I/O 操作都是通过 LibUV 在底层多线程或系统内核的帮助下异步完成的。这使得 Node.js 可以用一个线程处理成千上万的并发连接。

这种模型非常适合 I/O 密集型的应用(如 Web 服务器、数据库工具),因为大部分时间都在等待 I/O,而不是进行大量计算。

到此这篇关于nodejs执行javaScript原理的文章就介绍到这了,更多相关nodejs执行JS原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文