【通过chatGPT学习nodeJS】 什么是nodeJS

265 阅读11分钟

使用chatGPT 高效从零学习nodeJS,我将通过提问的方式将不懂的问题通过chatGPT回答重新整理

什么是Node.js

  1. Node.js既不是语言,也不是框架,它是一个平台,是一个可以让js在脱离浏览器环境跑起来的环境,因此可以让JavaScript运行在服务器端的开发平台,是一个JavaScript运行时环境,使得JavaScript可以脱离浏览器运行在服务器端,实现了在服务器端使用JavaScript编写高效、可扩展、可靠的网络应用。Node有着事件驱动、非阻塞I/O等特性,使得它非常适合编写高并发的网络应用。

  2. Node.js是一个基于V8 JavaScript引擎的JavaScript运行时环境,V8可以嵌入到任何C ++应用程序中,无论是Chrome还是Node.js,事实上都是嵌入了V8引擎来执行 JavaScript代码

image.png

使用场景
  1. Web应用程序:Node.js可以用于搭建Web应用程序,如博客、在线商城、社交平台等,它可以快速响应客户端的请求,并且可以通过模块化的设计和丰富的模块库,方便地开发出高效、可维护的应用程序。

  2. 实时应用程序:Node.js适用于实时应用程序,如聊天室、在线游戏、在线视频等,因为它可以实现双向通信和事件驱动,从而实现实时性。

  3. 命令行工具:Node.js可以用于开发命令行工具,如代码打包工具、自动化工具等,它可以方便地进行文件读写、网络请求等操作。

  4. IoT应用程序:Node.js可以用于开发物联网应用程序,如智能家居、智能健康等,因为它可以方便地进行数据采集、处理和通信。

  5. API服务:Node.js可以用于开发API服务,如RESTful API服务、GraphQL服务等,它可以方便地进行数据处理和通信。

特点

  1. 高效性:Node.js使用Chrome V8引擎作为其默认的JavaScript引擎,这个JavaScript引擎是目前最快的JavaScript引擎之一。同时,Node.js采用事件驱动和非阻塞I/O的编程方式,能够充分利用CPU和内存资源,从而提高应用的性能和并发处理能力。

  2. 跨平台性:Node.js可以运行于多个操作系统平台,如Windows、Mac OS、Linux等。

  3. 适合实时应用:Node.js适用于实时应用,如聊天室、在线游戏、在线视频等,因为它可以实现双向通信和事件驱动,从而实现实时性。

  4. 社区活跃:Node.js有一个庞大的开发者社区,提供了大量的开源模块和工具,并且不断地更新和改进,使得开发者能够更加便捷地开发应用。

  5. 安全性:Node.js在设计时就考虑了安全性问题,它采用了沙箱机制、模块化的设计和其他一些安全措施,可以有效地防止代码注入等攻击。

优缺点

优点缺点
高效性:使用Chrome V8引擎,采用事件驱动和非阻塞I/O的编程方式,能够充分利用CPU和内存资源,提高应用的性能和并发处理能力。不适合CPU密集型应用:由于Node.js采用单线程的方式,不适合CPU密集型应用,如图形处理、视频编码等,因为这些应用需要大量的CPU计算资源。
跨平台性:可以运行于多个操作系统平台,如Windows、Mac OS、Linux等。学习成本较高:Node.js使用JavaScript语言,对于初学者来说,需要学习JavaScript语言和异步编程模型等概念,需要一定的学习成本。
适合实时应用:适用于实时应用,如聊天室、在线游戏、在线视频等,因为它可以实现双向通信和事件驱动,从而实现实时性。不适合大规模应用:由于Node.js采用单线程的方式,不适合大规模应用,如高并发的电商网站、金融交易系统等,因为这些应用需要高并发和高可用性。
社区活跃:拥有一个庞大的开发者社区,提供了大量的开源模块和工具,并且不断地更新和改进,使得开发者能够更加便捷地开发应用。一些模块不稳定:由于Node.js是开源的,一些第三方模块可能存在不稳定的问题,需要开发者自行选择和测试。
安全性:在设计时就考虑了安全性问题,采用了沙箱机制、模块化的设计和其他一些安全措施,可以有效地防止代码注入等攻击。一些旧版本可能存在漏洞:由于Node.js的版本迭代较快,一些旧版本可能存在漏洞,需要开发者及时升级。
  • 不适合大规模应用

