Javascript功能检测模块支持Web Workers



从Chrome 80开始,您可以使用new Worker("worker.js", { type: "module" })创建模块类型的工作程序,然后在工作程序脚本中使用import等模块功能。然而,其他浏览器仍在努力支持这一点,因此使用它需要功能检测和回退。

有没有一种方便简单的方法来为工作人员提供功能检测模块支持?

请注意,在一些平台(例如Cordova(上,创建工作者实际上并不简单,而且涉及到一堆变通方法,因此在纯JS中工作的东西将是理想的。

作为每个initOptions功能,您可以使用我所说的";字典陷阱";。

它是一个对象,您可以在它上设置一个属性getter(您想要测试的属性(,并在您正在测试的构造函数获得它时让这个getter切换一个布尔值。这与许多这样的功能配合使用,Worker的type也不例外。

对于Worker,你唯一需要小心的是避免实际启动一个Worker(即使启动一个空Worker也意味着必须运行一个新的Event循环、一个新JS上下文,这些都不是小操作(,并避免它发出无用的网络请求(即使是404也会消耗资源(。

因此,这里有这样一个测试人员,使用字符串"blob://"可以避免这两种情况。

function supportsWorkerType() {
let supports = false;
const tester = {
get type() { supports = true; } // it's been called, it's supported
};
try {
// We use "blob://" as url to avoid an useless network request.
// This will either throw in Chrome
// either fire an error event in Firefox
// which is perfect since
// we don't need the worker to actually start,
// checking for the type of the script is done before trying to load it.
const worker = new Worker('blob://', tester);
} finally {
return supports;
}
}
console.log( supportsWorkerType() );

最新更新