queue-microtask

快,小 queueMicrotask 现代发动机的垫片
- 使用
queueMicrotask在所有现代JS引擎中。 - 没有依赖关系。少于10行。没有垫片或复杂的后撤。
- 在所有现代环境中的最佳性能
- 使用
queueMicrotask在现代环境中 - 回退到
Promise.resolve().then(fn)在Node.js 10及更早版本中,以及旧的浏览器(性能与queueMicrotask)
- 使用
安装
npm install queue-microtask
用法
const queueMicrotask = require('queue-microtask')
queueMicrotask(() => { /* this will run soon */ })
是什么 queueMicrotask 为什么要用它呢?
这个 queueMicrotask 函数是WHATWG标准。在控制返回事件循环之前,它将一个待执行的微任务排在队列中。
微任务是一个短函数,它将在当前任务完成其工作之后运行,并且在执行上下文的控制返回给事件循环之前没有其他代码等待运行。
的代码 queueMicrotask(fn) 是否等同于代码 Promise.resolve().then(fn). 它也非常类似于 process.nextTick(fn) 在节点。
使用微任务可以让代码在运行时不干扰任何其他可能更高优先级的挂起代码,但要在JS引擎重新获得对执行上下文的控制之前。
这个包裹是给谁的?
此包允许您使用 queueMicrotask 安全地在所有现代JS引擎。如果你优先考虑小JS包的大小而不是对旧浏览器的支持,可以使用它。
如果您只需要支持Node 12及更高版本,请使用 queueMicrotask 直接。如果需要支持所有版本的Node,请使用此包。
为什么不用呢? process.nextTick?
在节点, queueMicrotask 和 process.nextTick 是 本质上是相同的,尽管有 细微的差别 在大多数情况下,这并不重要。
你可以想到 queueMicrotask 的标准版本 process.nextTick 这在浏览器中是有效的。不需要依赖浏览器绑定器来加载 process 用于浏览器环境。
为什么不用呢? setTimeout(fn, 0)?
这种方法是最兼容的,但它有问题。现代浏览器严重限制了计时器,所以 setTimeout(…, 0) 通常运行至少需要4毫秒。此外,如果页面是后台的,节流会变得更糟。如果你有很多 setTimeout 调用,那么这会严重限制程序的性能。
为什么不使用类似的微任务库呢 immediate 或 asap?
这些包裹太棒了!然而,如果你在旧浏览器中优先考虑小JS包的大小而不是最佳性能,那么你可能会考虑使用这个包。
这个包裹(queue-microtask)比……小四倍 immediate的两倍小 asap,是使用的两倍 process.nextTick 并让浏览器捆绑器自动加载它。
注意:这个包会在JS环境中抛出一个异常 Promise 这通常是非常旧的浏览器和Node.js版本。
自 queueMicrotask API支持Node.js、Chrome、Firefox、Safari、Opera和Edge; 绝大多数用户将获得最佳性能. 任何JS环境 Promise,这几乎是所有的,也得到了最佳的性能。如果你需要支持JS环境中所缺乏的 Promise 支持,使用替代包之一。
什么是衬垫?
在计算机编程中,shim是一个库,它透明地拦截API调用并更改传递的参数,处理操作本身或将操作重定向到其他地方。– 维基百科
这个包也可以被描述为一个“小马填充”。
一个小马填充几乎相同的polyfill,但不完全相同。而不是修补旧浏览器的功能,一个小马填充提供的功能作为一个独立的模块,你可以使用。– PonyFoo
API
queueMicrotask(fn)
这个 queueMicrotask() 方法为微任务排队。
这个 fn 参数是一个函数,在所有挂起的任务完成之后,在将控制权交给浏览器的事件循环之前执行。
许可证
麻省理工学院。版权(c) Feross Aboukhadijeh。