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 | setTimeout(() => { |
nodejs中处理多个请求
1 | const express = require('express'); |
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执行过程
- 有ajax请求1发到web服务器
- 因为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阶段,开始新一轮的轮询