乐趣区

关于前端:Nodejs究竟是什么初学者指南

如果你正在思考应用 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

如果你喜爱理解软件工具及其工作原理,那么你肯定会喜爱浏览这篇文章。那么,让咱们开始吧。

1、Node.js 的历史

1995 年,为网景公司工作的布兰登·艾奇(Brendan Eich)创造了 JavaScript。但它是一种只能在浏览器上运行的编程语言。

网页最后只显示动态信息。JavaScript 的创造满足了网页中更多交互行为的需要。有了这项创造,开发人员能够构建更动静的网页。

在 Brendan Eich 创造了 JavaScript 之后,许多公司也尝试应用这种语言来运行 web 服务器(服务器端脚本)。这些尝试包含网景的 Livewire 和微软的 Active Server Pages。

但这素来没有成为开发 web 服务器的一种形式,即便 JavaScript 在浏览器中应用时持续取得风行。

2008 年,谷歌公布了一款名为 Chrome 的新浏览器。这款浏览器的公布彻底改变了互联网浏览的世界。它是一个优化的浏览器,能够疾速执行 JavaScript,并改善了用户在 Web 上的体验。

Google Chrome 浏览器之所以能如此疾速地执行 JavaScript 代码,是因为 Chrome 浏览器内运行着一个名为 V8 的 JavaScript 引擎。该引擎负责接管 JavaScript 代码,优化代码,而后在计算机上执行。

该引擎是客户端 JavaScript 的现实解决方案。谷歌 Chrome 浏览器成为当先的网络浏览器。

2009 年,一位名叫 Ryan Dahl 的软件工程师批评了过后风行的后端服务器运行形式。最风行的构建 Web 服务器的软件是 Apache HTTP 服务器。Dahl 认为它是无限的,因为它不能无效地解决大量的实时用户连贯(10,000 +)。

这也是 Ryan Dahl 开发 Node.js 的次要起因之一。Node.js 应用谷歌的 V8 引擎来了解和执行浏览器外的 JavaScript 代码。这是一个以运行网络服务器为目标的程序。

Node.js 是传统 Apache HTTP 服务器的一个很好的替代品,并缓缓取得了开发者社区的认可。

现在,Netflix、NASA、LinkedIn、Paypal 等许多大型组织都在应用 Node.js。这些公司利用 Node.js 的性能为用户构建弱小的应用程序。

此外,在撰写本文时,在最近的 StackOverflow 开发者考察中,Node.js 被评为“Web 框架和技术”类别中最受欢迎的技术。接下来展现了 Node.js 当初有多风行。

Source: https://survey.stackoverflow.co/2022/#technology-most-popular… Stack Overflow Developer Survey 2022

本文将深入探讨是什么让 Node.js 怀才不遇,以及它是如何工作的。但在此之前,咱们须要确切地定义它是什么。

2、什么是 Node.js?

从 Node.js 官网来看,它是这样说的:

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

为了定义 Node.js,咱们须要将定义分成几个局部。咱们要定义的术语是:

  • 开源
  • 跨平台的
  • 运行时环境

2.1、凋谢源代码是什么意思?

凋谢源代码通常用于形容公众能够检查和编辑其源代码的软件。这意味着任何人都能够查看使程序按其形式工作的代码。

这样做的一个益处是,程序的用户能够更好地理解程序及其性能。此外,如果一个人发现了一个 bug,他们能够奉献并修复这个 bug。

您能够在 github 上找到 Node 的源代码,github 是显示开源代码的最风行的网站。Node.js 在 GitHub 上也有很多贡献者——增加性能和修复谬误的人。每个人都能够拜访 Node.js 的源代码,如果他们违心,甚至能够定制本人的程序版本。

2.2、跨平台是什么意思?

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

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

2.3、什么是运行环境?

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

除了 Node.js,JavaScript 运行环境的另一个例子是网络浏览器。浏览器通常领有执行客户端 JavaScript 代码所需的所有资源。