当应用程序需要处理大量并发请求时,Node.js的单线程模型可能会成为瓶颈,导致性能下降。在这种情况下,如果程序需要处理大量数据或者进行复杂的计算操作,那么Node.js的单线程模型可能无法满足需求,因为单个线程的处理能力是有限的。此外,如果应用程序需要处理海量数据,例如大规模的电商网站、金融交易系统等,Node.js的单线程模型也可能无法满足需求,因为这些应用需要高并发和高可用性。在这种情况下,通常采用多线程或者分布式架构来解决问题,而不是使用Node.js。

  • 是否就不适合做网站

不是的,Node.js在开发Web应用方面仍然非常适合。因为Web应用一般需要处理大量的I/O操作,例如读写数据库、处理HTTP请求等,这些操作都是异步的,适合Node.js的事件驱动和非阻塞I/O的编程方式。而且Node.js还提供了很多优秀的Web框架,例如Express、Koa等,可以帮助开发者快速地开发Web应用。但是对于大规模的Web应用,Node.js的单线程模型可能会成为瓶颈,需要采用其他的解决方案,例如使用负载均衡、多线程等技术。

应用场景

  1. 聊天应用程序:由于Node.js采用的是事件驱动和非阻塞I/O的编程方式,可以实现实时通信,因此非常适合开发实时聊天应用程序。

  2. 实时数据处理:例如监控和分析系统日志、实时统计用户行为、实时处理交易数据等,Node.js可以快速处理大量的I/O操作和数据流,并且提供了很多优秀的数据处理库,例如socket.io、RxJS等。

  3. 中间层应用程序:由于Node.js可以快速处理大量的I/O操作,可以用于开发中间层应用程序,例如API服务、Web代理、负载均衡等。

  4. 大规模的网络服务:由于Node.js可以提供高并发和高性能的I/O操作,并且可以充分利用系统的资源,可以用于构建大规模的网络服务,例如电商网站、社交网络、在线游戏等。

不适合场景举说明

node 在处理 CPU密集型任务时,通常是指需要大量使用CPU资源的任务,例如图像处理、视频编解码、加密解密、大数据处理、机器学习等。这些任务需要进行大量的计算和处理,占用CPU的时间较长,因此会导致Node.js单线程被占用,无法同时处理其他的请求,从而导致程序的性能下降。 举个例子,假设我们有一个Node.js应用程序,需要对大量的图像进行处理,例如调整大小、裁剪、添加水印等。如果我们使用Node.js的单线程模型来处理这些图像,可能会导致程序的响应时间变长,甚至会出现阻塞的情况。因为在处理图像的过程中,需要进行大量的计算和处理,占用CPU的时间很长,而Node.js的单线程会被占用,无法同时处理其他的请求,从而影响程序的性能和可靠性。

对比Python可以采用多线程或多进程模型,以充分利用多核CPU的性能,可以同时处理多个任务,从而提高程序的性能和可靠性。 对于处理图片大小和颜色的例子,Node.js需要按照顺序依次处理图片的大小和颜色,因为在单线程模型下只能处理一个任务。而Python可以使用多线程或多进程模型,同时处理图片的大小和颜色,并最后将它们合并起来。这样可以充分利用多核CPU的性能,提高程序的处理速度和稳定性。

