首页 >web前端 >js教程 >node.js简介

node.js简介

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌原创
2025-02-14 08:51:10840浏览

An Introduction to Node.js

您听说过 Node.js,但不确定它是什么,也不知道它如何融入您的开发流程?或者,您可能听说过人们对 Node 的赞扬,现在想知道是否需要学习它。也许您熟悉其他后端技术,并想了解 Node 的不同之处。如果这听起来像您,请继续阅读。在本文中,我将以初学者友好的高级视角来探讨 Node.js 及其主要范例。我将研究 Node 的主要用例,以及 Node 当前的格局,并在此过程中为您提供各种出发点(以供进一步阅读)。请注意,在整篇文章中,我将交替使用“Node”和“Node.js”。

关键要点

  • Node.js 是一个基于 Chrome 的 V8 JavaScript 引擎构建的 JavaScript 运行时,允许在服务器端执行 JavaScript,而不是在浏览器中。
  • 使用版本管理器可以更有效地安装 Node.js,它允许轻松地在不同的 Node 版本之间切换,避免 npm 常遇到的权限问题。
  • 由于其非阻塞、事件驱动的架构,Node.js 在实时应用程序(如聊天服务或实时文档编辑)中表现出色,使其适用于用户交互并立即接收响应的环境。
  • Node 的 npm(Node 包管理器)是不可或缺的,它充当全球最大的软件注册中心,简化了现代 JavaScript 开发所需的包的管理和安装。
  • Node.js 的主要优势在于其多功能性和效率,它在服务器上使用 JavaScript 通过减少上下文切换来提高生产力,并且其非阻塞特性允许它同时处理多个连接。

什么是 Node.js?

网上有很多定义。让我们来看几个比较流行的定义。这是项目主页上的说法:> Node.js® 是一个基于 Chrome 的 V8 JavaScript 引擎构建的 JavaScript 运行时。

而 Stack Overflow 提供的是:> Node.js 是一个基于事件、非阻塞、异步 I/O 运行时,它使用 Google 的 V8 JavaScript 引擎和 libuv 库。

嗯,“基于事件”、“非阻塞”、“异步 I/O”——一下子很难消化这么多信息。因此,让我们从不同的角度来处理这个问题,首先关注这两个描述中提到的另一个细节——V8 JavaScript 引擎。

Node 基于 Google Chrome 的 V8 JavaScript 引擎

V8 引擎是在 Google Chrome 和其他基于 Chromium 的 Web 浏览器(包括 Brave、Opera 和 Vivaldi)中运行的开源 JavaScript 引擎。它的设计考虑到了性能,负责将 JavaScript 直接编译成计算机可以执行的原生机器代码。但是,当我们说 Node 是基于 V8 引擎构建时,我们并不是说 Node 程序是在浏览器中执行的。它们不是。相反,Node 的创建者(Ryan Dahl)采用了 V8 引擎,并通过各种功能对其进行了增强,例如文件系统 API、HTTP 库和许多与操作系统相关的实用程序方法。这意味着 Node.js 是一个程序,我们可以用它在我们的计算机上执行 JavaScript。换句话说,它是一个 JavaScript 运行时。

如何安装 Node.js?

在本节中,我们将安装 Node 并编写几个简单的程序。我们还将了解 npm,这是一个与 Node 捆绑在一起的包管理器。

Node 二进制文件与版本管理器

许多网站会建议您访问 Node 官方下载页面并获取适合您系统的 Node 二进制文件。虽然这有效,但我建议您改用版本管理器。这是一个程序,允许您安装多个版本的 Node 并随意在它们之间切换。使用版本管理器有很多优点。例如,它可以消除使用 Node 和 npm 时可能出现的权限问题,并允许您为每个项目设置 Node 版本。如果您想使用版本管理器,请参考我们的快速提示:使用 nvm 安装多个版本的 Node.js。否则,从上面的链接获取适合您系统的正确二进制文件并安装它们。

Node.js 的“Hello, World!”

您可以通过打开终端并键入 node -v 来检查 Node 是否已安装在您的系统上。如果一切顺利,您应该看到类似 v12.14.1 的内容显示。这是撰写本文时的当前 LTS 版本。接下来,创建一个名为 hello.js 的新文件并复制以下代码:

