[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

构建工作流
image.png

image.png

技术预研篇

什么是技术预研?

  • 分析要做的需求,找出技术难点。
  • 针对每个技术难点设计demo进行攻克。

BFF层

image.png

  • 对用户侧提供 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 内置模块

image.png

  • 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
image.png

  • 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 事件循环

image.png

image.png

Node.js 异步编程 - Promise

image.png

image.png

image.png

image.png

Node.js 异步编程 – async/await

  • async/await
    • async function 是 Promise 的语法糖封装
    • 异步编程的终极方案 – 以同步的方式写异步
      • await关键字可以“暂停”asyncfunction的执行
      • await关键字可以以同步的写法获取Promise的执行结果
      • try-catch可以获取await所得到的错误
    • 一个穿越事件循环存在的 function

什么是 HTTP 服务?

image.png

image.png

  • 一个网页请求,包含两次 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协议

image.png

image.png

image.png

单工通信
image.png

半双工
image.png
全双工
image.png
二进制协议
image.png

Node.js Buffer 编解码二进制数据包

  • 大小端问题
    • 几个 Byte 里,高位与低位的编排顺序不同。
  • 处理方法与 string 接近
  • 使用 concat 而不是 + 来避免 utf-8 字符拼接问题。
  • Protocol Buffer
    • Google 研发的二进制协议编解码库
    • 通过协议文件控制 Buffer 的格式
      • 更直观
      • 更好维护
      • 更便于合作

Node.js net 搭建多路复用的 RPC 通道

Node.js net 模块

  • 单工/半双工的通信通道搭建
  • 全双工的通信通道搭建
    • 关键在于应用层协议需要有标记包号的字段
    • 处理以下情况,需要有标记包长的字段
      • 粘包
      • 不完整包
    • 错误处理

项目开发篇

极客时间整站与第一个页面的需求解构