nodejs系列教程(二)

nodejs教程,适合有一定nodejs基础的小伙伴

nodejs

官网:https://nodejs.org/en/
版本:https://github.com/nodejs/release
适配:https://kangax.github.io/compat-table/es6/

JavaScript时间线

1995年JavaScript诞生,作者:Brendan Eich

1997年发布ECMAScript1.0版本

1998年6月发布ECMAScript2.0版本

1999年微软推出ActiveX,实现XMLHttpRequest

1999年12月发布ECMAScript3.0版本

2005年2月,ajax问世(Asynchronous Javascript And XML)

2006年1月,jQuery发布

2008年chrome浏览器问世(V8引擎)

2009年6月30日,Nodejs 0.1.0版本发布(Ryan Dahi)

2009年12月发布ECMAScript5.0版本

2010年npm问世

2010年1月3日,express问世

2015年6月17日,发布ECMAScript6.0版本

2015年8月22日,koa问世

2016年9月,eggjs问世

趋势图

图片

图片

来源:modulecounts

nodejs单线程

1
2
3
4
5
6
setTimeout(() => {
alert('hello world');
});
while (true) {
console.log(1);
}

nodejs中处理多个请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors());

app.get('/a', async function(req, res){
console.log(req.params)
return new Promise((resolve, reject)=> {
setTimeout(() => {
resolve('ok')
}, 30000);
}).then((data)=> {
res.send('hello a');
})
})

app.get('/b', function(req, res){
res.send('hello b');
})

app.listen(8000, function() {
console.log('Server is up')
})

// 执行结果
// 1. 先返回

nodejs支持esm

浏览器中事件循环

浏览器是多线程的

nodejs事件循环

nodejs采用V8作为js的解析引擎,I/O处理使用libuv

express

grunt

参考文档

node事件循环6个阶段

每个阶段都有一个队列(存储回调函数)

Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
Node.js 几乎每一个 API 都是支持回调函数的。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.

timers 主要执行setTimeout, setInterval的回调。 [timer1Callback1, timer1Callback2, timer1Callback3]

I/O callbacks

idle, prepare

poll

check // 直接执行setImmdiate的回调

close callbacks

有接口请求过来->因为javascript是单线程,所以开始利用V8引擎提供的异步执行回调接口,先进入poll阶段->

分析node中webServer执行过程

  1. 有ajax请求1发到web服务器
  2. 因为javascript是单线程,V8接收到请求后,立即关闭然后去处理该请求,然后去服务下一个web请求
    处理请求:
    2.1 开始进入poll阶段,poll队列是空的,所以会一直轮询,看是否有setImmediate回调需要执行,如果有就直接进入check阶段执行setImmediate回调,没有就等待回调加入poll队列中
    2.2 有没有close callbacks回调(主要是socket.io长连接,很耗服务器资源)
    2.3 timers队列中有没有需要执行的回调(已到期)
    2.4 pedding阶段是否有需要执行的回调
    2.5 idle prepare(闲置阶段),一轮事件循环执行完成,进入闲置阶段
    2.6 重新进入poll阶段,开始新一轮的轮询