Javascript Web Worker 的功能检测模块支持
Javascript feature detect module support for Web Workers
从 Chrome 80 开始,您可以使用 new Worker("worker.js", { type: "module" })
创建模块类型的 worker,然后在 worker 脚本中使用 import
等模块功能。然而其他浏览器仍在努力支持这一点,因此使用它需要功能检测和后备。
是否有方便简单的方法来为工人提供功能检测模块支持?
请注意,在某些平台(例如 Cordova)上,创建 worker 实际上并非易事,并且涉及大量变通方法,因此在纯 JS 中运行的东西将是理想的。
作为每个 initOptions
的功能,您可以使用我称之为“字典陷阱”的功能。
这是一个对象,您可以在其上设置 属性 getter(您要测试的对象),并让此 getter 在获取布尔值时切换一个布尔值由您正在测试的构造函数。这适用于许多此类功能,Worker 的 type
也不例外。
使用 Worker 唯一需要注意的事情是避免实际启动一个(即使启动一个空的 Worker 也意味着新的事件循环必须 运行、新的 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() );
从 Chrome 80 开始,您可以使用 new Worker("worker.js", { type: "module" })
创建模块类型的 worker,然后在 worker 脚本中使用 import
等模块功能。然而其他浏览器仍在努力支持这一点,因此使用它需要功能检测和后备。
是否有方便简单的方法来为工人提供功能检测模块支持?
请注意,在某些平台(例如 Cordova)上,创建 worker 实际上并非易事,并且涉及大量变通方法,因此在纯 JS 中运行的东西将是理想的。
作为每个 initOptions
的功能,您可以使用我称之为“字典陷阱”的功能。
这是一个对象,您可以在其上设置 属性 getter(您要测试的对象),并让此 getter 在获取布尔值时切换一个布尔值由您正在测试的构造函数。这适用于许多此类功能,Worker 的 type
也不例外。
使用 Worker 唯一需要注意的事情是避免实际启动一个(即使启动一个空的 Worker 也意味着新的事件循环必须 运行、新的 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() );