<code class="language-javascript">console.log("Hello, World!");</code>

这使用 Node 的内置 console 模块在终端窗口中显示消息。要运行此示例,请输入以下命令:

<code class="language-bash">node hello.js</code>

如果 Node.js 配置正确,“Hello, World!” 将显示出来。

Node.js 对现代 JavaScript 提供了极好的支持

如本兼容性表所示,Node 对 ECMAScript 2015 (ES6) 及更高版本提供了极好的支持。由于您只针对一个运行时(V8 引擎的特定版本),这意味着您可以使用最新和最现代的语法编写 JavaScript。这也意味着您通常不必担心兼容性问题——如果您编写的是将在不同浏览器中运行的 JavaScript,则会遇到这种情况。为了说明这一点,这里有一个第二个程序,它使用了几个现代 JavaScript 功能,例如标记模板字面量、对象解构和 Array.prototype.flatMap():

<code class="language-javascript">console.log("Hello, World!");</code>

将此代码保存到名为 index.js 的文件中,并使用命令 node index.js 从终端运行它。您应该看到 Brendan Eich is the creator of JavaScript! ┌(˘⌣˘)ʃ 输出到终端。

介绍 npm,JavaScript 包管理器

如前所述,Node 附带一个名为 npm 的包管理器。要检查您的系统上安装了哪个版本,请键入 npm -v。除了是 JavaScript 的包管理器之外,npm 还是全球最大的软件注册中心。有超过 1,000,000 个 JavaScript 代码包可供下载,每周下载量达数十亿次。让我们快速了解一下如何使用 npm 安装包。

全局安装包

打开您的终端并键入以下内容:

<code class="language-bash">node hello.js</code>

这将在您的系统上全局安装 jshint 包。我们可以用它来 lint 上一个示例中的 index.js 文件:

<code class="language-javascript">function upcase(strings, ...values) {
  return values.map(name => name[0].toUpperCase() + name.slice(1))
    .join(' ') + strings[2];
}

const person = {
  first: 'brendan',
  last: 'eich',
  age: 56,
  position: 'CEO of Brave Software',
};

const { first, last } = person;
const emoticon = [ ['┌', '('], ['˘', '⌣'], ['˘', ')', 'ʃ'] ];

console.log(
  upcase`${first} ${last} is the creator of JavaScript! ` + emoticon.flat().join('')
);</code>

您现在应该会看到许多与 ES6 相关的错误。如果您想修复它们,请将 /* jshint esversion: 6 */ 添加到 index.js 文件的顶部,重新运行该命令,并且 lint 应该通过。如果您想复习一下 lint,请参阅 JavaScript Lint 工具的比较。

本地安装包

我们还可以将包本地安装到项目中,而不是全局安装到我们的系统中。创建一个测试文件夹,并在该目录中打开一个终端。接下来键入以下内容:

<code class="language-bash">npm install -g jshint</code>

这将在同一文件夹中创建并自动填充 package.json 文件。接下来,使用 npm 安装 lodash 包并将其保存为项目依赖项:

<code class="language-bash">jshint index.js</code>

创建一个名为 test.js 的文件并添加以下内容:

<code class="language-bash">npm init -y</code>

最后,使用 node test.js 运行脚本。您应该看到 [ 1, 2, 3 ] 输出到终端。

使用 package.json 文件

如果您查看测试目录的内容,您会注意到一个名为 node_modules 的文件夹。这是 npm 保存 lodash 和 lodash 依赖的任何库的地方。node_modules 文件夹不应签入版本控制,实际上,可以通过在项目的根目录中运行 npm install 随时重新创建它。如果您打开 package.json 文件,您会看到 lodash 在 dependencies 字段下列出。通过这种方式指定项目的依赖项,您可以允许任何地方的任何开发人员克隆您的项目并使用 npm 安装运行所需的所有包。如果您想了解更多关于 npm 的信息,请务必阅读我们的文章 npm 初学者指南——Node 包管理器。

Node.js 用于什么?

