Node.js 究竟是什么?初学者指南

发布时间 2023-05-30 06:22:39作者: 晓风晓浪

如果您正在考虑使用 JavaScript 进行后端开发,您会听到术语“Node.js”。Node 通常与开发强大的 Web 服务器相关联。

但 Node.js 到底是什么?它是像Angular一样的 JavaScript 框架吗?它是一种编程语言吗?它是一个 JavaScript 库吗?它是一组技术的总称吗?或者它只是 JavaScript 的另一种说法?

在本文中,我们将深入 Node.js 的世界,了解它是什么、创建它的原因以及它的用途。这不是一个基于项目的教程——它旨在向初学者介绍 Node 及其工作原理。

以下是我们将涵盖的主题:

  1. Node.js 的历史

  2. 什么是 Node.js?

  3. Node.js 是如何工作的?

  4. Node.js 中的模块

  5. 期待 Node.js

如果您喜欢了解软件工具及其工作原理,那么您会喜欢阅读本文。关于这一点,让我们开始吧。

https://www.java567.com,搜"node")

Node.js 的历史

在 Netscape 工作的Brendan Eich于 1995 年发明了 JavaScript。但它是一种只能在浏览器上运行的编程语言。

网页最初只显示静态信息。JavaScript 的发明满足了对网页中更多交互行为的需求。通过这项发明,开发人员可以构建更加动态的网页。

在 Brendan Eich 发明 JavaScript 之后,公司也尝试使用该语言来运行 Web 服务器(服务器端脚本)。这些尝试包括Netscape 的 Livewire 和 Microsoft 的 Active Server Pages。

但这从未成为开发 Web 服务器的一种方式,尽管 JavaScript 在浏览器中使用时继续流行。

2008 年,谷歌发布了一款名为Chrome的新网络浏览器。这款浏览器发布后彻底改变了互联网浏览的世界。它是一款经过优化的浏览器,可以快速执行 JavaScript,并改善了网络上的用户体验。

谷歌浏览器能够如此快速地执行 JavaScript 代码的原因是一个名为V8的 JavaScript 引擎在 Chrome 中运行。该引擎负责接受 JavaScript 代码、优化代码,然后在计算机上执行它。

该引擎是客户端 JavaScript 的合适解决方案。谷歌浏览器成为领先的网络浏览器。

2009 年,一位名叫 Ryan Dahl 的软件工程师批评了当时流行的后端服务器运行方式。用于构建 Web 服务器的最流行的软件是Apache HTTP Server。Dahl 认为它是有限的,因为它无法有效地处理大量实时用户连接(10,000 +)。

这是Ryan Dahl 开发他构建的工具Node.js的主要原因之一。Node.js 使用谷歌的 V8 引擎在浏览器外理解和执行 JavaScript 代码。这是一个旨在运行 Web 服务器的程序。

Node.js 是传统 Apache HTTP 服务器的绝佳替代品,并逐渐获得开发人员社区的认可。

如今,Netflix、NASA、LinkedIn、Paypal 等许多大型组织都在使用 Node.js。这些公司利用 Node.js 的功能为其用户构建健壮的应用程序。

此外,在撰写本文时的最新StackOverflow 开发人员调查中,Node.js 被列为“Web 框架和技术”类别中最受欢迎的技术。这继续展示了 Node.js 现在的流行程度。

最流行的 Web 框架和技术

本文将深入探讨是什么让 Node.js 脱颖而出,以及它是如何工作的。但在此之前,我们需要准确定义它是什么。

什么是 Node.js?

Node.js 官方网站

从Node.js 官方网站,它指出:

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

为了定义 Node.js,我们需要将定义分解成多个部分。我们将定义的术语是:

  • 开源

  • 跨平台

  • 运行环境

开源是什么意思?

开源通常用于描述公众可以检查和编辑其源代码的软件。这意味着任何人都可以检查使程序按原样运行的代码。

这样做的一个好处是程序的用户可以更多地了解它及其功能。此外,如果有人发现错误,他们可以贡献并修复错误。

您可以在 GitHub 上找到 Node 的源代码——最流行的显示开源代码的网站。Node.js 在 GitHub 上也有很多贡献者——添加功能和修复错误的人。每个人都可以访问 Node.js 的源代码,如果他们愿意,甚至可以制作他们的程序的定制版本。

跨平台是什么意思?

如果程序是跨平台的,则意味着该程序不限于单一操作系统或硬件架构。

跨平台程序可以在多个平台上运行。Node.js 在 Windows、Linux、Unix 和 MacOS 等平台上运行。开发人员可以在很多操作系统上使用 Node.js。

什么是运行时环境?

编程语言的运行时环境是用户可以执行以该语言编写的代码的任何环境。该环境提供了运行代码所需的所有工具和资源。Node.js 是一个 JavaScript 运行时环境。

除了 Node.js 之外,JavaScript 运行时环境的另一个示例是 Web 浏览器。浏览器通常拥有执行客户端JavaScript 代码所需的所有资源。

