nodejs执行javaScript原理超详细讲解

 更新时间:2025年11月26日 09:55:15   作者: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 步:初始化环境

  • Node.js 启动,初始化 V8 引擎、LibUV 等组件。

  • 创建事件循环

  • 设置全局对象(如 globalprocess)、模块加载系统等。

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

  • Node.js 读取你的 app.js 文件。

  • V8 引擎开始处理这段代码。这个过程包括:

    • 解析:将 JS 代码转换成抽象语法树(AST)。

    • 编译:V8 的即时编译(JIT)引擎会将 AST 编译成高效的机器码。

    • 执行:CPU 执行生成的机器码。

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

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

  • 同步任务:会立即在主线程上按顺序执行,这与在浏览器中一样。

  • 异步任务(如 fs.readFilesetTimeouthttp.request):

    1. 当遇到异步操作时,Node.js 会立即返回,继续执行后面的同步代码,不会“阻塞”在这里。

    2. 同时,它会将这个异步操作及其回调函数 交给 LibUV 去处理。

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

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

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

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

  • 定时器setTimeout 和 setInterval 的回调。

  • I/O 操作 & 轮询:文件读写、网络请求等。这是最繁忙的阶段。

  • 检查阶段setImmediate 的回调。

  • 微任务Promise.then()process.nextTick()注意:微任务在每个阶段之间都会优先清空,这意味着 process.nextTick 和 Promise 的回调总是比上面提到的其他异步回调执行得更早。

第 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原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Make构建Node.js网站项目

    使用Make构建Node.js网站项目

    这篇文章介绍了使用Make构建Node.js网站项目的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • NodeJS 中Stream 的基本使用

    NodeJS 中Stream 的基本使用

    在 NodeJS 中,我们对文件的操作需要依赖核心模块 fs , fs 中有很基本 API 可以帮助我们读写占用内存较小的文件,这篇文章主要介绍了NodeJS 中Stream 的基本使用,需要的朋友可以参考下
    2018-07-07
  • Node Js开发环境的搭建全过程记录

    Node Js开发环境的搭建全过程记录

    这篇文章详细介绍了脚手架工具在软件开发中的作用,包括常见的脚手架工具、脚手架的基本能力、搭建脚手架的方法、commander命令参数处理工具的使用、模块化拆分、下载远程仓库代码等,需要的朋友可以参考下
    2024-11-11
  • 在 Node.js 中使用 async 函数的方法

    在 Node.js 中使用 async 函数的方法

    利用 async 函数,你可以把基于 Promise 的异步代码写得就像同步代码一样。一旦你使用 async 关键字来定义了一个函数,那你就可以在这个函数内使用 await 关键字。下面通过本文给大家分享Node.js 中使用 async 函数的方法,一起看看吧
    2017-11-11
  • Nodejs学习笔记之Stream模块

    Nodejs学习笔记之Stream模块

    nodejs的fs模块并没有提供一个copy的方法,但我们可以很容易的实现一个,这种方式是把文件内容全部读入内存,然后再写入文件,对于小型的文本文件,这没有多大问题,比如grunt-file-copy就是这样实现的。
    2015-01-01
  • nodejs中实现阻塞实例

    nodejs中实现阻塞实例

    这篇文章主要介绍了nodejs中实现阻塞实例,本文直接给出实例代码,需要的朋友可以参考下
    2015-03-03
  • 使用Node.js和PostgreSQL构建数据库应用

    使用Node.js和PostgreSQL构建数据库应用

    PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动应用,本文就来介绍一下使用Node.js中的`pg`库与PostgreSQL数据库进行交互,感兴趣的可以了解一下
    2025-09-09
  • Node.js基于cors解决接口跨域的问题(推荐)

    Node.js基于cors解决接口跨域的问题(推荐)

    这篇文章主要介绍了Node.js基于cors解决接口跨域的问题,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • nodejs发布静态https服务器步骤指南

    nodejs发布静态https服务器步骤指南

    这篇文章主要为大家介绍了nodejs发布静态https服务器的步骤指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-02-02
  • vscode+nodejs+express搭建一个简单网站(附详细图文教程)

    vscode+nodejs+express搭建一个简单网站(附详细图文教程)

    作为前端开发,Nodejs已经成了很多公司对我们这一岗位的硬性要求,而Express框架则是其中知名度最高、也是最受欢迎的Nodejs开发框架,这篇文章主要介绍了vscode+nodejs+express搭建一个简单网站的相关资料,需要的朋友可以参考下
    2026-01-01

最新评论