既然我们已经知道 Node 和 npm 是什么以及如何安装它们,我们可以将注意力转向它们的常见用途之一:安装(通过 npm)和运行(通过 Node)各种构建工具——旨在自动化现代 JavaScript 应用程序的开发过程。这些构建工具种类繁多,在现代 JavaScript 环境中,您如果不遇到它们就无法走得太远。它们可以用于任何事情,从将您的 JavaScript 文件和依赖项捆绑到静态资产,到运行测试,或自动代码 lint 和样式检查。我们在 SitePoint 上有很多文章介绍构建工具。以下是我最喜欢的一些文章:

  • Webpack 初学者指南
  • 开始使用 ESLint——可插入的 JavaScript Lint 工具
  • Gulp.js 简介
  • 使用 Mocha 和 Chai 对 JavaScript 进行单元测试

如果您想开始使用任何现代 JavaScript 框架(例如 React 或 Angular)开发应用程序,则需要具备 Node 和 npm(或 Yarn)的工作知识。这并不是因为您需要 Node 后端来运行这些框架。您不需要。而是因为这些框架(以及许多相关的包)都可通过 npm 获得,并且依赖于 Node 来创建一个合理的开发环境,以便它们可以在其中运行。如果您有兴趣了解 Node 在现代 JavaScript 应用程序中扮演什么角色,请阅读现代 JavaScript 应用程序的剖析。

Node.js 允许我们在服务器上运行 JavaScript

接下来,我们来看 Node.js 最大的用例之一——在服务器上运行 JavaScript。这不是一个新概念,早在 1994 年 Netscape 就首次尝试过。然而,Node.js 是第一个获得任何实际吸引力的实现,与传统语言相比,它提供了一些独特的优势。Node 现在在许多知名公司的技术栈中扮演着关键角色。让我们来看看这些好处是什么。

Node.js 执行模型

非常简单地说,当您连接到传统服务器(例如 Apache)时,它将生成一个新线程来处理请求。在 PHP 或 Ruby 等语言中,任何后续的 I/O 操作(例如,与数据库交互)都会阻塞代码的执行,直到操作完成。也就是说,服务器必须等待数据库查找完成才能继续处理结果。如果在此期间有新的请求进来,服务器将生成新的线程来处理它们。这可能效率低下,因为大量线程会导致系统变得迟缓——最坏的情况下,会导致网站宕机。支持更多连接最常见的方法是添加更多服务器。

然而,Node.js 是单线程的。它也是事件驱动的,这意味着 Node 中发生的一切都是对事件的反应。例如,当一个新的请求进来(一种事件)时,服务器将开始处理它。如果它随后遇到阻塞 I/O 操作,它不会等待此操作完成,而是在继续处理下一个事件之前注册一个回调。当 I/O 操作完成(另一种事件)时,服务器将执行回调并继续处理原始请求。在后台,Node 使用 libuv 库来实现这种异步(即非阻塞)行为。Node 的执行模型使服务器几乎没有开销,因此它能够处理大量并发连接。扩展 Node 应用程序的传统方法是克隆它,并让克隆的实例共享工作负载。Node.js 甚至有一个内置模块来帮助您在单个服务器上实现克隆策略。下图描述了 Node 的执行模型:

An Introduction to Node.js

来源:Christian Maderazo 教授和 James Santos 的 Node.js 简介

或者,如果您喜欢视频,请查看这个精彩的演讲:事件循环到底是什么?它不是 Node 特有的,但它很好地解释了这个概念。

有什么缺点吗?

Node 在单个线程中运行这一事实确实带来了一些限制。例如,应避免阻塞 I/O 调用,应将 CPU 密集型操作交给工作线程,并且应始终正确处理错误,以免使整个进程崩溃。一些开发人员也不喜欢 JavaScript 强加的基于回调的编码风格(以至于甚至有一个网站专门介绍编写异步 JavaScript 的恐怖之处)。但是,随着原生 Promise 的到来,紧随其后的是 async await,现代 JavaScript 中的流程控制比以往任何时候都更容易。

“Hello, World!”——服务器版本

让我们快速浏览一下“Hello, World!” HTTP 服务器示例:

<code class="language-javascript">console.log("Hello, World!");</code>

