Node.js学习笔记-阿里终端训练营

基于事件驱动 非阻塞异步编程

同步&异步解释:去邻居家敲门,人不在,一直在门口等待邻居回来,这就是同步的;去敲门,人不在,留下一个消息就走了,邻居回来看到消息,打电话给你,你再去,这就是异步。

运行结果与浏览器端的控制台一致,因为它与Chrome的底层都是基于V8

node中没有windows的全局变量,但是它有global,process,console,require(),module,exports,setTimeout,clearTimeout,setInterval,clearInterval

1.Node.js基础

1.1 内置模块

即无需引入依赖,就可以使用的库。

比如:fs,path, http/https, until

例子:使用path模块

1
2
3
4
5
6
7
8
9
10
11
12
// 使用require加载模块
const path = require('path')

const myPath = 'D:/研0暑假/ide-startup/src/node/hello.js'

const dirname = path.dirname(myPath)
const basename = path.basename(myPath)
const extname = path.extname(myPath)

console.log(dirname); // D:/研0暑假/ide-startup/src/node
console.log(basename); // hello.js
console.log(extname); // .js

例子:使用http模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 使用http内置模块
const http = require('http')

const hostname = '127.0.0.1'
const port = 3000

const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello, World\n')
})

server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
})
// 访问http://127.0.0.1:3000/ 页面出现 Hello, World
1.2 常用第三方库

非常非常丰富,每天都有几千万的下载量,可靠好用

比如:lodash, express, koa,Moment,Day.js,DEBUG,request, axios

express, koa是两个非常老牌的第三方http库,12年以前常用exress,12年以后逐步用koa

Moment,Day.js是两个处理时间转化的库,开始用Moment,近期用Day.js

1.3 Npm

全称Node Package Manager,是标准的原生态包管理工具

yarn与npm是两个最好的模块安装工具,npm使用的人数更多,因为npm是node自带的,安装node后就同时安装了npm

  • 使用Common.js规范可以将多个文件运行起来
1
2
3
4
5
6
7
// a.js
require('./b.js')
//b.js
console.log('hello world')

node a.js
//hello world
1.4 express vs koa

国内koa居多,世界范围内express居多

  • koa优势

    支持ES6

    文件只有4个

  • koa使用

    1
    2
    3
    4
    5
    // koa 使用
    const koa = require('koa')
    const app = koa()

    app.listen(3000)
  • koa本质:由core加上一堆中间件组成,路由就是其中一种中间件

中间件(Web Middleware):处理HTTP请求的函数,用来完成各种特定的任务,比如检查用户是否登录、分析数据。最大特点就是,一个中间件处理完,再传递给下一个中间件。

koa最大的特点是在于它的中间件,是一个async中间件,而且跟传统的async不一样,不是A到B,B到C。它的执行过程是洋葱模型,当执行到最里面的时候,它的response执行完会回来,会从最后一个中间件返回到第一个中间件,类似退栈过程。比传统中间件更高效

比如:计算执行时间

传统中间件:在第一个路由里初始化时间,最后一个执行的路由里埋一个最终时间,两者相减,需要把数据从a带到最后。

koa的话,就不需要,因为它进出都是自己。

一个有意思的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 洋葱模型 进出都是自己
async (ctx, next) => {
console.log('before 1');
await next()
console.log('after1');
}
async (ctx, next) => {
console.log('before 2');
await next()
console.log('after2');
}
/**
* before 1
* before 2
* after2
* after1
*/
1.5 async

传统的异步编程手段:co,function *, thunk, async/await, promise

(async/await是最新的,是promise的语法糖)

之前Node.js被人诟病的就是回调地狱callback hell

1
2
3
4
5
6
// 回调地狱 callback hell
doSomething(function (result) {
doSomethingElse(result, function (newResult) {
// ...
}, failureCallback)
})

但是在ES6之后 ,出现 yield generator 还有co去包裹函数的形态,最终解决方案还是promise

1.6koa中间件

常见中间件:koa-bodyparse, koa-ejs, koa-router

2. Node.js Serverless & 拓展

  • 什么是Serverless

    几乎没人知道怎么落地Serverless;

    但是大家都觉得其他人在大力做Serverless;

    所以大家都宣称自己在做Serverless

  • 发展角度

    为了保证开发环境的正确性,想出一系列的隔离方式。

    从最早的物理服务器(裸机)–> 虚拟化 –> 云计算 –> 容器技术 –> Serverless

    抽象程度越来越高,原因是如果要部署一个应用,我希望关心的是其本身,而不是运维。

  • Serverless特性

    • Hostless

      不绑定一个主机,基于云服务器

    • Elastic

      弹性,自动扩容缩容

    • Stateless

      无状态,随时启动销毁

    • Event-driven

      事件驱动,不同事件对应不同函数,不同函数完成不同功能

    • Lego Blocks

      乐高组合

    • High Availability

      高可用

    • Usage-based Cost

      按量付费

  • 案例

    • web应用访问CDN(内容分发网络)
      web过程图解
    • 视频转码
      视频转码
  • Javascript在服务端的新进展

    • 更多全栈框架的出现
      16,17年出现的Next.js(基于React) 和 Nuxt.js(基于Vue)
      近期不久出现Remix(前端后端混在一起写)

    • 渲染容器从端到云再到边
      用户访问cdn节点中存在loading,找到服务器之后拉取页面,返回的数据也需要去服务器拉取,中间也存在loading。因此在传统服务端渲染的情况下,会存在很多loading。

      出现在服务端做更多事情的思考

      出现了SSR服务端渲染,像Java的JSP,Vue/React做的Server Side Rendering(SSR)原理都是类似的。将页面渲染的工作搬到服务端,实现了ssr服务渲染功能。

      出现问题,人服务器不在同地

      中间需要跨多个服务器,整个过程延时非常严重,ssr也有压力

      出现SSG静态页面生成,可以在服务端生成页面去推送到CDN

      出现Edge 边缘计算渲染