From 8761b5774360c6d9bf31e77e4d0d2e8b8f91cab5 Mon Sep 17 00:00:00 2001 From: qianguyihao Date: Thu, 18 Jun 2020 14:35:38 +0800 Subject: [PATCH] =?UTF-8?q?update:=20Node.js=20=E7=A7=91=E6=99=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 10-Node.js和数据库/01-Node.js介绍.md | 225 ++++++++++-------- 10-Node.js和数据库/02-Node.js的特点.md | 21 +- .../05-Node.js内置模块:fs文件模块.md | 42 +++- 3 files changed, 183 insertions(+), 105 deletions(-) diff --git a/10-Node.js和数据库/01-Node.js介绍.md b/10-Node.js和数据库/01-Node.js介绍.md index 2b27c2c..043d6a4 100644 --- a/10-Node.js和数据库/01-Node.js介绍.md +++ b/10-Node.js和数据库/01-Node.js介绍.md @@ -8,13 +8,13 @@ Node 的重要性已经不言而喻,很多互联网公司都已经有大量的高性能系统运行在 Node 之上。Node 凭借其单线程、异步等举措实现了极高的性能基准。此外,目前最为流行的 Web 开发模式是前后端分离的形式,即前端开发者与后端开发者在自己喜欢的 IDE 上独立进行开发,然后通过 HTTP 或是 RPC 等方式实现数据与流程的交互。这种开发模式在 Node 的强大功能的引领下变得越来越高效,也越来越受到各个互联网公司的青睐。 -### 前端同学为什么要学习后台开发 +### 前端同学为什么要学习后端/后端同学为什么要学习前端 - 了解前后端交互流程。 -- 能够和后台开发的程序员更佳紧密地结合、更顺畅地沟通。 +- 前端同学能够和后台开发的程序员更佳紧密地结合、更顺畅地沟通。 -- 当网站的业务逻辑需要前置时,前端人员需要学习一些后台开发的技术,以完成相应的任务。 +- 当网站的业务逻辑需要前置时,前端人员需要学习一些后台开发的技术,以完成相应的任务;;反过来也一样。 - 拓宽知识视野和技术栈,能够站在全局的角度审视整个项目。 @@ -28,47 +28,42 @@ Node 的重要性已经不言而喻,很多互联网公司都已经有大量的 3、Node.js 性能高、生态系统活跃,提供了大量的开源库。 -4、Jeff Atwood 在 2007 年提出了著名的 Atwood 定律:**任何能够用 JavaScript 实现的应用系统,最终都必将用 JavaScript 实现**。如果你不知道 Jeff Atwood 是谁(他是 Stack Overflow 网站的创始人),这不重要,重要的是这条定律。 +4、Jeff Atwood 在 2007 年提出了著名的 Atwood 定律:**任何能够用 JavaScript 实现的应用系统,最终都必将用 JavaScript 实现**。 Jeff Atwood 是谁不重要(他是 Stack Overflow 网站的联合创始人),重要的是这条定律。 ### 后端同学为什么要学 Node.js 因为前端同学在学 Node.js。 -## Node.js 的介绍 +## 什么是 Node.js -### 什么是 Node.js +### 官方定义 -[Node.js](https://nodejs.org/zh-cn/) 是一个基于 **Chrome V8** 引擎的 JavaScript 运行环境。Node.js 使用了一个**事件驱动**、**非阻塞式 I/O**的模型( Node.js 的特性),使其轻量级又高效。Node.js 的包管理工具 npm 是全球最大的开源库生态系统。 +[Node.js](https://nodejs.org/zh-cn/) 是一个基于 **Chrome V8 引擎**的 JavaScript 运行环境。Node.js 使用了一个**事件驱动**、**非阻塞式 I/O**的模型,使其轻量又高效。Node.js 的包管理工具 npm 是全球最大的开源库生态系统。 -![](http://img.smyhvae.com/20180301_1540.png) +Node.js 不是一门语言,也不是 JavaScript 的框架,也不是像Nginx一样的Web服务器 ,**Node.js 是 JavaScript 在服务器端的运行环境(平台)**。 -如上图所示: - -- Node.js 不是一门语言,也不是 JavaScript 的框架,也不是像 **Node.js 是 JavaScript 在服务器端的运行环境(平台)**。 - -- Node.js 内部采用 Google Chrome 的 V8 引擎,作为 JavaScript 语言解释器;同时结合自行开发的 libuv 库,扩展了 JS 在后端的能力,使得 JS 既可以在前端进行 DOM 操作(浏览器端),又可以在后端调用操作系统资源(I/O 操作、文件读写、数据库操作等),是目前最简单的全栈式语言。 - -备注 1:[V8 引擎](https://v8.dev/) 本身是用 C++ 写的。 [libuv](https://zh.wikipedia.org/wiki/Libuv) 这个库本身也是用 C/C++ 写的。 - -备注 2:限制语言能力的不是语言本身,而是语言的生态。 ### Node.js 的组成 +在 Node.js 里运行 JavaScript,跟在 Chrome 里运行 JavaScript 有什么不同? + +二者采用的是同样的 JS 引擎。在 Node.js 里写 JS,和在前端写 JS,几乎没有不同。在写法上的区别在于:Node.js 没有浏览器、页面标签相关的 API,但是新增了一些 Node.js 相关的 API。通俗来说,对于开发者而言,在前端写 JS 是用于控制浏览器;而 Node.js 环境写 JS 可以控制整个计算机。 + 我们知道,JavaScript 的组成分为三个部分: - ECMAScript -- DOM +- DOM:标签元素相关的API -- BOM +- BOM:浏览器相关的API -ECMAScript 是 JS 的语法;DOM 和 BOM 浏览器运行环境为 JS 提供的 API。 +ECMAScript 是 JS 的语法;DOM 和 BOM 浏览器端为 JS 提供的 API。 而 Node.js 的组成分为: - **ECMAScript**。ECMAScript 的所有语法在 Node 环境中都可以使用。 -- **Node 环境**提供的一些**附加 API**(包括文件、网络、路径等等 API)。 +- **Node 环境**提供的一些**附加 API**(包括文件、网络等相关的 API)。 如下图所示: @@ -76,10 +71,47 @@ ECMAScript 是 JS 的语法;DOM 和 BOM 浏览器运行环境为 JS 提供的 ### 补充 +与 PHP、JSP、Python、Perl、Ruby 的“既是语言,也是平台”不同,Node.js 的使用 JavaScript 进行编程,运行在 Chrome 的 V8 引擎上。 + +与 PHP、JSP 等相比(PHP、JSP、.net 都需要运行在服务器程序上,Apache、Nginx、Tomcat、IIS。 +),Node.js 跳过了 Apache、Naginx、IIS 等 HTTP 服务器,它自己不用建设在任何服务器软件之上。Node.js 的许多设计理念与经典架构(LAMP = Linux + Apache + MySQL + PHP)有着很大的不同,可以提供强大的伸缩能力。Node.js 没有 web 容器。 + JS 语言非常灵活,使得它在严谨性方面不如 Java 等传统的静态语言。JS 是一门动态语言,而且融合了面向对象和函数式编程这两种编程范式。 随着 ES6、ES7 等 JS 语法规范的出现,以及浏览器对这些规范的支持,使得我们可以用更为现代化的 JS 语言特性,来编写现代化的应用。 +## Node.js 的架构和依赖 + +Node.js 的架构如下: + +![](http://img.smyhvae.com/20180301_1540.png) + +Node.js 内部采用 Google Chrome 的 V8 引擎,作为 JavaScript 语言解释器;同时结合自行开发的 libuv 库,**扩展了 JS 在后端的能力(比如 I/O 操作、文件读写、数据库操作等)**。使得 JS 既可以在前端进行 DOM 操作(浏览器前端),又可以在后端调用操作系统资源,是目前最简单的全栈式语言。 + +其次,Node 生态系统活跃,提供了大量的开源库,使得 JavaScript 语言能与操作系统进行更多的交互。 + +### Node.js 运行环境的核心:V8 引擎 和 libuv 库 + +Node.js 是 JavaScript 在服务器端的运行环境,在这个意义上,Node.js 的地位其实就是 JavaScript 在服务器端的虚拟机,类似于 Java 语言中的 Java 虚拟机。 + +- [V8 引擎](https://v8.dev/) :编译和执行 JS 代码、管理内存、垃圾回收。V8 给 JS 提供了运行环境,可以说是 JS 的虚拟机。V8 引擎本身是用 C++ 写的。 + +- [libuv](https://zh.wikipedia.org/wiki/Libuv): libuv 是一个专注于异步 I/O 的跨平台类库,目前主要在 Node.js 上使用。它是 Node.js 最初的作者 Ryan Dahl 为 Node.js 写的底层类库,也可以称之为虚拟机。libuv 本身是用 C 写的。 + +### Java 虚拟机和 V8 引擎,是由同一人开发 + +Chrome 浏览器成功的背后,离不开 JS 的 V8 引擎。作为虚拟机,V8 的性能表现优异,它的开发者是 Lars Bak。在 Lars 的工作履历里,绝大部分都是与虚拟机相关的工作。在开发 V8 之前,他曾经在 Sun 公司工作,担任 HotSpot 团队的技术领导,主要致力于开发高性能的 Java 虚拟机。在这之前,他也曾为 Self、Smalltalk 语言开发过高性能虚拟机。这些无与伦比的经历让 V8 一出世就超越了当时所有的 JS 虚拟机。 + +![](http://img.smyhvae.com/20200617_1120.png) + +V8 的性能优势使得用 JavaScript 写高性能后台服务程序成为可能。在这样的契机下,Ryan Dahl 选择了 JavaScript,选择了 V8,在事件驱动、非阻塞 I/O 模型的设计下实现了 Node。 + +### V8 的内存限制 + +在一般的后端开发语言中,在基本的内存使用上没有什么限制,然而在 Node 中通过 JavaScript 使用内存时就会发现只能使用部分内存(64 位系统下约为 1.4GB,32 位系统下约为 0.7GB)。在这样的限制下,将会导致 Node 无法直接操作大内存对象。 + +造成这个问题的主要原因在于 Node 基于 V8 构建,所以在 Node 中使用的 JavaScript 对象基本上都是通过 V8 自己的方式来进行分配和管理的。V8 的这套内存管理机制在浏览器的应用场景下使用起来绰绰有余,足以胜任前端页面中的所有需求。但在 Node 中,这却限制了开发者随心所欲使用大内存的想法。 + ## Node 的发展历史 - 2008 年左右,随着 Ajax 的逐渐普及,Web 开发逐渐走向复杂化,系统化; @@ -98,59 +130,101 @@ JS 语言非常灵活,使得它在严谨性方面不如 Java 等传统的静 ## Node.js 的应用 -Node.js 拥有强大的开发者社区,现在已经发展出比较成熟的技术体系,以及庞大的生态。它被广泛地应用在 Web 服务、开发工作流、客户端应用等诸多领域。其中,在 Web 服务领域,业界对 Node.js 的接受程度最高。 +Node.js 拥有强大的开发者社区,现在已经发展出比较成熟的技术体系,以及庞大的生态。它被广泛地应用在 Web 服务、开发工作流、客户端应用等诸多领域。其中,在 **Web 服务**领域,业界对 Node.js 的接受程度最高。 -### Node.js 的用途 +### 1、BFF 中间层 -**1、中间层**。 +BFF,即 Backend For Frontend(服务于前端的后端)。玉伯在《[从前端技术进化到体验科技](https://mp.weixin.qq.com/s/IYddaaw2ps1wR2VT1dZWPg)》这篇文章中点出了 BFF 层的概念: -前端访问中间层的接口,中间层再访问后台的 Java/C++ 服务。这类服务的特点是不需要太强的服务器运算能力,但对程序的灵活性有较高的要求。 +> BFF 模式下,整体分工很清晰,**后端通过 Java/C++ 等语言负责服务实现,理想情况下给前端提供的是基于领域模型的 RPC 接口,前端则在 BFF 层直接调用服务端 RPC 接口拿到数据**,按需加工消费数据,并实现人机交互。基于 BFF 模式的研发,很适合拥有前端技术背景的全栈型工程师。这种模式的好处很明显,后端可以专注于业务领域,更多从领域模型的视角去思考问题,页面视角的数据则交给前端型全栈工程师去搞定。**领域模型与页面数据是两种思维模式,通过 BFF 可以很好地解耦开,让彼此更专业高效**。 -这样做的好处是:安全性(不会把主服务器暴露在外面)、提高性能(做缓存等)、降低主服务器的复杂度。 +在 Web 服务里,搭建一个中间层,前端访问中间层的接口,中间层再访问后台的 Java/C++ 服务。这类服务的特点是不需要太强的服务器运算能力,但对程序的灵活性有较高的要求。这两个特点,正好和 Node.js 的优势相吻合。Node.js 非常适合用来做 BFF 层,优势如下: + +- 对于前端来说:让前端**有能力自由组装后台数据**,这样可以减少大量的业务沟通成本,加快业务的迭代速度;并且,前端同学能够**自主决定**与后台的通讯方式。 + +- 对于后台和运维来说,好处是:安全性(不会把主服务器暴露在外面)、降低主服务器的复杂度等。 + +### 2、服务端渲染 + +**客户端渲染**(CSR / Client side render):前端通过一大堆接口请求数据,然后通过 JS 动态处理和生成页面结构和展示。优点是**前后端分离**、减小服务器压力、局部刷新。缺点是不利于 SEO(如果你的页面然后通过 Ajax 异步获取内容,抓取工具并不会等待异步完成后再行抓取页面内容)、首屏渲染慢。 + +**服务端渲染**(SSR / Server Side Render):服务器返回的不是接口数据,而是一整个页面(或整个楼层)的 HTML 字符串,浏览器直接显示即可。也就是说,在服务器端直接就渲染好了,然后一次性打包返回给前端。优点是**有利于 SEO、首屏渲染很快**。 + +**总结: 搜索引擎优化 + 首屏速度优化 = 服务端渲染**。 + +备注:这里的「服务端渲染」只是让 Node.js 做中间层,不会替代后端的,后台同学请放心。 + +参考链接: + +- [Vue 服务端渲染的概念](https://ssr.vuejs.org/zh/) + +- + +- + +- [方应杭](https://www.zhihu.com/question/59578433/answer/326694511) + +历史回顾: + +(1)一开始,页面很简单,html 是后端渲染的(比如PHP、ASP、JSP等方式)。后端发现页面中的 js 好麻烦(虽然简单,但是坑多),于是让公司招聘专门写 js 的人,简称「前端切图仔」。 + +(2)随着 Node.js 和前端 MVC 的兴起,以及前端越来越复杂,慢慢演变成了「前后端分离」。 + +(3)前端的 SPA 应用流行之后,发现 SEO 问题很大,而且首屏渲染速度很慢,但是自己选的路再难走也要走下去,于是用 Node.js 在服务端渲染被看成是一条出路。 + +(4)以前在一起的时候,是后端做部分前端的工作;现在在一起的时候,是前端做部分后端的工作。 + +### 3、做小型服务、小型网站的后端(基于 Express、Koa 框架) + +现在很多公司的后台管理系统,都是用 Node.js 来开发接口,毕竟,后台管理系统对性能和并发的要求不是太高。有了 Node.js 之后,通过 JS 直接操作 DB,做增删改查,生成接口,极大降低了前端同学的学习门槛。 当然,有时候做 Node.js 开发,是因为:后台人力不够,所以把后台开发的一部分工作量,转移给前端同学。 -**2、做小型服务、小型网站的后端**(比如后台管理系统)。 +### 4、做项目构建工具 -现在很多公司的后台管理系统,都是用 Node.js来开发接口,直接操作 DB。 +前端正在广泛使用的构建工具 gulp、Webpack,就是基于 Node.js 来实现的。 -不过,短期来看,Node.js 很难像 Java/C++ 那样,成为后台的主力开发语言。这并非是因为 Node.js 的性能问题(实际上,Node.js 的性能还不错),主要是因为,Node.js 还比较年轻,框架的支持度不够,很难独立成为后台开发语言;但未来可期。 +### 5、 做 PC 端的软件(基于 Electron 框架) -**3、做公司内部工具、项目构建工具**。 +Electron 框架就是基于 Node.js 的。也可以说:Electron 是 Node.js 在PC客户端的技术。 +有一点你可能会感到惊讶:程序员们都在用的代码编辑器 VS Code 软件, 就是用 JS 语言实现的。 - -### Node.js 的主要应用领域 - -- RESTFul API - -- 实时通信:如消息推送等 - -- 高并发 - -- I/O 阻塞 +还有一个例子是:电子游戏直播网站 [Twitch](https://www.twitch.tv/),号称是国外游戏直播的鼻祖,它在 PC 端的客户端软件,就是用 Electron 框架的。你会发现,Twitch 的网站视觉,和 PC 端的视觉,几乎是一样的。如果两端都采用 JS 语言,就可以极大的复用现有的工程。 ### 知名度较高的 Node.js 开源项目 ![](http://img.smyhvae.com/20180301_2009.png) -- express:Node.js 中著名的 web 服务器框架。 +- express:Node.js 中著名的 web 服务框架。 -- Koa:下一代的 Node.js 的 Web 框架。 +- Koa:下一代的 Node.js 的 Web 服务框架。所谓的“下一代”是相对于 Express 而言的。 -- mocha:功能强大的 node.js 测试框架。 +- [Egg](https://eggjs.org/zh-cn/):2016 年,阿里巴巴研发了知名的 Egg.js 开源项目,号称企业级 Web 服务框架。Egg.js 是基于 Koa 开发的。 -- PM2:node 本来是单进程的,PM2 可以实现和管理多进程。 +* mocha:是现在最流行的 JavaScript 测试框架,在浏览器和 Node 环境都可以使用。 -- jade:非常优秀的模板引擎,不仅限于 js 语言。 +* PM2:node 多进程管理。 -- CoffeeScript:用简洁的方式展示 JavaScript 优秀的部分。 +* jade:非常优秀的模板引擎,不仅限于 js 语言。 -- Atom:文本编辑器。 +* CoffeeScript:用简洁的方式展示 JavaScript 优秀的部分。 -- socket.io:实时通信框架。 +* Atom:编辑器。 -## 前端同学会 Node.js 就真的全栈了吗? +* VS Code:最酷炫的编辑器。 + +* socket.io:实时通信框架。 + +### 总结 + +或许,能用 Node.js 做的后台应用,Java/C++ 也能做;但是 Node.js 可以让我们多一种选择。 + +短期来看,Node.js 很难像 Java/C++ 那样,成为后台的主力开发语言。这并非是因为 Node.js 的性能问题,主要是因为,Node.js 还比较年轻,经验积累太少,框架的支持度不够。搞企业级服务,Node.js 敌不过 Java/C++,所以目前只能搞「轻量级」;但未来可期。 + +限制语言能力的不是语言本身,而是生态。 + +## 最后一段:前端同学会 Node.js 就真的全栈了吗? 一个人的精力是有限的,既擅长前端、又精通后端的人,毕竟是极少数。 @@ -162,58 +236,7 @@ Node.js 拥有强大的开发者社区,现在已经发展出比较成熟的技 对于个人而言,虽然全栈很难,但是 Node.js 的出现,**让 JS 语言实现了前后端语法的统一,让 JS 语言的技术栈更佳全面**。 -涉及到后台开发相关的技术,无论如何,也绕不开**框架设计、开发调试、数据库操作、高并发处理、大规模存储、性能优化、容灾方案、操作系统调度、甚至是 Linux 内核、驱动开发**等过硬的知识技能和经验积累。等你亲身经历过这些,才算明白:语言只是一种工具。 - -## V8 引擎 - -### 运行环境(平台)的含义 - -首先,JavaScript 语言通过 Node 在服务器上运行,在这个意义上,Node.js 的地位相当于 JavaScript 在服务器端的虚拟机,类似于 Java 语言中的 Java 虚拟机。 - -其次,Node 生态系统活跃,提供了大量的开源库,使得 JavaScript 语言能与操作系统进行交互,在这个层次上,Node 又是属于 JavaScript 的工具库。 - -**补充**: - -与 PHP、JSP、Python、Perl、Ruby 的“既是语言,也是平台”不同,Node.js 的使用 JavaScript 进行编程,运行在 Chrome 的 V8 引擎上。 - -与 PHP、JSP 等相比(PHP、JSP、.net 都需要运行在服务器程序上,Apache、Nginx、Tomcat、IIS。 -),Node.js 跳过了 Apache、Naginx、IIS 等 HTTP 服务器,它自己不用建设在任何服务器软件之上。Node.js 的许多设计理念与经典架构(LAMP = Linux + Apache + MySQL + PHP)有着很大的不同,可以提供强大的伸缩能力。Node.js 没有 web 容器。 - -### V8 和 Node - -Chrome 浏览器成功的背后,离不开 JS 的 V8 引擎。作为虚拟机,V8 的性能表现优异,它的开发者是 Lars Bak。在 Lars 的工作履历里,绝大部分都是与虚拟机相关的工作。在开发 V8 之前,他曾经在 Sun 公司工作,担任 HotSpot 团队的技术领导,主要致力于开发高性能的 Java 虚拟机。在这之前,他也曾为 Self、Smalltalk 语言开发过高性能虚拟机。这些无与伦比的经历让 V8 一出世就超越了当时所有的 JS 虚拟机。 - -![](http://img.smyhvae.com/20200617_1120.png) - -V8 的性能优势使得用 JavaScript 写高性能后台服务程序成为可能。在这样的契机下,Ryan Dahl 选择了 JavaScript,选择了 V8,在事件驱动、非阻塞 I/O 模型的设计下实现了 Node。 - -### V8 的内存限制 - -在一般的后端开发语言中,在基本的内存使用上没有什么限制,然而在 Node 中通过 JavaScript 使用内存时就会发现只能使用部分内存(64 位系统下约为 1.4GB,32 位系统下约为 0.7GB)。在这样的限制下,将会导致 Node 无法直接操作大内存对象。 - -造成这个问题的主要原因在于 Node 基于 V8 构建,所以在 Node 中使用的 JavaScript 对象基本上都是通过 V8 自己的方式来进行分配和管理的。V8 的这套内存管理机制在浏览器的应用场景下使用起来绰绰有余,足以胜任前端页面中的所有需求。但在 Node 中,这却限制了开发者随心所欲使用大内存的想法。 - -## Node.js 的特点 - -- 异步、非阻塞 IO 模型 - -- 事件循环 - -- 单线程 - -- 总结:轻量和高效 - -Node.js 的性能和效率非常高。 - -传统的 Java 语言是一个请求开启一个线程,当请求处理完毕后就关闭这个线程。而 Node.js 则完全没有采用这种模型,它本质上就是一个单线程。 - -你可能会疑问:一个线程如何服务于大量的请求、如何处理高并发的呢?这是因为,Node.js 采用的是异步的、非阻塞的模型。 - -这里所谓的“单线程”,指的是 Node 的主线程只有一个。为了确保主线程不被阻塞,主线程是用于接收客户端请求。但不会处理具体的任务。而 Node 的背后还有一个线程池,线程池会处理长时间运行的任务(比如 IO 操作、网络操作)。线程池里的任务是通过队列和事件循环的机制来执行。 - -## SSR 服务端渲染 - -提高搜索引擎抓取网页的 +涉及到后台开发相关的技术,无论如何,也绕不开**框架设计、开发调试、数据库操作、高并发处理、大规模存储、性能优化、容灾方案、RPC 调用、进程管理、操作系统调度、网络安全、系统运维、日常维护、甚至是 Linux 内核、驱动开发**等过硬的知识技能和经验积累。等你亲身经历过这些,才算明白:语言只是一种工具。 ## 我的公众号 diff --git a/10-Node.js和数据库/02-Node.js的特点.md b/10-Node.js和数据库/02-Node.js的特点.md index 2d27df6..785312d 100644 --- a/10-Node.js和数据库/02-Node.js的特点.md +++ b/10-Node.js和数据库/02-Node.js的特点.md @@ -1,5 +1,24 @@ -### 使用 Node.js 时的劣势 +## Node.js 的特点 + +- 异步、非阻塞 IO 模型 + +- 事件循环 + +- 单线程 + +- 总结:轻量和高效 + +Node.js 的性能和效率非常高。 + +传统的 Java 语言是一个请求开启一个线程,当请求处理完毕后就关闭这个线程。而 Node.js 则完全没有采用这种模型,它本质上就是一个单线程。 + +你可能会疑问:一个线程如何服务于大量的请求、如何处理高并发的呢?这是因为,Node.js 采用的是异步的、非阻塞的模型。 + +这里所谓的“单线程”,指的是 Node 的主线程只有一个。为了确保主线程不被阻塞,主线程是用于接收客户端请求。但不会处理具体的任务。而 Node 的背后还有一个线程池,线程池会处理长时间运行的任务(比如 IO 操作、网络操作)。线程池里的任务是通过队列和事件循环的机制来执行。 + + +## 使用 Node.js 时的劣势 - 程序运行不稳定,可能会出现服务不可用的情况 diff --git a/10-Node.js和数据库/05-Node.js内置模块:fs文件模块.md b/10-Node.js和数据库/05-Node.js内置模块:fs文件模块.md index d16570f..496fb9c 100644 --- a/10-Node.js和数据库/05-Node.js内置模块:fs文件模块.md +++ b/10-Node.js和数据库/05-Node.js内置模块:fs文件模块.md @@ -1,10 +1,13 @@ -## Node.js 的API文档 +## Node.js 的官方API文档 -Node.js 的API文档(英文): -Node.js 的API文档(中文): +- Node.js 的API文档(英文): + +- Node.js 的API文档(中文): + +关于 Node.js 的内置模块和常见API,可以看官方文档。 查阅文档时,稳定指数如下: @@ -41,6 +44,39 @@ console.log(path.resolve('../')); require方法用于加载模块。 +常见的内置模块包括: + +- FS:文件系统模块 + +- path:路径模块 + +- OS:操作系统相关 + +- net:网络相关 + +- http + +- ... + +你可能会有疑问:Node.js 这么牛吗?还能直接和操作系统做交互? + +带着这个疑问,我们不妨简单看看 Node.js 的源码,以 os 模块举例: + +- 打开os模块的源码:,翻到最底部,找到 `cpus`这个方法 + +- 进而找到 `getCPUs()` + +- internalBinding('os'):通过 internalBinding 可以调用系统底层的方法。internalBinding 主要是 JS 虚拟机在做的事情。 + +- `internalBinding('os')` 的实现,在 里,里面都是 C++ 的代码。比如有一个`getCPUs`方法。 + +现在你知道了,JS本身是没有能力获取底层系统资源的,这一切都是 JS虚拟机在和底层做交互,然后通过 JS 的表现形式,暴露给应用层。 + +另外,还有很多库,是直接使用C/++编写的,通过编译之后,再提供给 JS 应用层调用,或者直接提供给 Node.js层使用。 + +**所有的编程语言底层都会回归C/C++**,甚至是汇编语言。 + + ### 2、require 加载第三方包的机制 ```js