update: Node.js 科普
This commit is contained in:
parent
a3e08516f6
commit
8761b57743
@ -8,13 +8,13 @@
|
|||||||
|
|
||||||
Node 的重要性已经不言而喻,很多互联网公司都已经有大量的高性能系统运行在 Node 之上。Node 凭借其单线程、异步等举措实现了极高的性能基准。此外,目前最为流行的 Web 开发模式是前后端分离的形式,即前端开发者与后端开发者在自己喜欢的 IDE 上独立进行开发,然后通过 HTTP 或是 RPC 等方式实现数据与流程的交互。这种开发模式在 Node 的强大功能的引领下变得越来越高效,也越来越受到各个互联网公司的青睐。
|
Node 的重要性已经不言而喻,很多互联网公司都已经有大量的高性能系统运行在 Node 之上。Node 凭借其单线程、异步等举措实现了极高的性能基准。此外,目前最为流行的 Web 开发模式是前后端分离的形式,即前端开发者与后端开发者在自己喜欢的 IDE 上独立进行开发,然后通过 HTTP 或是 RPC 等方式实现数据与流程的交互。这种开发模式在 Node 的强大功能的引领下变得越来越高效,也越来越受到各个互联网公司的青睐。
|
||||||
|
|
||||||
### 前端同学为什么要学习后台开发
|
### 前端同学为什么要学习后端/后端同学为什么要学习前端
|
||||||
|
|
||||||
- 了解前后端交互流程。
|
- 了解前后端交互流程。
|
||||||
|
|
||||||
- 能够和后台开发的程序员更佳紧密地结合、更顺畅地沟通。
|
- 前端同学能够和后台开发的程序员更佳紧密地结合、更顺畅地沟通。
|
||||||
|
|
||||||
- 当网站的业务逻辑需要前置时,前端人员需要学习一些后台开发的技术,以完成相应的任务。
|
- 当网站的业务逻辑需要前置时,前端人员需要学习一些后台开发的技术,以完成相应的任务;;反过来也一样。
|
||||||
|
|
||||||
- 拓宽知识视野和技术栈,能够站在全局的角度审视整个项目。
|
- 拓宽知识视野和技术栈,能够站在全局的角度审视整个项目。
|
||||||
|
|
||||||
@ -28,47 +28,42 @@ Node 的重要性已经不言而喻,很多互联网公司都已经有大量的
|
|||||||
|
|
||||||
3、Node.js 性能高、生态系统活跃,提供了大量的开源库。
|
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
|
||||||
|
|
||||||
### 什么是 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 的组成
|
||||||
|
|
||||||
|
在 Node.js 里运行 JavaScript,跟在 Chrome 里运行 JavaScript 有什么不同?
|
||||||
|
|
||||||
|
二者采用的是同样的 JS 引擎。在 Node.js 里写 JS,和在前端写 JS,几乎没有不同。在写法上的区别在于:Node.js 没有浏览器、页面标签相关的 API,但是新增了一些 Node.js 相关的 API。通俗来说,对于开发者而言,在前端写 JS 是用于控制浏览器;而 Node.js 环境写 JS 可以控制整个计算机。
|
||||||
|
|
||||||
我们知道,JavaScript 的组成分为三个部分:
|
我们知道,JavaScript 的组成分为三个部分:
|
||||||
|
|
||||||
- ECMAScript
|
- ECMAScript
|
||||||
|
|
||||||
- DOM
|
- DOM:标签元素相关的API
|
||||||
|
|
||||||
- BOM
|
- BOM:浏览器相关的API
|
||||||
|
|
||||||
ECMAScript 是 JS 的语法;DOM 和 BOM 浏览器运行环境为 JS 提供的 API。
|
ECMAScript 是 JS 的语法;DOM 和 BOM 浏览器端为 JS 提供的 API。
|
||||||
|
|
||||||
而 Node.js 的组成分为:
|
而 Node.js 的组成分为:
|
||||||
|
|
||||||
- **ECMAScript**。ECMAScript 的所有语法在 Node 环境中都可以使用。
|
- **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 是一门动态语言,而且融合了面向对象和函数式编程这两种编程范式。
|
JS 语言非常灵活,使得它在严谨性方面不如 Java 等传统的静态语言。JS 是一门动态语言,而且融合了面向对象和函数式编程这两种编程范式。
|
||||||
|
|
||||||
随着 ES6、ES7 等 JS 语法规范的出现,以及浏览器对这些规范的支持,使得我们可以用更为现代化的 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 的发展历史
|
## Node 的发展历史
|
||||||
|
|
||||||
- 2008 年左右,随着 Ajax 的逐渐普及,Web 开发逐渐走向复杂化,系统化;
|
- 2008 年左右,随着 Ajax 的逐渐普及,Web 开发逐渐走向复杂化,系统化;
|
||||||
@ -98,59 +130,101 @@ JS 语言非常灵活,使得它在严谨性方面不如 Java 等传统的静
|
|||||||
|
|
||||||
## Node.js 的应用
|
## 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://blog.csdn.net/u012036171/article/details/88833200>
|
||||||
|
|
||||||
|
- <https://juejin.im/post/5c068fd8f265da61524d2abc>
|
||||||
|
|
||||||
|
- [方应杭](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 开发,是因为:后台人力不够,所以把后台开发的一部分工作量,转移给前端同学。
|
当然,有时候做 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 语言实现的。
|
||||||
|
|
||||||
|
还有一个例子是:电子游戏直播网站 [Twitch](https://www.twitch.tv/),号称是国外游戏直播的鼻祖,它在 PC 端的客户端软件,就是用 Electron 框架的。你会发现,Twitch 的网站视觉,和 PC 端的视觉,几乎是一样的。如果两端都采用 JS 语言,就可以极大的复用现有的工程。
|
||||||
### Node.js 的主要应用领域
|
|
||||||
|
|
||||||
- RESTFul API
|
|
||||||
|
|
||||||
- 实时通信:如消息推送等
|
|
||||||
|
|
||||||
- 高并发
|
|
||||||
|
|
||||||
- I/O 阻塞
|
|
||||||
|
|
||||||
### 知名度较高的 Node.js 开源项目
|
### 知名度较高的 Node.js 开源项目
|
||||||
|
|
||||||
![](http://img.smyhvae.com/20180301_2009.png)
|
![](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 语言的技术栈更佳全面**。
|
对于个人而言,虽然全栈很难,但是 Node.js 的出现,**让 JS 语言实现了前后端语法的统一,让 JS 语言的技术栈更佳全面**。
|
||||||
|
|
||||||
涉及到后台开发相关的技术,无论如何,也绕不开**框架设计、开发调试、数据库操作、高并发处理、大规模存储、性能优化、容灾方案、操作系统调度、甚至是 Linux 内核、驱动开发**等过硬的知识技能和经验积累。等你亲身经历过这些,才算明白:语言只是一种工具。
|
涉及到后台开发相关的技术,无论如何,也绕不开**框架设计、开发调试、数据库操作、高并发处理、大规模存储、性能优化、容灾方案、RPC 调用、进程管理、操作系统调度、网络安全、系统运维、日常维护、甚至是 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 服务端渲染
|
|
||||||
|
|
||||||
提高搜索引擎抓取网页的
|
|
||||||
|
|
||||||
## 我的公众号
|
## 我的公众号
|
||||||
|
|
||||||
|
@ -1,5 +1,24 @@
|
|||||||
|
|
||||||
### 使用 Node.js 时的劣势
|
## Node.js 的特点
|
||||||
|
|
||||||
|
- 异步、非阻塞 IO 模型
|
||||||
|
|
||||||
|
- 事件循环
|
||||||
|
|
||||||
|
- 单线程
|
||||||
|
|
||||||
|
- 总结:轻量和高效
|
||||||
|
|
||||||
|
Node.js 的性能和效率非常高。
|
||||||
|
|
||||||
|
传统的 Java 语言是一个请求开启一个线程,当请求处理完毕后就关闭这个线程。而 Node.js 则完全没有采用这种模型,它本质上就是一个单线程。
|
||||||
|
|
||||||
|
你可能会疑问:一个线程如何服务于大量的请求、如何处理高并发的呢?这是因为,Node.js 采用的是异步的、非阻塞的模型。
|
||||||
|
|
||||||
|
这里所谓的“单线程”,指的是 Node 的主线程只有一个。为了确保主线程不被阻塞,主线程是用于接收客户端请求。但不会处理具体的任务。而 Node 的背后还有一个线程池,线程池会处理长时间运行的任务(比如 IO 操作、网络操作)。线程池里的任务是通过队列和事件循环的机制来执行。
|
||||||
|
|
||||||
|
|
||||||
|
## 使用 Node.js 时的劣势
|
||||||
|
|
||||||
- 程序运行不稳定,可能会出现服务不可用的情况
|
- 程序运行不稳定,可能会出现服务不可用的情况
|
||||||
|
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
|
|
||||||
|
|
||||||
## Node.js 的API文档
|
## Node.js 的官方API文档
|
||||||
|
|
||||||
Node.js 的API文档(英文): <https://nodejs.org/docs/latest-v8.x/api/index.html>
|
|
||||||
|
|
||||||
Node.js 的API文档(中文):<http://nodejs.cn/api/>
|
- Node.js 的API文档(英文): <https://nodejs.org/docs/latest-v8.x/api/index.html>
|
||||||
|
|
||||||
|
- Node.js 的API文档(中文):<http://nodejs.cn/api/>
|
||||||
|
|
||||||
|
关于 Node.js 的内置模块和常见API,可以看官方文档。
|
||||||
|
|
||||||
|
|
||||||
查阅文档时,稳定指数如下:
|
查阅文档时,稳定指数如下:
|
||||||
@ -41,6 +44,39 @@ console.log(path.resolve('../'));
|
|||||||
|
|
||||||
require方法用于加载模块。
|
require方法用于加载模块。
|
||||||
|
|
||||||
|
常见的内置模块包括:
|
||||||
|
|
||||||
|
- FS:文件系统模块
|
||||||
|
|
||||||
|
- path:路径模块
|
||||||
|
|
||||||
|
- OS:操作系统相关
|
||||||
|
|
||||||
|
- net:网络相关
|
||||||
|
|
||||||
|
- http
|
||||||
|
|
||||||
|
- ...
|
||||||
|
|
||||||
|
你可能会有疑问:Node.js 这么牛吗?还能直接和操作系统做交互?
|
||||||
|
|
||||||
|
带着这个疑问,我们不妨简单看看 Node.js 的源码,以 os 模块举例:
|
||||||
|
|
||||||
|
- 打开os模块的源码:<https://github.com/nodejs/node/blob/master/lib/os.js>,翻到最底部,找到 `cpus`这个方法
|
||||||
|
|
||||||
|
- 进而找到 `getCPUs()`
|
||||||
|
|
||||||
|
- internalBinding('os'):通过 internalBinding 可以调用系统底层的方法。internalBinding 主要是 JS 虚拟机在做的事情。
|
||||||
|
|
||||||
|
- `internalBinding('os')` 的实现,在 <https://github.com/nodejs/node/blob/master/src/node_os.cc> 里,里面都是 C++ 的代码。比如有一个`getCPUs`方法。
|
||||||
|
|
||||||
|
现在你知道了,JS本身是没有能力获取底层系统资源的,这一切都是 JS虚拟机在和底层做交互,然后通过 JS 的表现形式,暴露给应用层。
|
||||||
|
|
||||||
|
另外,还有很多库,是直接使用C/++编写的,通过编译之后,再提供给 JS 应用层调用,或者直接提供给 Node.js层使用。
|
||||||
|
|
||||||
|
**所有的编程语言底层都会回归C/C++**,甚至是汇编语言。
|
||||||
|
|
||||||
|
|
||||||
### 2、require 加载第三方包的机制
|
### 2、require 加载第三方包的机制
|
||||||
|
|
||||||
```js
|
```js
|
||||||
|
Loading…
Reference in New Issue
Block a user