>[success] # 什么是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`代码
![](https://img.kancloud.cn/52/cc/52cc3eec94cc2666420809477e3fb68b_658x416.png)
>[danger] ##### 使用场景
1. **Web应用程序**:Node.js可以用于搭建Web应用程序,如博客、在线商城、社交平台等,它可以快速响应客户端的请求,并且可以通过模块化的设计和丰富的模块库,方便地开发出高效、可维护的应用程序。
2. **实时应用程序**:Node.js适用于实时应用程序,如聊天室、在线游戏、在线视频等,因为它可以实现双向通信和事件驱动,从而实现实时性。
3. **命令行工具**:Node.js可以用于开发命令行工具,如代码打包工具、自动化工具等,它可以方便地进行文件读写、网络请求等操作。
4. **IoT应用程序**:Node.js可以用于开发物联网应用程序,如智能家居、智能健康等,因为它可以方便地进行数据采集、处理和通信。
5. **API服务**:Node.js可以用于开发API服务,如RESTful API服务、GraphQL服务等,它可以方便地进行数据处理和通信。
>[danger] ##### 特点
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在设计时就考虑了安全性问题,它采用了沙箱机制、模块化的设计和其他一些安全措施,可以有效地防止代码注入等攻击。
>[danger] ##### 优缺点
| 优点 | 缺点 |
| --- | --- |
| 高效性:使用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的单线程模型可能会成为瓶颈,需要采用其他的解决方案,例如使用负载均衡、多线程等技术。
>[danger] ##### 应用场景
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操作,并且可以充分利用系统的资源,可以用于构建大规模的网络服务,例如电商网站、社交网络、在线游戏等。
>[danger] ##### 不适合场景举说明
`node `在处理 CPU密集型任务时,通常是指**需要大量使用CPU资源的任务**,例如图**像处理、视频编解码、加密解密、大数据处理、机器学习**等。这些任务需要进行大量的计算和处理,占用CPU的时间较长,因此会导致Node.js单线程被占用,无法同时处理其他的请求,从而导致程序的性能下降。 举个例子,假设我们有一个Node.js应用程序,需要对大量的图像进行处理,例如调整大小、裁剪、添加水印等。如果我们使用Node.js的单线程模型来处理这些图像,可能会导致程序的响应时间变长,甚至会出现阻塞的情况。因为在处理图像的过程中,需要进行大量的计算和处理,占用CPU的时间很长,而Node.js的单线程会被占用,无法同时处理其他的请求,从而影响程序的性能和可靠性。
**对比`Python`可以采用多线程或多进程模型**,以充分利用多核CPU的性能,可以同时处理多个任务,从而提高程序的性能和可靠性。 对于处理图片大小和颜色的例子,Node.js需要按照顺序依次处理图片的大小和颜色,因为在单线程模型下只能处理一个任务。而Python可以使用多线程或多进程模型,同时处理图片的大小和颜色,并最后将它们合并起来。这样可以充分利用多核CPU的性能,提高程序的处理速度和稳定性。
>[danger] ##### 浏览器和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` | ❌ | ✔️ |
>[danger] ##### Node.js 的基本架构
[medium.com](https://link.juejin.cn/?target=https%3A%2F%2Fmedium.com%2F%40chathuranga94%2Fnodejs-architecture-concurrency-model-f71da5f53d1d "https://medium.com/@chathuranga94/nodejs-architecture-concurrency-model-f71da5f53d1d")
![](https://img.kancloud.cn/b9/1b/b91bfda6393637325bebf89cf5178282_719x465.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 Bindings`、`Node.js Standard Library`以及`C/C++ AddOns`。`Node.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 层之上。
>[danger] ##### Node.js 与 JavaScript 真要按分层 对比
[趣学 Node.js](https://juejin.cn/book/7196627546253819916/section/7195089399787290635)
![](https://img.kancloud.cn/30/e8/30e8dc20523a7d14e664177ef4ae5222_1440x185.png)
* 最下面一层是**脚本语言规范(Spec)**,由于我们讲的是 Node.js,所以这里最下层只写 ECMAScript。
* 再往上一层就是**对于该规范的实现**了,如 JavaScript、JScript 以及 ActionScript 等都属于对 ECMAScript 的实现。
* 然后就是**执行引擎**,JavaScript 常见的引擎有 V8、SpiderMonkey、QuickJS 等(其相关 Logo 如下图所示)。
* 最上面就是**运行时环境**了,比如基于 V8 封装的运行时环境有 Chromium、Node.js、Deno、CloudFlare Workers 等等。而我们所说的 Node.js 就是在运行时环境这一层。
>[danger] ##### Node.js 一些模块
* File System 模块:这是操作系统的目录和文件的模块,提供文件和目录的读、写、创建、删除、权限设置等等。
* Net 模块:提供网络套接字 socket,用来创建 TCP 连接,TCP 连接可以用来访问后台数据库和其他持久化服务。
* HTTP 模块:提供创建 HTTP 连接的能力,可以用来创建 Web 服务,也是 Node.js 在前端最常用的核心模块。
* URL 模块:用来处理客户端请求的 URL 信息的辅助模块,可以解析 URL 字符串。
* Path 模块:用来处理文件路径信息的辅助模块,可以解析文件路径的字符串。
* Process 模块:用来获取进程信息。
* Buffer 模块:用来处理二进制数据。
* Console 模块:控制台模块,同浏览器的Console模块,用来输出信息到控制台。
* Crypto 加密解密模块:用来处理需要用户授权的服务。
* Events 模块:用来监听和派发用户事件。
- 基础
- 什么是Node.js
- 理解 I/O 模型
- 理解node 中 I/O
- 对比node 和java 使用场景
- node 模块管理
- 内置模块 -- buffer
- 内置模块 -- fs
- fs -- 文件描述符
- fs -- 打开文件 api
- fs -- 文件读取 api
- fs -- 文件写入 api
- fs -- 创建目录 api
- fs -- 读取文件目录结构 api
- fs -- 文件状态(信息) api
- fs -- 删除文件/目录 api
- fs -- 重命名 api
- fs -- 复制文件 api
- 内置模块 -- events
- 内置模块 -- stream
- 可读流 -- Readable
- 可写流 -- Writable
- Duplex
- Transform
- 内置模块 -- http
- http -- 从客户端发起
- http -- 从服务端发起
- 内置模块 -- url
- 网络开发