什么是Node.js以及为什么要使用它

什么是Node.js以及为什么要使用它
JavaScript是世界上最流行的编程语言之一。今天,它为数百万个网站提供支持,并吸引了成群的开发人员和设计人员为Web构建功能。如果您是编程新手,那么 JavaScript很容易成为最适合您的编程语言之一。

在最初的20年里,JavaScript主要用于客户端脚本。由于JavaScript只能在<script>标签内使用,因此开发人员必须在前端和后端组件之间使用多种语言和框架。后来出现了Node.js,它是一个运行时环境,包括执行用JavaScript编写的程序所需的一切。

Node.js是一个单线程、开源、跨平台的运行时环境,用于构建快速且可扩展的服务器端和网络应用程序。它运行在V8 JavaScript运行时引擎上,它使用事件驱动的非阻塞I/O架构,这使其高效且适用于实时应用程序。

  1. Node.js架构及其工作原理
  2. Node.js的特点
  3. 市场规模
  4. Node.js的应用
  5. Node.js是一种编程语言吗?
  6. Node.js是前端还是后端?
  7. Node.js入门
  8. 如何安装Node.js
  9. 检查安装的Node.js版本
  10. 什么是NPM?
  11. Node.js中的你好世界
  12. 使用Express创建服务器

Node.js是用什么写的?

Node.js是用C、C++和JavaScript编写的。

维基百科将Node.js定义为“Google的V8 JavaScript引擎、libuv平台抽象层和核心库的打包编译,它本身主要用JavaScript编写。”

运行时内部使用Chrome V8,它是JavaScript执行引擎,它也是用C++编写的。这为Node.js的所有功能添加了额外的用例,例如访问内部系统功能(如网络)。

Node.js架构及其工作原理

Node.js使用“单线程事件循环”架构同时处理多个客户端。要了解这与其他运行时有何不同,我们需要了解如何用Java等语言处理多线程并发客户端。

在多线程请求-响应模型中,多个客户端发送一个请求,服务器在返回响应之前处理每个请求。但是,使用多个线程来处理并发调用。这些线程被定义在一个线程池中,每次有请求进来时,都会分配一个单独的线程来处理它。

 

 

node.js如何使用事件循环处理传入请求

node.js如何使用事件循环处理传入请求

Node.js的工作方式不同。让我们来看看它经历的每一步:

  1. Node.js维护一个有限的线程池来服务请求。
  2. 每当请求到来时,Node.js都会将其放入队列中。
  3. 现在,单线程“事件循环”——核心组件——出现了。此事件循环无限期地等待请求。
  4. 当一个请求进来时,循环从队列中取出它并检查它是否需要阻塞输入/输出(I/O)操作。如果不是,它会处理请求并发送响应。
  5. 如果请求有阻塞操作要执行,事件循环会从内部线程池中分配一个线程来处理请求。可用的内螺纹数量有限。这组辅助线程称为工作组。
  6. 事件循环跟踪阻塞请求,并在处理阻塞任务后将它们放入队列中。这就是它保持其非阻塞性质的方式。

由于Node.js使用更少的线程,它使用更少的资源/内存,从而更快地执行任务。所以就我们的目的而言,这种单线程架构相当于多线程架构。当需要处理数据密集型任务时,使用Java等多线程语言会更有意义。但对于实时应用程序,Node.js是显而易见的选择。

Node.js的特点

Node.js在过去几年中发展迅速。这要归功于它提供的大量功能列表:

  1. 简单——Node.js很容易上手。它是Web开发初学者的首选。拥有大量教程和庞大的社区——入门非常容易。
  2. 可扩展性——它为应用程序提供了巨大的可扩展性。Node.js是单线程的,能够以高吞吐量处理大量同时连接。
  3. 速度——非阻塞线程执行使Node.js更快、更高效。
  4. 包(Packages)——提供了大量的开源Node.js包,可以简化您的工作。目前NPM生态系统中有超过一百万个包。
  5. 强大的后端——Node.js是用C和C++编写的,这使其速度更快,并添加了网络支持等功能。
  6. 多平台——跨平台支持允许您使用Node.js创建SaaS网站、桌面应用程序甚至移动应用程序。
  7. 可维护——Node.js对于开发人员来说是一个简单的选择,因为前端和后端都可以使用JavaScript作为单一语言进行管理。

