假设我们有一个包含以下 JS 代码的文件:
process.nextTick(()=>{
console.log('nextTick')
})
queueMicrotask(()=>{
console.log('queueMicrotask')
})
console.log('console.log')
Run Code Online (Sandbox Code Playgroud)
我们已经"type": "commonjs"在 package.json 中设置了模块系统
我们期望控制台输出什么?Node.js 官方文档说:
在 Node.js 事件循环的每一轮中,process.nextTick() 队列始终在微任务队列之前处理
所以,在控制台中我们期望
console.log
nextTick
queueMicrotask
Run Code Online (Sandbox Code Playgroud)
那行得通。直到我将模块系统更改为"type": "module". 在那次更改之后,我不断地在 process.nextTick 之前执行queueMicrotask。控制台输出为:
console.log
queueMicrotask
nextTick
Run Code Online (Sandbox Code Playgroud)
有人能解释这种行为吗?我假设这种行为在某种程度上与模块评估和执行过程有关,并且 nextTick queueMicrotask 以某种方式进入不同的事件循环滴答,因为模块意味着异步执行(在浏览器中)。尽管如此,这种猜测还是非常不稳定,从我的角度来看,这是不合逻辑的。尽管如此,我仍然没有一个合理的解释。