javascript - Javascript 功能检测模块对 Web Workers 的支持
问题描述
从 Chrome 80 开始,您可以使用 . 创建模块类型的工作程序new Worker("worker.js", { type: "module" })
,然后使用import
工作程序脚本中的模块功能。然而,其他浏览器仍在努力支持此功能,因此使用它需要功能检测和后备。
是否有一种方便简单的方法来检测对工作人员的模块支持?
请注意,在某些平台(例如 Cordova)上创建工人实际上并不简单,并且涉及大量变通方法,因此在纯 JS 中工作的东西将是理想的。
解决方案
作为每个initOptions
功能,您可以使用我所说的“字典陷阱”。
它是一个对象,您将在其上设置一个属性 getter(您要测试的那个),并让这个 getter 在您正在测试的构造函数获取它时切换一个布尔值。这适用于很多这样的功能,Worker'stype
在这里也不例外。
你要小心一个 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() );
推荐阅读
- c++ - 重载函数运算符是否允许创建在语法上像 C++ 中的函数一样工作的对象?
- ios - 如果它在 TabBarController 中,如何从 AppDelegate 访问 ViewController 的属性?
- javascript - 反应组件内的地图功能
- angularjs - 在 Angular 中循环遍历 JSON 对象
- python - 标记字符串列表以返回一个标记的单词列表
- sql-server - 如何在 Mac 上正确设置 Django + MS SQL + Docker?
- java - Spring Boot 将蛇案例反序列化为骆驼案例失败。无法将“some_value”反序列化为“someValue”
- node.js - 如何修复 .save 不是 NodeJs 中猫鼬的功能
- angular - 如何使用 Angular 6 在表格分页上实现自动滑动?
- java - Cassandra 与 Java 尝试查询的所有主机都失败了