在浏览器中,咱们能够应用 JavaScript 与标记元素交互并调整款式。浏览器会立刻运行代码,因为它是一个运行时环境。

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

Node.js 是一种能够执行 JavaScript 代码的软件程序。更确切地说,Node.js 是一种 JavaScript 运行环境。它是一种为使 JavaScript 代码用于服务器端脚本而开发的环境。

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

Node.js 次要是用 C /C++ 编写的。作为一个应该运行 web 服务器的程序,Node.js 须要一直地与设施的操作系统交互。

应用 C 等低级语言构建 Node.js 使软件能够轻松拜访操作系统的资源并应用它们执行指令。

然而,Node.js 的工作原理还有很多简单之处。Node.js 可运行疾速高效的 Web 服务器,但它到底是如何做到这一点的呢?本节将介绍 Node.js 实现高效的过程。

要理解 Node.js 的工作原理,咱们必须理解三个次要组件。这些组件是

  • V8 引擎
  • Libuv
  • Event Loop

咱们将深入研究并解释这些组件,以及它们如何组成 Node.js。

3.1、什么是 V8 引擎?

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

V8 引擎蕴含一个内存堆和调用堆栈。它们是 V8 引擎的组成部分。它们帮忙治理 JavaScript 代码的执行。

内存堆是 V8 引擎的数据存储。每当咱们创立一个用 JavaScript 保留对象或函数的变量时,引擎就会将该值保留在内存堆中。为了简略起见,它相似于为徒步旅行者贮存物资的背包。

每当引擎执行代码并遇到任何这些变量时,它都会从内存堆中查找理论值——就像每当徒步旅行者感到凛冽并想要生火时,他们能够查看背包中的打火机一样。

要理解内存堆,还有很多更深层次的货色。JavaScript 中的内存治理是一个须要花更多工夫解释的话题,因为理论过程非常复杂。要理解无关内存堆的更多信息,请查看此资源。

调用栈是 V8 引擎的另一个构件。它是一种治理函数执行程序的数据结构。每当程序调用一个函数时,该函数就会被放在调用栈上,只有当引擎解决完该函数后能力来到调用栈。

JavaScript 是一种单线程语言,这意味着它一次只能执行一条指令。因为调用堆栈蕴含要执行指令的程序,这意味着 JavaScript 引擎只有一个程序,一个调用堆栈。点击此处理解无关单线程和调用栈的更多信息。

3.2、什么是 Libuv?

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

I/O 操作与向计算机发送申请和接管响应无关。这些操作包含读写文件、收回网络申请等。

Source: https://libuv.org

从 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 确实是一种单线程语言,但 Node.js 应用的底层库 Libuv 能够在操作系统中执行指令时利用线程池(多线程)。

当初,您在应用 Node.js 时不用放心这些线程了。Libuv 晓得如何无效地治理这些线程。您只需应用所提供的 Node.js API 编写指令即可。

Libuv 最后是为 Node.js 创立的,但当初不同的编程语言都对其进行了绑定。Julia 和 Luvit(基于 Lua 的运行环境)与 Node.js 一样内置了绑定,但其余语言也有提供这些绑定的库。例如 Python 中的 uvloop 等。

3.3、什么是 Event Loop?

Node.js 中的事件循环(Event Loop)是流程中十分重要的一部分。从名称上,咱们能够看出它是一个循环。当 Node.js 开始执行程序时,循环就开始运行。在本节中,咱们将探讨事件循环的作用。

当咱们运行蕴含一些异步代码(如 I/O 指令或基于定时器的操作)的 JavaScript 程序时,Node.js 会应用 Node.js API 对其进行解决。异步函数通常会在函数处理完毕后执行一些指令。这些指令被搁置在 回调队列(Callback Queue)中。