浏览器和Node.js架构区别

  1. Chrome主要处理前端技术,如DOM、CSS、HTML等,Node.js主要处理后端技术,如I/O、文件系统、网络等。

  2. Node.js 不是浏览器,所以它不具有浏览器提供的 DOM API,比如 Window 对象、Location 对象、Document 对象、HTMLElement 对象、Cookie 对象等等。但是,Node.js 提供了自己特有的 API,比如全局的 global 对象,也提供了当前进程信息的 Process 对象,操作文件的 fs 模块,以及创建 Web 服务的 http 模块等等。这些 API 能够让我们使用 JavaScript 操作计算机,所以我们可以用 Node.js 平台开发 web 服务器。

  3. 二者都有 JavaScript 引擎的内置对象,这里对象是在所在的执行引擎提供的,这里目前说的是v8,例如内置对象 Boolean、Number、String、Object、Symbol、Function、Array、Regexp、Set、Map、Promise、Proxy,全局函数 eval、encodeURIComponent、decodeURIComponent等等,基本的常量 undefined、null、NaN、Infinity;

  • 虽然版本升级部分版本的node 也会支持一些浏览器特有的api,Fetch API 为例在nodeJs 18版本已经支持
特有API/模块名称浏览器Node.js
DOM✔️
Web Workers✔️
IndexedDB✔️
localStorage✔️
WebSocket✔️
Canvas✔️
XMLHttpRequest✔️
WebGL✔️
CSSOM✔️
Fetch API✔️
File API✔️
Service Workers✔️
Performance✔️
Node.js REPL✔️
fs✔️
http✔️
crypto✔️
os✔️
process✔️
child_process✔️
stream✔️

Node.js 的基本架构

medium.com

image.png 上图是 Node.js 的基本架构,我们可以看到,Node.js 是运行在操作系统之上的,它底层由 V8 JavaScript 引擎,以及一些 C/C++ 写的库构成,包括 libUV 库、c-ares、llhttp/http-parser、open-ssl、zlib 等等。

其中,libUV 负责处理事件循环,c-ares、llhttp/http-parser、open-ssl、zlib 等库提供 DNS 解析、HTTP 协议、HTTPS 和文件压缩等功能。

在这些模块的上一层是中间层,中间层包括Node.js BindingsNode.js Standard Library以及C/C++ AddOnsNode.js Bindings层的作用是将底层那些用 C/C++ 写的库接口暴露给 JS 环境,而Node.js Standard Library是 Node.js 本身的核心模块。至于C/C++ AddOns,它可以让用户自己的 C/C++ 模块通过桥接的方式提供给Node.js

中间层之上就是 Node.js 的 API 层了,我们使用 Node.js 开发应用,主要是使用 Node.js 的 API 层,所以 Node.js 的应用最终就运行在 Node.js 的 API 层之上。

Node.js 与 JavaScript 真要按分层 对比

趣学 Node.js

  • 最下面一层是脚本语言规范(Spec),由于我们讲的是 Node.js,所以这里最下层只写 ECMAScript。

  • 再往上一层就是对于该规范的实现了,如 JavaScript、JScript 以及 ActionScript 等都属于对 ECMAScript 的实现。

  • 然后就是执行引擎,JavaScript 常见的引擎有 V8、SpiderMonkey、QuickJS 等(其相关 Logo 如下图所示)。

  • 最上面就是运行时环境了,比如基于 V8 封装的运行时环境有 Chromium、Node.js、Deno、CloudFlare Workers 等等。而我们所说的 Node.js 就是在运行时环境这一层。

Node.js 一些模块

  • File System 模块:这是操作系统的目录和文件的模块,提供文件和目录的读、写、创建、删除、权限设置等等。

  • Net 模块:提供网络套接字 socket,用来创建 TCP 连接,TCP 连接可以用来访问后台数据库和其他持久化服务。

  • HTTP 模块:提供创建 HTTP 连接的能力,可以用来创建 Web 服务,也是 Node.js 在前端最常用的核心模块。

  • URL 模块:用来处理客户端请求的 URL 信息的辅助模块,可以解析 URL 字符串。

  • Path 模块:用来处理文件路径信息的辅助模块,可以解析文件路径的字符串。

  • Process 模块:用来获取进程信息。

  • Buffer 模块:用来处理二进制数据。

  • Console 模块:控制台模块,同浏览器的Console模块,用来输出信息到控制台。

  • Crypto 加密解密模块:用来处理需要用户授权的服务。

  • Events 模块:用来监听和派发用户事件。