Node.js 的基本概念
🔶 简介
想象一下,一个 Web 应用程序每秒向服务器发送数百个请求,而服务器每次只处理一个请求,之后就转到另一个请求。您可能会遇到一些性能问题,并给用户带来糟糕的体验。
基于这样的背景,Web 开发人员 Ryan Dahl 于 2009 年创建了 Node.js,因为他在使用同步编程和多线程服务器端平台开发具有密集输入和输出流的功能时遇到了一些难题。
因此,Node.js 是为了解决一个特定问题而构建的技术:处理密集的异步输入和输出事件。那么,哪种编程语言具备这种能力呢?答案是:JavaScript。
因此,在本文中,我分享了我对这项技术的知识、经验和研究,主要目的是提供 Node.js 的基本概念,并帮助您理解为什么它在现代服务器端世界中如此重要。
🔶 1 什么是 Node.js?
简单来说,Node.js 是一个基于 JavaScript 的开源平台,用于在 Chrome 的 V8 JavaScript 引擎上进行服务器端编程,这意味着在 Web 浏览器中编译 JavaScript 的引擎与在其核心中运行 Node.js 的引擎是同一个引擎,这就是它如此之快的原因,特别是对于 Web 应用程序而言。
🔶 2 为什么选择 Node.js?
Node.js 是一个非常强大的服务器端平台,用于开发现代、可靠且可扩展的 Web 应用程序,受到 Netflix、Uber、LinkedIn 和 PayPal 等全球公司的信赖。
由于其单线程特性与在后台运行的多线程平台相结合,它的事件驱动架构非常适合具有密集 I/O(输入和输出)的应用程序,使其能够以更少的硬件服务更多的客户端,这意味着以更低的成本获得更高的性能。
除此之外,该平台还为开发人员提供了其他令人惊叹的功能。
🔸 2.1 非阻塞 I/O
非阻塞方法接收输入并异步返回输出。换句话说,它使服务器能够在后台处理响应的同时,接收多个请求而不会阻塞应用程序。
🔸 2.2 单线程
Node.js 可以利用其单线程特性同时处理多个事件,该特性将异步操作委托给多线程平台,这意味着只需一个线程即可处理输入和输出。
此功能通过消耗低内存和基础设施容量来处理大量请求,使其轻量、可扩展且高效。
🔸 2.3 事件驱动
Node.js 是一种事件驱动技术,这意味着该服务器端平台的控制流由事件的发生驱动。因此,在 Node 应用程序启动时,一个名为 Event Loop 的事件监听器就开始等待事件,直到应用程序关闭才会停止。
换句话说,这就像有一位非常高效的服务员等待订单直到餐厅关门。
🔸 2.4 Node 包管理器
Node 包管理器是世界上最大的免费开源功能库,可以轻松导入和使用在任何 Node 应用程序中。这意味着,无论应用程序需要什么工具,都可以在 Node 包管理器中找到。
🔸 2.5 无缓冲
Node.js 应用程序从不缓冲数据,这大大减少了上传文件(例如视频或音频)的处理时间。换句话说,它只是以块的形式输出数据,这意味着用户可以不受任何干扰地观看视频。
🔸 2.6 可扩展
可扩展性是 Node 的核心特性,因为它的架构基于单线程结合多线程平台,因此具有在低基础设施条件下异步处理大量请求的能力,允许它接收数千个同时发生的事件。
🔶 3 Node.js 架构
Node.js 架构包含 3 个关键元素,它们像事件处理工厂一样协同工作。因此,为了更容易理解这些元素如何相互作用,我将给出一个在 Node.js 中开发的 REST API 的示例。
假设客户端向该应用程序发送多个请求:
🔸 3.1 事件队列
1-这些请求一旦到达应用程序,就会进入事件队列,该队列是应用程序中发生的所有事件首先进入的队列,它们等待被发送到称为事件循环的主线程中进行处理。
🔸3.2 事件循环
2- 当一个请求(阻塞操作)进入事件循环(一个在其核心中运行 V8 引擎来编译 JavaScript 的单线程平台)时,它会被委托给线程池平台在后台进行处理。因此,通过这种架构流程,主线程可以再次用于处理其他事件。
🔸3.3 线程池
3- 在线程池中,这是一个多线程平台,运行一个名为 libuv 的库,其核心是 C++,请求(阻塞操作)在后台异步处理,直到完成并准备返回。
🔶结论
我希望这篇简短的文章不仅能帮助您更好地理解 Node.js 的工作原理,还能帮助您更好地理解为什么它是一个快速发展的平台,并且被当今如此多的公司和初创公司所采用。
在现代高度互联的世界中,能够在低基础设施条件下快速扩展的技术无疑是值得关注的重要参与者。
因此,如果您来到这里,我邀请您阅读我的另一篇文章,该文章介绍了我们生活的网络世界中同样必不可少的工具的基础知识:API、REST 和 HTTP 协议。
由 Cássio Cappellari 用💙 撰写!
文章来源:https://dev.to/cassiocappellari/basic-concepts-of-node-js-pch