回调队列采纳 先进先出(FIFO)形式工作。这意味着第一个进入队列的指令(回调)将首先被调用。

事件循环运行时,会查看调用栈是否为空。如果调用栈不空,它就会容许正在进行的过程持续。但如果调用栈为空,它就会将回调队列中的第一条指令发送给 JavaScript 引擎。而后,引擎会将该指令(函数)放入调用栈并执行。这与浏览器中事件循环的工作形式十分类似。

因而,事件循环应用 Node.js 中的 JavaScript V8 引擎执行异步指令的回调。这是一个循环,这意味着每次它运行时,它都会查看调用堆栈,以晓得它是否会删除最后面的回调并将其发送给 JavaScript 引擎。

Node.js 据说有一个事件驱动的架构。这意味着 Node.js 是围绕侦听事件并在事件产生时及时响应而构建的。这些事件能够是定时器事件、网络事件等等。

Node.js 通过应用事件循环来响应这些事件,在触发事件后向引擎加载事件回调。因而,Node.js 是应用程序中实时数据传输的绝佳抉择。

4、Node.js 中的模块

Node.js 的许多性能都蕴含在软件自带的模块中。这些模块旨在将程序构件宰割成易于治理的小块,就像乐高积木一样。有了这些模块,咱们只需导入程序所需的模块即可。

例如,上面的代码导入了一个名为 fs 的内置模块。

const fs = require('node:fs')

但在 Node.js 中,咱们还能够通过其余形式应用模块。除了内置模块,咱们还能够应用其余开发人员构建的模块(或包)。

Node Package Manager(NPM)是一个与 Node.js 配套的软件应用程序。它治理 Node.js 中可用的所有第三方模块。无论何时须要第三方软件包,都能够应用 npm install 命令从 NPM 装置。

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

const newModule = require('newModule')

5、瞻望 Node.js

Node.js 当初领有一个宏大的开发者社区。它在 GitHub 上有成千上万的贡献者,并被当今一些最大的公司所应用。然而,Node.js 的将来会怎么呢?

Node.js 自 2009 年问世以来倒退迅速。它最后用于后端开发,但当初能够做更多的事件。您能够应用 Node.js 开发桌面应用程序、前端网络应用程序、挪动应用程序和命令行工具。开发人员将持续在越来越多的利用中应用 Node.js。

Ryan Dahl——Node.js 的发明者——在 2018 年发表了一个名为 Deno 的新的 JavaScript 运行时。他在题为“对于 Node.js 我悔恨的 10 件事”的演讲中颁布了他与人单干创立的运行时。

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

Ryan Dahl 创立 Deno 是因为他认为本人在 Node.js 的原始蓝图方面做出了一些谬误的决定。他心愿为 Web 服务器的 JavaScript 运行时环境做出更好的架构决策。这就是 Deno。

然而,Deno 还没有在开发者社区失去大规模采纳。它依然是一项绝对较新的技术,须要更多的工夫来遍及。

此外,踊跃治理、开发和保护 Node.js 的 OpenJS 基金会始终在修复 Node.js 的一些谬误,并进步其最终效率。越来越多的我的项目建设在 Node.js 架构之上,在可预感的将来,这种状况可能还会继续下去。

总结

在本文中,您曾经学到了很多,当初能够自信地答复“Node.js 到底是什么?”这个问题。

咱们首先回顾了 Node.js 的历史,而后正确地定义了 Node.js。之后,咱们具体论述了 Node.js 的工作原理,解释了 V8 引擎、Libuv 和事件循环等组件。

之后,咱们探讨了 Node.js 和 NPM 中的模块。最初,咱们瞻望了 Node.js 的将来,并得出结论:Node.js 将为更多应用程序提供能源。

如果您想学习如何应用 Node.js 构建应用程序,freeCodeCamp 有一个专门介绍 Node.js 的残缺教程播放列表。互联网上有大量学习该技术的资源,将来还会有更多。

退出移动版