市场规模

在过去的2年里,网站有了巨大的增长,正如预期的那样,Node.js也在快速增长。早在2018年,流行的运行时就已经超过了10亿次下载门槛,据W3Techs称,Node.js被全球所有网站的1.2%使用。互联网上的站点总数超过2000万个。

毫不奇怪,它也是数百万公司的热门选择。以下是当今使用Node.js的一些流行的:

  • Twitter
  • Spotify
  • eBay
  • Reddit
  • LinkedIn
  • Godaddy

Node.js的应用

Node.js的应用

Node.js的应用

Node.js用于各种各样的应用程序。让我们探索一些流行的用例,其中Node.js是一个不错的选择:

  1. 实时聊天——由于其单线程异步特性,Node.js非常适合处理实时通信。它可以轻松扩展,并且经常用于构建聊天机器人。Node.js还可以轻松构建其他聊天功能,例如多人聊天和推送通知。
  2. 物联网——物联网应用程序通常包含多个传感器,因为它们经常发送可以堆积成大量请求的小块数据。Node.js是一个不错的选择,因为它能够快速处理这些并发请求。
  3. 数据流式传输——Netflix等公司使用Node.js进行流式传输。这主要是因为Node.js是轻量级和快速的,此外Node.js还提供了一个原生的流API。这些流允许用户通过管道相互发送请求,从而将数据直接流式传输到其最终目的地。
  4. 复杂的单页应用程序 (SPA) — 在SPA中,整个应用程序加载在一个页面中。这通常意味着在后台对特定组件发出了几个请求。Node.js的事件循环在这里发挥了作用,因为它以非阻塞方式处理请求。
  5. 基于REST API的应用程序——JavaScript用于站点的前端和后端。因此,服务器可以使用Node.js通过REST API轻松地与前端通信。Node.js还提供了诸如Express.js和Koa之类的包,使构建Web应用程序变得更加容易。

Node.js是一种编程语言吗?

一句话:没有

Node.js不是一种编程语言。相反,它是一个运行时环境,用于在浏览器之外运行JavaScript。

Node.js也不是一个框架(用于开发软件应用程序的平台)。Node.js运行时构建在一种编程语言(在本例中为JavaScript)之上,并有助于运行框架本身。

综上所述,Node.js既不是编程语言也不是框架;这是他们的环境。

Node.js是前端还是后端?

开发人员的一个常见误解是Node.js是一个后端框架,仅用于构建服务器。这不是真的:Node.js可以在前端和后端使用。

Node.js框架成为构建灵活和可扩展后端的开发人员的热门选择的原因之一是它的事件驱动、非阻塞特性。但是,前端开发人员会在他们自己的工作中清楚地看到 Node.js的这些好处。

让我们来看看为什么Node.js同时适用于后端和前端:

  1. 可重用性——JavaScript是一种通用语言,用于在Express.js和Meteor.js等框架的帮助下编写后端和前端。一些流行的堆栈,例如MERN,使用Express.js作为后端(一个Node.js框架)。多个组件也可以在前端和后端之间重用。
  2. 生产力和开发人员效率——由于减少了多种语言之间的上下文切换,可以节省大量的开发人员时间。后端和前端都使用JavaScript可以提高效率,因为许多工具对两者都是通用的。
  3. 庞大的社区——蓬勃发展的在线社区是成功开发周期的速度因素。当您遇到问题时,很有可能有人已经解决了它并在Stack Overflow上分享了解决方案。Node.js充分利用了这个社区,当涉及到流行的运行时及其包时,这个社区非常活跃和参与。

Node.js入门

决定从哪里开始使用Node.js可能会让人不知所措。幸运的是,它安装起来很简单,然后您就可以自己试驾了。

如何安装Node.js

如果您已经安装了Node.js,请随意跳过本节。