在浏览器中,我们可以使用 JavaScript 与标记元素交互并调整样式。浏览器会立即运行代码,因为它是一个运行时环境。

从上面定义的三个术语可以看出,Node.js 不是 Angular 那样的 JavaScript 框架。Node.js 不是一种编程语言,它不是 JavaScript 库,也不是一组技术的总称。它也不是 JavaScript 的别名。

Node.js 是一个可以执行 JavaScript 代码的软件程序。更准确地说,Node.js 是一个 JavaScript 运行环境。它是一个开发环境,可以将 JavaScript 代码用于服务器端脚本。

Node.js 是如何工作的?

Node.js 主要是用 C/C++ 编写的。作为一个运行 Web 服务器的程序,Node.js 需要不断地与设备的操作系统进行交互。

使用像 C 这样的低级语言构建 Node.js 使软件可以轻松访问操作系统的资源并使用它们来执行指令。

但是 Node.js 的工作方式涉及更多的复杂问题。Node.js 运行快速高效的 Web 服务器,但它究竟是如何做到的呢?本节介绍 Node.js 用于实现其效率的过程。

要了解 Node.js 的工作原理,我们必须了解三个主要组件。这些组件是:

  • V8引擎

  • 利布夫

  • 事件循环

我们将深入细节并解释这些组件中的每一个,以及它们是如何构成 Node.js 的。

什么是V8引擎?

V8 引擎是在 Chrome 浏览器中解释和运行 JavaScript 代码的 JavaScript 引擎。其他一些浏览器使用不同的引擎,例如,Firefox 使用 SpiderMonkey,而Safari 使用 JavaScriptCore。没有 JavaScript 引擎,计算机就无法理解 JavaScript。

V8 引擎包含内存堆和调用栈。它们是 V8 引擎的基石。它们帮助管理 JavaScript 代码的执行。

内存堆是 V8 引擎的数据存储。每当我们在 JavaScript 中创建一个包含对象或函数的变量时,引擎都会将该值保存在内存堆中。为简单起见,它类似于为徒步旅行者存放用品的背包。

每当引擎执行代码并遇到任何这些变量时,它都会从内存堆中查找实际值——就像每当徒步旅行者感到寒冷并想要生火时,他们可以在背包中寻找打火机一样。

对内存堆的理解要深入得多。JavaScript 中的内存管理是一个需要更多时间解释的主题,因为实际过程非常复杂。

调用堆栈是 V8 引擎中的另一个构建块。它是一种数据结构,用于管理要执行的函数的顺序。每当程序调用一个函数时,该函数都会被放置在调用堆栈中,并且只有在引擎处理完该函数后才能离开堆栈。

JavaScript 是一种单线程语言,这意味着它一次只能执行一条指令。由于调用栈包含指令执行的顺序,这意味着JavaScript引擎只有一种顺序,一种调用栈。在此处阅读有关单线程和调用堆栈的更多信息。

V8 引擎示意图V8 引擎示意图

什么是利布夫?

除了 V8 引擎,Node.js 的另一个非常重要的组件是Libuv。Libuv 是一个用于执行输入/输出 (I/O)操作的 C 库。

I/O 操作与向计算机发送请求和接收响应有关。这些操作包括读写文件、发起网络请求等。

Libuv 网站

从 Libuv 的官方网站上,他们声明:

Libuv 是一个专注于异步 I/O 的多平台支持库。

这意味着 Libuv 是跨平台的(可以在任何操作系统上运行)并且专注于异步 I/O。

计算机往往需要时间来处理 I/O 指令,但 Libuv(Node.js 用来与计算机交互的库)专注于异步 I/O。它可以一次处理多个 I/O 操作。

这就是让 Node.js 在单线程的情况下仍能高效处理 I/O 指令的原因。这都是因为 Libuv。Libuv 知道如何异步处理请求,从而最大限度地减少延迟。但是 JavaScript 引擎究竟是如何使用 Libuv 的呢?

每当我们将脚本传递给 Node.js 时,引擎都会解析代码并开始处理它。调用堆栈保存调用的函数并跟踪程序。如果 V8 引擎遇到 I/O 操作,它将把该操作传递给 Libuv。然后 Libuv 执行 I/O 操作。

请注意,Libuv 是一个 C 库。我们如何使用JavaScript代码来运行C指令呢?有一些绑定将 JavaScript 函数连接到它们在 Libuv 中的实际实现。这些绑定使得将 JavaScript 代码用于 I/O 指令成为可能。

Node.js 使用 Libuv 进行实际实现,但公开了应用程序编程接口 (API)。因此,我们现在可以使用 Node.js API(看起来像 JavaScript 函数)来启动 I/O 操作。

需要注意的一件有趣的事情是,JavaScript 确实是一种单线程语言,但是 Libuv(Node.js 使用的低级库)可以在操作系统中执行指令时使用线程池(多线程) .

