1.为啥会出现事件循环的概念?
    2.分别是什么流程

    1.首先:目前的浏览器都是多进程多线程架构,包括浏览器主进程(UI线程、网络线程、存储线程)、渲染进程(主线程也就是v8主要运行环境、合成线程)、GPU进程等。具体请移步:https://www.yuque.com/db/one-piece/qilydh
    2.如何理解nodejs,也就是它做了一件什么事?
    在底层封装的前提下,加上自己内置的一些模块,通过commonjs的规范,让开发者可以使用接触计算机底层的事务。libuv就是一个高性能异步非阻塞IO库(c\c++实现)可用来实现node事件循环。为什么用js写node,而不是python?其实这只是前端开发者的福气而已,底层依托的v8是关键,如果是python编译器,那也可以用python写node,额,可能就不叫node了。(目前还有些新产物,比如deno就是类似TS 版本的node,quickjs是类似于v8的解释器)
    内置模块举例子:fs ,path, dns, http,vm等

    3.其实对于第一个问题,无非就是引入了2个概念:事件+循环 -> 线程+消息队列
    事件就是浏览器中的一些事件,如:资源下载完成、鼠标点击完成、滚动页面等一系列事件
    循环: 可以先理解为一个for循环。
    抽象一下就是下面3个动作:

    1)添加一个消息队列;
    2)各种线程中产生的新任务添加进消息队列尾部;
    3)渲染主线程会循环地从消息队列头部中读取任务,执行任务。
    消息队列中的事件包括:包含了很多内部消息类型,如输入事件(鼠标滚动、点击、移动)、微任务、文件读写、WebSocket、JavaScript 定时器等等。除此之外,消息队列中还包含了很多与页面相关的事件,如 JavaScript 执行、解析 DOM、样式计算、布局计算、CSS 动画等。
    4)补充说明一下,这些事件都是在单线程中执行。(一个执行栈)

    上面众多事件中都是按照队列的思想先进先出,如果想要处理一些实时性的问题,比如DOM监听,直接插入队列采用同步等待的情况,会影响实时性,如果采用异步的操作,插入到当前宏任务,若频繁处理则会影响当前任务的执行效率,所以微任务应运而生。

    因此,通常我们把消息队列中的任务称为宏任务,每个宏任务中都包含了一个微任务队列,在执行宏任务的过程中,如果 DOM 有变化,那么就会将该变化添加到微任务列表中,这样就不会影响到宏任务的继续执行,因此也就解决了执行效率的问题。等宏任务中的主要功能都直接完成之后,这时候,渲染引擎并不着急去执行下一个宏任务,而是执行当前宏任务中的微任务,因为 DOM 变化的事件都保存在这些微任务队列中,这样也就解决了实时性问题。

    现在可以来回来第一个问题了,事件循环就相当于任务调度,浏览器处理各种事件的机制。

    4.node 中的事件循环
    显然node中不会存在例如UI线程、网络线程等这些浏览器调度单位,node中的事件循环和浏览器事件循环是截然不同的,但是同样要处理异步IO事件,它采用libuv来管理这一套流程。
    node运行机制:
    1)v8解析js脚本
    2)解析后的代码调用node api
    3)libuv库负责node api的执行,将不同的任务分配给不同的线程,行程一个 Event Loop,最后以异步的方式将执行结果返回给v8
    4) v8再将结果给到用户

    在node中,微任务会在事件循环的各个阶段之间执行,也就是一个阶段执行完毕,就会去执行微任务队列里的内容。大致分为6个阶段:
    timers: setTimeout和setInterval的回调
    I/O callbacks: 推迟到下一个循环迭代的I/O操作
    idle,prepare:系统内部使用
    poll:<- incoming:conections,data…. 执行与I/O相关的回调
    check: setImmediate回调
    close calllbacks: socket.on(‘close’, () => {}) 一些关闭的回调

    外部输入数据–>轮询阶段(poll)–>检查阶段(check)–>关闭事件回调阶段(close callback)–>定时器检测阶段(timer)–>I/O 事件回调阶段(I/O callbacks)–>闲置阶段(idle, prepare)–>轮询阶段(按照该顺序反复运行)…

    setTimout(0定时) vs setImmediate的区别:
    1)在主模块中执行的顺序是不固定的
    2)在同一个I/O回调里, setImmediate总是先执行

    node中的微任务: process.nexttick > promise.then (优先级)