要运行此代码,请将代码复制到名为 hello-world-server.js 的文件中,并使用 node hello-world-server.js 运行它。打开浏览器并导航到 https://www.php.cn/link/4a914e5c38172ae9b61780ffbd0b2f90 以查看浏览器中显示的“Hello, World!”。现在让我们来看看代码。我们首先需要 Node 的原生 HTTP 模块。然后,我们使用它的 createServer 方法创建一个新的 Web 服务器对象,我们将一个匿名函数传递给它。此函数将为与服务器建立的每个新连接调用。匿名函数使用两个参数(request 和 response)调用。这些包含来自用户的请求和响应,我们使用它们来发送 200 HTTP 状态代码以及我们的“Hello World!”消息。最后,我们告诉服务器监听端口 3000 上的传入请求,并向终端输出一条消息,让我们知道它正在运行。显然,在 Node 中创建甚至是一个简单的服务器还有更多内容(例如,正确处理错误非常重要),因此如果您想了解更多信息,我建议您查看文档或查阅我们的教程。

Node.js 适合哪种应用程序?

Node 特别适合构建需要某种形式的实时交互或协作的应用程序——例如,聊天网站或 CodeShare 等应用程序,您可以在其中观看其他人实时编辑文档。它也适合构建 API,在 API 中您处理许多 I/O 驱动的请求(例如需要对数据库执行操作的请求),或者涉及数据流的网站,因为 Node 使您能够在文件仍在上传时处理文件。如果 Node 的这个实时方面是您想了解更多内容的内容,请查看我们关于构建实时聊天应用程序的教程。然而,并非每个人都会构建下一个 Trello 或下一个 Google Docs,实际上,您没有理由不能使用 Node 来构建一个简单的 CRUD 应用程序。但是,如果您遵循此路线,您很快就会发现 Node 非常基础,并且构建和组织应用程序的方式很大程度上取决于您自己。您可以使用各种框架来减少样板代码,其中 Express 已确立了自己作为领先者的地位。然而,即使是 Express 这样的解决方案也是最小的,这意味着如果您想做一些稍微不同寻常的事情,您需要从 npm 中引入其他模块。这与 Rails 或 Laravel 等框架形成鲜明对比,后者开箱即用地提供了许多功能。如果您想了解如何构建一个基本的、更传统的应用程序,请查看我们的教程如何构建和组织 Node.js MVC 应用程序。

Node.js 的优势是什么?

除了速度和可扩展性之外,在 Web 服务器以及浏览器中使用 JavaScript 的一个经常被提及的优势是,您的大脑不再需要切换模式。您可以使用同一种语言完成所有工作,作为开发人员,这会让您更高效(希望也更快乐)。例如,您可以轻松地在服务器和客户端之间共享代码。Node 的另一个重要优势是它使用 JSON。JSON 可能是 Web 上最重要的数据交换格式,也是与对象数据库(例如 MongoDB)交互的通用语言。JSON 非常适合 JavaScript 程序使用,这意味着当您使用 Node 时,数据可以在层之间流畅地流动,而无需重新格式化。您可以从浏览器到服务器到数据库都使用一种语法。最后,JavaScript 无处不在:我们大多数人都熟悉 JavaScript,或者在某些时候使用过它。这意味着过渡到 Node 开发可能比过渡到其他服务器端语言更容易。引用 Craig Buckler 在他的 Node 与 PHP 对决中的话,JavaScript 可能是世界上最容易被误解的语言——但是,一旦概念点击,它会让其他语言显得笨拙。

Node 的其他用途

它并不止于服务器。Node.js 还有许多其他令人兴奋和多样的用途!例如,它可以用作脚本语言来自动执行您 PC 上重复性或容易出错的任务。它还可以用来编写您自己的命令行工具,例如这个 Yeoman 风格的生成器来搭建新的项目。Node.js 还可以用来构建跨平台桌面应用程序,甚至可以用来创建您自己的机器人。还有什么不喜欢的呢?

结论

JavaScript 无处不在,Node 也是一个庞大而广泛的主题。尽管如此,我希望在本文中,我已经为您提供了开头承诺的关于 Node.js 及其主要范例的初学者友好的高级视角。我还希望,当您重新阅读我们之前看到的定义时,事情会更有意义。

