[TOC]
https://github.com/geektime-geekbang/geek-nodejs
课程介绍
什么是Node.js?
Node.js通常用环境做一个BFF层,即Backend For Frontend(服务于前端的后端),通俗的说,是一个为前端业务提供数据的后端程序。
特点:不需要服务的强大的计算,但需要灵活。
官网的话:
- Node.js是一个基于Chrome V8引擎的JavaScript运行环境。
- Node.js使用了一个事件驱动、非阻塞I/O的模型,使其轻量又高效。
在Node.js里运行JavaScrip跟在Chrome里运行JavaScript有什么不一样?
Chrome浏览器用的是同样的JavaScript引擎和模型。
在Node.js里写JS和在Chrome里写JS,几乎没有不一样。
几乎没什么不一样,那不一样在哪里呢,如下:
- Node.js没有浏览器API,即document,window等。
- 加了许多Node.js API
什么是Node.js?
对开发者来说:
- JavaScript让你在Chorm里写JS控制浏览器。
- Node.js让你用类似的方式,控制整个计算机。因为它觉得js做的非常好,所以就利用他,应用在了整个计算机,做服务层。
- 人生的真谛要用自己一辈子去理解。
- Node.js的真谛,也需要你在Node.js的学习过程中慢慢理解。
- Node.js是一个基于Chrome V8引擎的JavaScript运行环境。
- Node.js使用了一个事件驱动、非阻塞I/O的模型,使其轻量又高效。
Node.js能用来做什么
Web服务-腾讯视频
- 搜索引擎优化+首屏速度=服务端渲染
- 服务端渲染+前后端同构=Node.js
构建工作流
技术预研篇
什么是技术预研?
- 分析要做的需求,找出技术难点。
- 针对每个技术难点设计demo进行攻克。
BFF层
- 对用户侧提供 HTTP 服务
- 使用后端 RPC 服务
在这之前,需要了解Node.js怎么跑起来。
Node.js 开发环境安装
Chrome的安装
VS Code的安装
Node.js的安装
Node.js 第一个实战 – 石头剪刀布游戏
- 运行方式
- Node.js全局变量
CommonJS 模块规范
- 脚本变多时,需要手动管理加载顺序。
- 不同脚本之间逻辑调用,需要通过全局变量的方式。
- 没有 html 怎么办?
CommonJS 模块规范
- JavaScript 社区发起,在 Node.js 上应用并推广。
- 后续也影响到了浏览器端 JavaScript。
npm 及 npm 包
npm 是什么
- Node.js 的包管理工具
包是什么
- 别人写的 Node.js 模块
npm 上的著名大神
- TJ Holowaychunk
- Mafintosh
- Dominictarr
- ……
npm event-stream 事件
没有 npm,也不会有现在这么繁荣的 JS 社区。
Node.js 内置模块
- OS 模块
- EventEmitter
- 观察者模式
- addEventListener
- removeEventListener
- 调用vs抛事件
- 关键在于“不知道被通知者存在”
- 以及“没有人听还能继续下去”
- 观察者模式
Node.js 异步
Node.js 的非阻塞 I/O
- I/O 即 Input/Output,一个系统的输入和输出。
- 阻塞 I/O 和非阻塞 I/O 的区别就在于系统接收输入再到输出期间,能不能接收其 他输入。
- 排队打饭 vs 餐厅点菜
- 对于点菜人员:
- 排队打饭是阻塞 I/O
- 餐厅点菜是非阻塞 I/O
Node.js 的非阻塞 I/O
- I/O 即 Input/Output,一个系统的输入和输出。
- 阻塞 I/O 和非阻塞 I/O 的区别就在于系统接收输入再到输出期间,能不能接收其 他输入。
- 系统=食堂阿姨/服务生,输入=点菜,输出=端菜。
- 饭堂阿姨只能一份一份饭地打 -> 阻塞 I/O
- 服务生点完菜之后可以服务其他客人 -> 非阻塞 I/O
“这个 Node.js 问题怎么解决?在线等,急。”
-> 阻塞 I/O
Node.js 异步编程 - callback
- 回调函数格式规范
- error-first callback
- node-style callback
- 第一个参数是 error,后面的参数才是结果。
- 异步流程控制
- npm: async.js
- thunk
Node.js 事件循环
Node.js 异步编程 - Promise
Node.js 异步编程 – async/await
- async/await
- async function 是 Promise 的语法糖封装
- 异步编程的终极方案 – 以同步的方式写异步
- await关键字可以“暂停”asyncfunction的执行
- await关键字可以以同步的写法获取Promise的执行结果
- try-catch可以获取await所得到的错误
- 一个穿越事件循环存在的 function
什么是 HTTP 服务?
- 一个网页请求,包含两次 HTTP 包交换:
- 浏览器向 HTTP 服务器发送请求 HTTP 包
- HTTP 服务器向浏览器返回 HTTP 包
- 以极客时间首页为例,分析 HTTP 格式。
- HTTP 服务要做什么事情?
- 解析进来的 HTTP 请求报文
- 返回对应的 HTTP 返回报文
实现一个 HTTP 服务
实现网页版石头剪刀布
HTTP 服务框架:Express
Express
- 要了解一个框架,最好的方法是
- 了解它的关键功能
- 推导出它要解决的问题是什么
- 核心功能:
- 路由
- request/response 简化
- request:pathname、query等
- response:send()、json()、jsonp()等
- 中间件
- 更好地组织流程代码
- 异步会打破Express的洋葱模型
HTTP 服务框架:Koa
核心功能:
- 比 Express 更极致的 request/response 简化
- ctx.status=200
- ctx.body=’helloworld’
核心功能:
- 使用 async function 实现的中间件
- 有“暂停执行”的能力
- 在异步的情况下也符合洋葱模型
- 精简内核,所有额外功能都移到中间件里实现。
Express vs Koa
- Express 门槛更低,Koa 更强大优雅。
- Express 封装更多东西,开发更快速,Koa 可定制型更高。
- 孰“优”孰“劣”?
- 框架之间其实没有优劣之分
- 不同的框架有不同的适用场景
RPC 调用
- Remote Procedure Call(远程过程调用)
- 和 Ajax 有什么相同点?
- 都是两个计算机之间的网络通信
- 需要双方约定一个数据格式
- 和 Ajax 有什么不同点?
- 不一定使用 DNS 作为寻址服务
- 应用层协议一般不使用 HTTP
- 基于TCP或UDP协议
单工通信
Node.js Buffer 编解码二进制数据包
- 大小端问题
- 几个 Byte 里,高位与低位的编排顺序不同。
- 处理方法与 string 接近
- 使用 concat 而不是 + 来避免 utf-8 字符拼接问题。
- Protocol Buffer
- Google 研发的二进制协议编解码库
- 通过协议文件控制 Buffer 的格式
- 更直观
- 更好维护
- 更便于合作
Node.js net 搭建多路复用的 RPC 通道
Node.js net 模块
- 单工/半双工的通信通道搭建
- 全双工的通信通道搭建
- 关键在于应用层协议需要有标记包号的字段
- 处理以下情况,需要有标记包长的字段
- 粘包
- 不完整包
- 错误处理