Webcourse/10-Node.js和数据库/01-Node.js介绍.md

225 lines
12 KiB
JavaScript
Raw Normal View History

2020-06-17 16:43:21 +08:00
## todo
- rpc Node.js 的关系
- [吊打面试官系列 Node.js 全栈秒杀系统](https://mp.weixin.qq.com/s/uWeAsJ-P253je15A49uKIQ)
## 前言
Node 的重要性已经不言而喻很多互联网公司都已经有大量的高性能系统运行在 Node 之上Node 凭借其单线程异步等举措实现了极高的性能基准此外目前最为流行的 Web 开发模式是前后端分离的形式即前端开发者与后端开发者在自己喜欢的 IDE 上独立进行开发然后通过 HTTP 或是 RPC 等方式实现数据与流程的交互这种开发模式在 Node 的强大功能的引领下变得越来越高效也越来越受到各个互联网公司的青睐
### 前端同学为什么要学习后台开发
- 了解前后端交互流程
- 能够和后台开发的程序员更佳紧密地结合更顺畅地沟通
- 当网站的业务逻辑需要前置时前端人员需要学习一些后台开发的技术以完成相应的任务
- 拓宽知识视野和技术栈能够站在全局的角度审视整个项目
### 前端同学为什么要学 Node.js
1Node.js 使用 JavaScript 语言开发服务器端应用**便于前端同学上手**一些公司甚至要求前端工程师掌握 Node.js 开发
2实现了前后端的语法统一**有利于和前端代码整合**甚至共用部分代码
比如说针对接口返回的各种字段前后端都必须要做校验此时如果用 Node.js 来做后台开发的话前后端可以共用校验的代码
3Node.js 性能高生态系统活跃提供了大量的开源库
4Jeff Atwood 2007 年提出了著名的 Atwood 定律**任何能够用 JavaScript 实现的应用系统最终都必将用 JavaScript 实现**如果你不知道 Jeff Atwood 是谁他是 Stack Overflow 网站的创始人这不重要重要的是这条定律
### 后端同学为什么要学 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 是全球最大的开源库生态系统。
![](http://img.smyhvae.com/20180301_1540.png)
如上图所示
- 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 的组成
我们知道JavaScript 的组成分为三个部分
- ECMAScript
- DOM
- BOM
ECMAScript JS 的语法DOM BOM 浏览器运行环境为 JS 提供的 API
Node.js 的组成分为
- **ECMAScript**ECMAScript 的所有语法在 Node 环境中都可以使用
- **Node 环境**提供的一些**附加 API**(包括文件网络路径等等 API)
如下图所示
![](http://img.smyhvae.com/20200409_1545.png)
### 补充
JS 语言非常灵活使得它在严谨性方面不如 Java 等传统的静态语言JS 是一门动态语言而且融合了面向对象和函数式编程这两种编程范式
随着 ES6ES7 JS 语法规范的出现以及浏览器对这些规范的支持使得我们可以用更为现代化的 JS 语言特性来编写现代化的应用
## Node 的发展历史
- 2008 年左右随着 Ajax 的逐渐普及Web 开发逐渐走向复杂化系统化
- Node.js 诞生于 2009 Joyent 的员工 Ryan Dahl 开发而成2009 5 Ryan Dahl GitHub 中开源了 Node 的最初版本同年 11 JSConf 大会上展示了 Node 项目
- 2010 1 NPM 包管理工具诞生使得程序员能够更方便地发布和分享 Node.js 的第三方库
- Node.js 最初只支持 Linux Mac OS 操作系统2011 7 微软参与合作Node.js 终于支持了 Windows 平台PS不过node 的生产环境基本是在 Linux
- 目前官网最新版本已经更新到 14.x.x 版本最新稳定的是 12.18.0
Node.js 创始人 Ryan Dahl 回忆他最初希望采用 Ruby但是 Ruby 的虚拟机效率不行
注意 Node 选择了 JavaScript不是 JavaScript 发展出来了一个 Node
## Node.js 的应用
Node.js 拥有强大的开发者社区现在已经发展出比较成熟的技术体系以及庞大的生态它被广泛地应用在 Web 服务开发工作流客户端应用等诸多领域其中 Web 服务领域业界对 Node.js 的接受程度最高
### Node.js 的用途
**1中间层**
前端访问中间层的接口中间层再访问后台的 Java/C++ 服务这类服务的特点是不需要太强的服务器运算能力但对程序的灵活性有较高的要求
这样做的好处是安全性不会把主服务器暴露在外面提高性能做缓存等降低主服务器的复杂度
当然有时候做 Node.js 开发是因为后台人力不够所以把后台开发的一部分工作量转移给前端同学
**2做小型服务小型网站的后端**比如后台管理系统
现在很多公司的后台管理系统都是用 Node.js来开发接口直接操作 DB
不过短期来看Node.js 很难像 Java/C++ 那样成为后台的主力开发语言这并非是因为 Node.js 的性能问题实际上Node.js 的性能还不错主要是因为Node.js 还比较年轻框架的支持度不够很难独立成为后台开发语言但未来可期
**3做公司内部工具项目构建工具**
### Node.js 的主要应用领域
- RESTFul API
- 实时通信如消息推送等
- 高并发
- I/O 阻塞
### 知名度较高的 Node.js 开源项目
![](http://img.smyhvae.com/20180301_2009.png)
- expressNode.js 中著名的 web 服务器框架
- Koa下一代的 Node.js Web 框架
- mocha功能强大的 node.js 测试框架
- PM2node 本来是单进程的PM2 可以实现和管理多进程
- jade非常优秀的模板引擎不仅限于 js 语言
- CoffeeScript用简洁的方式展示 JavaScript 优秀的部分
- Atom文本编辑器
- socket.io实时通信框架
## 前端同学会 Node.js 就真的全栈了吗
一个人的精力是有限的既擅长前端又精通后端的人毕竟是极少数
林肯说过你可以在所有的时间欺骗一部分人也可以在一段时间欺骗所有的人但你不可能在所有的时间欺骗所有的人
同样的我也说过你可以在这一段时间擅长前端技术也可以在另一段时间擅长后台技术但你不可能在**同一段时间**同时擅长前端和后台更不可能在**所有的时间**同时擅长前端和后台
所谓的全栈只是一个伪命题个人不一定需要全栈企业和项目也不强制要求全栈分工协作才最高效
对于个人而言虽然全栈很难但是 Node.js 的出现** JS 语言实现了前后端语法的统一 JS 语言的技术栈更佳全面**
涉及到后台开发相关的技术无论如何也绕不开**框架设计开发调试数据库操作高并发处理大规模存储性能优化容灾方案操作系统调度甚至是 Linux 内核驱动开发**等过硬的知识技能和经验积累等你亲身经历过这些才算明白语言只是一种工具
## V8 引擎
### 运行环境平台的含义
首先JavaScript 语言通过 Node 在服务器上运行在这个意义上Node.js 的地位相当于 JavaScript 在服务器端的虚拟机类似于 Java 语言中的 Java 虚拟机
其次Node 生态系统活跃提供了大量的开源库使得 JavaScript 语言能与操作系统进行交互在这个层次上Node 又是属于 JavaScript 的工具库
**补充**
PHPJSPPythonPerlRuby 既是语言也是平台不同Node.js 的使用 JavaScript 进行编程运行在 Chrome V8 引擎上
PHPJSP 等相比PHPJSP.net 都需要运行在服务器程序上ApacheNginxTomcatIIS
Node.js 跳过了 ApacheNaginxIIS HTTP 服务器它自己不用建设在任何服务器软件之上Node.js 的许多设计理念与经典架构LAMP = Linux + Apache + MySQL + PHP有着很大的不同可以提供强大的伸缩能力Node.js 没有 web 容器
### V8 Node
Chrome 浏览器成功的背后离不开 JS V8 引擎作为虚拟机V8 的性能表现优异它的开发者是 Lars Bak Lars 的工作履历里绝大部分都是与虚拟机相关的工作在开发 V8 之前他曾经在 Sun 公司工作担任 HotSpot 团队的技术领导主要致力于开发高性能的 Java 虚拟机在这之前他也曾为 SelfSmalltalk 语言开发过高性能虚拟机这些无与伦比的经历让 V8 一出世就超越了当时所有的 JS 虚拟机
![](http://img.smyhvae.com/20200617_1120.png)
V8 的性能优势使得用 JavaScript 写高性能后台服务程序成为可能在这样的契机下Ryan Dahl 选择了 JavaScript选择了 V8在事件驱动非阻塞 I/O 模型的设计下实现了 Node
### V8 的内存限制
在一般的后端开发语言中在基本的内存使用上没有什么限制然而在 Node 中通过 JavaScript 使用内存时就会发现只能使用部分内存64 位系统下约为 1.4GB32 位系统下约为 0.7GB在这样的限制下将会导致 Node 无法直接操作大内存对象
造成这个问题的主要原因在于 Node 基于 V8 构建所以在 Node 中使用的 JavaScript 对象基本上都是通过 V8 自己的方式来进行分配和管理的V8 的这套内存管理机制在浏览器的应用场景下使用起来绰绰有余足以胜任前端页面中的所有需求但在 Node 这却限制了开发者随心所欲使用大内存的想法
## Node.js 的特点
- 异步非阻塞 IO 模型
- 事件循环
- 单线程
- 总结轻量和高效
Node.js 的性能和效率非常高
传统的 Java 语言是一个请求开启一个线程当请求处理完毕后就关闭这个线程 Node.js 则完全没有采用这种模型它本质上就是一个单线程
你可能会疑问一个线程如何服务于大量的请求如何处理高并发的呢这是因为Node.js 采用的是异步的非阻塞的模型
这里所谓的单线程指的是 Node 的主线程只有一个为了确保主线程不被阻塞主线程是用于接收客户端请求但不会处理具体的任务 Node 的背后还有一个线程池线程池会处理长时间运行的任务比如 IO 操作网络操作线程池里的任务是通过队列和事件循环的机制来执行
## SSR 服务端渲染
提高搜索引擎抓取网页的
## 我的公众号
想学习**代码之外的技能**不妨关注我的微信公众号**千古壹号**id`qianguyihao`
扫一扫你将发现另一个全新的世界而这将是一场美丽的意外
![](http://img.smyhvae.com/20200101.png)