# 二.Node介绍
- node 的首要目的是提供一种简单的,用于创建高性能服务器的开发工具
- web 服务器的瓶颈在于并发的用户量
# 1.Node 的特点
- node.js 是一个基于 chrome v8 引擎 JavaScript 运行环境,让 JavaScript 的执行效率与低端的 c 语言有相近的执行效率
- node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效
- node.js 的包管理器是全球最大的开源生态系统
# 1.1. 为什么 JavaScript 是单线程
- 这个是由 JavaScript 这门语言的用途决定的
- webwork 没有改变 JavaScript 单线程的本质
# 1.2. 浏览器模型
用户界面:地址栏、前进/后退按钮、书签菜单等。
浏览器引擎:在用户界面和呈现引擎之间传送指令。
呈现引擎:又叫渲染引擎或叫浏览器内核,在线程方面又称为 UI 线程
网络:用于网络调用,比如 HTTP 请求。
用户界面后端:用于绘制基本的窗口小部件,UI 线程和 JS 共用一个线程。
JavaScript 解释器:用于解析和执行 JavaScript 代码
数据存储:这是持久层。浏览器需要在硬盘上存储各种数据,例如 cookie
# 1.3. 除 JavaScript 线程和 UI 线程之外的其他线程
- 浏览器事件触发线程
- 定时触发器线程
- 异步 HTTP 请求线程
# 1.4. 任务队列
- 1.所有的同步任务都在主线程上执行,形成一个执行栈
- 2.主线程之外,还存在一个任务队列。只要异步任务有了运行结果,就在任务队列中放置一个事件
- 一旦执行栈中所有的同步任务执行完毕,系统就会读取任务队列,看看里面又那些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行
- 主线程不断重复上面的第三部
# 1.5. Event Loop
主线程从任务队列中读取事件,这个过程是不断的,所以整个的这种运行机制又称为 Event Loop(事件循环)
# 1.6. Node.js 的 Event Loop
- 1.V8 引擎解析 JavaScript 脚本
- 2.解析后的代码,调用 Node API
- 3.libuv 库负责 Node API 的执行。它将不同的任务分配给不同的线程,形成一个 Event Loop(事件循环),以异步的方式将任务的执行结果返回给 V8 引擎
- 4.V8 引擎再将结果返回给用户
# 1.7. 同步与异步
同步和异步关注的是消息通知机制
- 同步就是发出调用后,没有得到结果之前,有调用不返回,一旦调用返回,就得到返回值了。简而言之就是调用者主动等待这个调用结果。
- 而异步则相反,调用者在发出调用后这个调用就直接返回了,所以没有返回结果。换句话说当一个异步调用发出后,调用者不会立即得到结果,而是调用发出后,被调用者通过状态、通知或回调函数处理这个调用。
# 1.8. 阻塞与非阻塞
阻塞和非阻塞关注的是呈现等待调用结果(消息,返回值)时的状态
- 阻塞调用是指调用结果返回之前,当前线程被挂起。调用线程只有在得到结果之后才会返回。
- 非阻塞调用指在不能立即得到结果之前,该调用不会阻塞当前线程。
# 1.9. 组合
同步异步取决于被调用者,阻塞非阻塞取决于调用者
- 同步阻塞
- 异步阻塞
- 同步非阻塞
- 异步非阻塞
# 2.Node 使用场景
当应用程序需要处理大量并发的输入输出,而在客户端响应之前,应用程序不需要进行非常复杂的处理
- 聊天服务器
- 电子商务网站