现在,您在使用 Node.js 时不必担心这些线程。Libuv 知道如何有效地管理它们。您只需使用提供的 Node.js API 来编写指令。

Node.js 运行时的图示Node.js 运行时的图示

Libuv 最初是为 Node.js 创建的,但现在不同的编程语言都有它的绑定。Julia和Luvit(基于 Lua 的运行时环境)具有内置的绑定,就像 Node.js 一样,但其他语言具有提供这些绑定的库。Python 中的 uvloop就是一个例子。

什么是事件循环?

Node.js 中的事件循环是该过程中非常重要的部分。从名字就可以看出是一个循环。当 Node.js 开始执行程序时,循环开始运行。在本节中,我们将研究事件循环的作用。

当我们运行包含一些异步代码(如 I/O 指令或基于计时器的操作)的 JavaScript 程序时,Node.js 使用 Node.js API 处理它们。异步函数通常有指令在函数完成处理后执行。这些指令放在回调队列中。

回调队列采用先进先出 (FIFO)方法。这意味着进入队列的第一条指令(回调)最先被调用。

当事件循环运行时,它会检查调用堆栈是否为空。如果调用堆栈不为空,则允许正在进行的进程继续。但如果调用堆栈为空,它会将回调队列中的第一条指令发送给 JavaScript 引擎。然后引擎将该指令(函数)放在调用堆栈上并执行它。这与事件循环在浏览器中的工作方式非常相似。

因此,事件循环使用 Node.js 中的 JavaScript V8 引擎从异步指令执行回调。而且它是一个循环,这意味着每次它运行时,它都会检查调用堆栈以了解它是否会删除最重要的回调并将其发送到 JavaScript 引擎。

Node.js 运行时的完整说明Node.js 运行时的完整说明

据说 Node.js 具有事件驱动的架构。这意味着 Node.js 是围绕监听事件并在事件发生时迅速做出反应而构建的。这些事件可以是定时器事件、网络事件等。

Node.js 通过使用事件循环来响应这些事件,在某些事件触发事件后将事件回调加载到引擎。正是出于这个原因,Node.js 非常适合应用程序中的实时数据传输。

Node.js 中的模块

Node.js 的很多功能都包含在软件附带的模块中。这些模块旨在将程序的构建块拆分为可管理的块,如乐高积木。有了这个,我们只需要导入程序所需的模块。

例如,下面的代码片段导入了一个名为fs.

 const fs = require('node:fs')

但是我们可以通过其他方式在 Node.js 中使用模块。除了内置模块,我们还可以使用其他开发人员构建的模块(或包)。

Node Package Manager (NPM)是与 Node.js 一起提供的软件应用程序。它管理 Node.js 中可用的所有第三方模块。每当您需要第三方包时,您都可以使用npm install命令从 NPM 安装它。

NPM网站主页

导入你从 NPM 安装的模块看起来像这样:

 const newModule = require('newModule')

Node.js 展望未来

Node.js 现在有一个庞大的开发者社区。它在 GitHub 上有成千上万的贡献者,并且被当今一些最大的公司所使用。但是 Node.js 的未来会是什么样子呢?

Node.js 自 2009 年问世以来发展良好。它最初是为后端开发而设计的,但现在可以做更多的事情。您可以使用 Node.js 开发桌面应用程序、前端 Web 应用程序、移动应用程序和命令行工具。开发人员将继续将它用于越来越多的此类应用程序。

Ryan Dahl——Node.js 的发明者——在 2018 年宣布了一个名为Deno 的新 JavaScript 运行时。他在题为“我对 Node.js 感到遗憾的 10 件事”的演讲中公开了他共同创建的这个运行时。

Deno 是一个基于 Google Chrome 的 V8 引擎但用 Rust 编写的 JavaScript 运行时环境。Deno 不仅是 JavaScript 的运行时环境,也是TypeScript 的运行环境。

Ryan Dahl 创建 Deno 是因为他认为自己对 Node.js 的原始蓝图做出了一些错误的决定。他想为 Web 服务器的 JavaScript 运行时环境做出更好的架构决策。结果是 Deno。

Deno 网站的主页

但 Deno 尚未在开发者社区中得到大规模采用。它仍然是一项相对较新的技术,需要更多时间才能普及。

此外,作为积极管理、开发和维护 Node.js 的组织的OpenJS 基金会一直在修复一些错误和 Node.js 的最终效率。更多项目建立在 Node.js 架构之上,并且在可预见的未来可能会继续如此。

结论

在本文中,您学到了很多东西,现在可以自信地回答“Node.js 到底是什么?”这个问题。

我们首先回顾了 Node.js 的历史,然后正确定义了 Node.js。之后我们详细阐述了 Node.js 的工作原理,解释了 V8 引擎、Libuv 和事件循环等组件。

之后,我们谈到了 Node.js 和 NPM 中的模块。最后,我们研究了 Node.js 的未来,我们得出结论,它可能只会支持更多的应用程序。

https://www.java567.com,搜"node")