在macOS上

在Mac上使用 Bash

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl "https://nodejs.org/dist/latest/node-${VERSION:-$(wget -qO- https://nodejs.org/dist/latest/ | sed -nE 's|.*>node-(.*)\.pkg.*|\1|p')}.pkg" > "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/"
curl "https://nodejs.org/dist/latest/node-${VERSION:-$(wget -qO- https://nodejs.org/dist/latest/ | sed -nE 's|.*>node-(.*)\.pkg.*|\1|p')}.pkg" > "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/"
curl "https://nodejs.org/dist/latest/node-${VERSION:-$(wget -qO- https://nodejs.org/dist/latest/ | sed -nE 's|.*>node-(.*)\.pkg.*|\1|p')}.pkg" > "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/"

在Mac上使用 Homebrew

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
brew install node
brew install node
brew install node

在Windows上

直接从nodejs.org网站下载Windows安装程序

在Linux上

在Ubuntu 18.04+上,您可以使用以下命令安装 Node。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo apt update
sudo apt install nodejs
sudo apt update sudo apt install nodejs
sudo apt update
sudo apt install nodejs

检查安装的Node.js版本

在上一节中,我们成功安装了Node.js。让我们通过检查安装的版本来验证它。在终端中运行以下命令。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
node -v
node -v
node -v

您也可以通过较长的标志检查它

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
node --version
node --version
node --version

您应该会看到与此类似的输出。虽然版本号可能会有所不同。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
v14.16.0
v14.16.0
v14.16.0

什么是NPM?

NPM是Node.js的包生态系统。它是世界上所有开源库中最大的生态系统,拥有超过100万个软件包并且还在不断增长。NPM是免费使用的,每天都有成千上万的开源开发人员为它做出贡献。

NPM带有一个开箱即用的命令行实用程序。您可以直接前往NPM网站搜索您需要的包,然后使用单个命令进行安装。您还可以通过此命令行实用程序管理包的版本、查看依赖项,甚至在项目中设置自定义脚本。毫无疑问,NPM是Node.js社区最受欢迎的财产;Node.js吸引了大量开发人员,主要是由于其出色的包支持。

通过CLI 安装NPM包

安装Node.js时,会自动安装NPM。我们在前面的章节中介绍了如何安装Node.js,所以现在让我们看一下使用NPM安装包的命令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install <package-name>
npm install <package-name>
npm install <package-name>

是的,就是这么简单!你甚至可以一次安装多个包:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install <pkg-1> <pkg-2> <pkg-3>
npm install <pkg-1> <pkg-2> <pkg-3>
npm install <pkg-1> <pkg-2> <pkg-3>

如果要在全局上下文中安装包,还可以指定-g (global)标志。这使您可以在机器上的任何地方使用该软件包。

当你初始化一个新的应用程序时,NPM会自动创建一个包含所有NPM包的package.json文件。在这里,您可以指定版本、依赖项和自定义脚本。

NPM实用程序附带一长串命令,包括publishauditrun等。您可以使用命令npm help检查如何使用这些。

节点和npm版本

节点和npm版本

以下是当今一些最受欢迎的Node.js包:

  • Express – Express.js,或简称Express,是受Sinatra启发的Node.js Web开发框架,也是当今大多数Node.js应用程序的事实标准。
  • MongoDB – MongoDB的官方驱动程序。它为Node.js中的MongoDB对象数据库提供API。
  • Socket.io – Socket支持实时、双向和基于事件的通信。
  • Lodash – Lodash使JavaScript更容易,因为它消除了使用数组、数字、对象、字符串等的麻烦。
  • Moment – 用于解析、验证、操作和格式化日期的JavaScript日期库。
  • Commander.js – 这是您使用node.js的命令行界面工作和构建所需的全部内容。
  • Forever – 一个简单的CLI工具,用于确保给定脚本连续运行(即永远)。面对任何意外故障,让您的Node.js进程在生产中保持正常运行。
  • Async – 一个实用模块,为使用异步JavaScript提供简单、强大的功能。
  • Redis – 支持Redis数据库集成的客户端库。
  • Mocha – 适用于Node.js和浏览器的干净、灵活的JavaScript测试框架。
  • Passport – Node.js的简单、不显眼的身份验证。Passport的唯一目的是验证请求。