Node.js 是一个基于事件、非阻塞、异步 I/O 运行时,它使用 Google 的 V8 JavaScript 引擎和 libuv 库。

如果您有任何问题或意见,请随时在 Twitter 上联系我。

关于 Node.js 的常见问题

Node.js 和 JavaScript 有什么区别?

JavaScript 是一种编程语言,主要用于客户端的 Web 开发。它是一种在浏览器中运行的语言。另一方面,Node.js 是一个运行时环境,允许 JavaScript 在服务器端运行。它基于 Chrome 的 V8 JavaScript 引擎构建。Node.js 扩展了 JavaScript 的功能,使其能够与 I/O API 交互、执行网络功能和访问数据库,这些功能通常在基于浏览器的 JavaScript 中不可用。

为什么 Node.js 在服务器端编程中很流行?

由于其非阻塞、事件驱动的架构,Node.js 在服务器端编程中很流行。这意味着它可以同时处理多个客户端请求,而无需等待网络请求或数据库操作等任务完成。这使得 Node.js 高效且适合实时应用程序,例如聊天应用程序、协作工具和游戏服务器。

Node.js 如何处理并发请求?

Node.js 使用其事件驱动、非阻塞 I/O 模型处理并发请求。当发出请求时,Node.js 执行操作,然后继续执行下一个请求,而无需等待先前的操作完成。操作完成后,将触发一个事件,并执行相应的回调函数。这允许 Node.js 使用单个服务器处理数千个并发连接。

Node.js 可以用于前端开发吗?

虽然 Node.js 主要用于服务器端开发,但它也可以用于前端开发。Node.js 提供了一些工具和框架,例如 Express.js 和 Socket.IO,可用于构建强大的前端应用程序。此外,Node.js 用于运行 Babel 和 Webpack 等构建工具,这些工具在现代前端开发中必不可少。

NPM 在 Node.js 中的作用是什么?

NPM 或 Node 包管理器是 Node.js 开发中必不可少的工具。它是一个包管理器,允许开发人员安装、更新和管理 Node.js 应用程序所需的各种库和依赖项。NPM 提供了一个大型的开源包存储库,使开发人员更容易共享和重用代码。

Node.js 与其他服务器端技术(如 PHP 或 Ruby on Rails)相比如何?

Node.js 与 PHP 和 Ruby on Rails 在几个方面有所不同。与同步的 PHP 和 Ruby on Rails 不同,Node.js 是异步的和非阻塞的,这意味着它可以同时处理多个请求。这使得 Node.js 更高效且适合实时应用程序。此外,Node.js 使用 JavaScript,这是一种许多开发人员熟悉的语言,从而降低了学习曲线。

Node.js 的一些用例是什么?

Node.js 功能多样,可用于各种应用程序。它特别适合构建可扩展的网络应用程序、实时应用程序(如聊天应用程序和游戏服务器)、协作工具和 API 服务器。Netflix、LinkedIn 和 Uber 等公司在其技术栈中使用 Node.js,因为它高效且快速。

使用 Node.js 的一些挑战是什么?

虽然 Node.js 提供了许多好处,但它也面临一些挑战。其异步、非阻塞的特性可能使代码难以理解和调试。此外,由于 Node.js 是单线程的,因此 CPU 密集型任务可能会阻塞整个服务器,从而影响性能。但是,可以通过良好的编码实践以及适当使用工具和库来减轻这些挑战。

Node.js 如何处理错误?

Node.js 通过首个错误回调处理错误。这意味着传递给回调函数的第一个参数是一个错误对象。如果在执行异步操作期间发生错误,它将作为第一个参数传递给回调函数。如果没有发生错误,则此参数将为 null。

Node.js 可以与数据库一起使用吗?

是的,Node.js 可以与各种类型的数据库交互,包括 SQL 和 NoSQL 数据库。有几个库和 ORM(对象关系映射)可用,例如用于 SQL 数据库的 Sequelize 和用于 MongoDB 的 Mongoose,它们使在 Node.js 应用程序中与数据库交互更容易。

所有图片格式均保持为 .jpg.webp

以上是node.js简介的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn