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

相关文章

  • node-sass安装失败解决方法总结(终有一款适合你)

    node-sass安装失败解决方法总结(终有一款适合你)

    node-sass是我们开发中很常见的依赖包,也是安装时间冗长和最常见到报错的依赖,下面这篇文章主要给大家介绍了关于node-sass安装失败解决方法的相关资料,需要的朋友可以参考下
    2022-11-11
  • 深入理解nodejs中Express的中间件

    深入理解nodejs中Express的中间件

    一个Express应用就是在调用各种中间件。可见中间件在web应用开发中的重要性,有兴趣的可以了解一下
    2017-05-05
  • nodejs express配置自签名https服务器的方法

    nodejs express配置自签名https服务器的方法

    这篇文章主要介绍了nodejs express配置自签名https服务器的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Node.js中常用设计模式的使用方法总结

    Node.js中常用设计模式的使用方法总结

    设计模式是由经验丰富的程序员在日积月累中抽象出的用以解决通用问题的可复用解决方案,它提供了标准化的代码设计方案提升开发体验,本文主要来和大家讨论一下Node.js中设计模式的重要性并提供一些代码示例,感兴趣的可以了解下
    2023-10-10
  • sublime text配置node.js调试(图文教程)

    sublime text配置node.js调试(图文教程)

    下面小编就为大家分享一篇sublime text配置node.js调试(图文教程),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • 详解如何给Node.js版本降级

    详解如何给Node.js版本降级

    Node.js是一个基于chrome v8引擎的JavaScript运行时环境,用于构建快速、可扩展的网络应用程序,在某些情况下,降级Node.js版本可能额是必要的,本篇文章将向您介绍如今降级Node.js版本并提供相应的源代码示例,需要的朋友可以参考下
    2023-11-11
  • NodeJS多种创建WebSocket监听的方式(三种)

    NodeJS多种创建WebSocket监听的方式(三种)

    这篇文章主要介绍了NodeJS多种创建WebSocket监听的方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 详解autojs的nodejs编写UI技巧示例

    详解autojs的nodejs编写UI技巧示例

    这篇文章主要为大家介绍了autojs的nodejs编写UI技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 浅谈Node.js之异步流控制

    浅谈Node.js之异步流控制

    本篇文章主要介绍了浅谈Node.js之异步流控制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Node.js模块化的使用详细介绍

    Node.js模块化的使用详细介绍

    nodejs中的模块化是指将每个js文件会被认为单独一个的模块。模块之间是互相不可见的。如果一个模块需要使用另一个模块,那么需要通过指定语法来引入要使用的模块,而且只能使用引入模块所暴露的内容
    2022-08-08

最新评论