Node.js中的你好世界

和往常一样,让我们​​从基本的“Hello World”程序开始,我们在Node.js中创建一个服务器,它将在服务器请求中返回“Hello World”输出。在你开始之前,一定要为自己设置一个好的文本编辑器

打开文本编辑器后,下面是您将用于“Hello World”程序的代码:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// server.js
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World! Welcome to Node.js');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
// server.js const http = require('http'); const hostname = '127.0.0.1'; const port = 3000; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World! Welcome to Node.js'); }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); });
// server.js
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World! Welcome to Node.js');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});

将此文件保存为“server.js”。现在前往终端并使用以下命令启动服务器:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
node server.js
node server.js
node server.js

服务器现在应该开始运行。要验证输出,请在浏览器中打开http://localhost:3000 。你应该会看到消息——

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Hello World! Welcome to Node.js
Hello World! Welcome to Node.js
Hello World! Welcome to Node.js

Hello World服务器说明

Node.js带有一个名为“HTTP”的内置模块,它允许Node.js通过超文本传输​​协议 (HTTP)传输数据。

在上面的代码中,我们首先在程序中加载http模块。然后我们使用createServer方法接受请求并返回带有状态码的响应。最后,我们在定义的端口进行监听。

恭喜——你刚刚在Node.js中创建了你的第一个服务器!在下一节中,我们将学习如何使用Express框架来创建服务器。

使用Express创建服务器

首先,我们应该讨论什么是服务器。服务器负责通过其软件(最常见的是Apache或Nginx)接收客户端请求,执行所需的一组任务,最后将响应发送回客户端。Express是一个可以帮助我们在Node.js中创建服务器的框架。

Express.js是一个最小且灵活的Node.js Web应用程序框架,它为Web和移动应用程序提供了一组强大的功能。它允许在您的应用程序中添加路由表和设置中间件。您可以使用以下命令安装Express。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install express --save
npm install express --save
npm install express --save

在上一节中,我们使用了内置的http实用程序来创建服务器。现在,让我们使用Express.js创建一个“Hello World”服务器。

打开您的文本编辑器并输入以下代码:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// server-express.js
const express = require('express')
const app = express() // initialize app
const port = 3000
// GET callback function returns a response message
app.get('/', (req, res) => {
res.send('Hello World! Welcome to Node.js')
})
app.listen(port, () => {
console.log(`Server listening at http://localhost:${port}`)
})
// server-express.js const express = require('express') const app = express() // initialize app const port = 3000 // GET callback function returns a response message app.get('/', (req, res) => { res.send('Hello World! Welcome to Node.js') }) app.listen(port, () => { console.log(`Server listening at http://localhost:${port}`) })
// server-express.js
const express = require('express')
const app = express() // initialize app
const port = 3000
// GET callback function returns a response message
app.get('/', (req, res) => {
res.send('Hello World! Welcome to Node.js')
})
app.listen(port, () => {
console.log(`Server listening at http://localhost:${port}`)
})

接下来,我们将使用以下命令运行我们的服务器。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
node server-express.js
node server-express.js
node server-express.js

现在在浏览器中检查http://localhost:3000以查看“Hello World”输出。

小结

简而言之,Node.js是一种流行的编程环境,可用于构建需要支持多个并发请求的大规模应用程序。单线程非阻塞I/O也使其成为实时和数据流应用程序的绝佳选择。

更重要的是,Node.js拥有庞大的活跃开发者社区,并拥有世界上最大的开源包存储库NPM,目前包含超过一百万个包。

开始使用Node.js很容易。我们已经介绍了如何在Node.js中安装和创建服务器,所以剩下的就是考虑如何在自己的堆栈中使用和实现Node.js。您还可以通过访问nodejs.dev上的官方Node.js文档来扩展您的知识。

评论留言