首页 > 解决方案 > Javascript 功能检测模块对 Web Workers 的支持

问题描述

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

是否有一种方便简单的方法来检测对工作人员的模块支持?

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

标签: javascriptweb-workeres6-modulesbrowser-feature-detection

解决方案


作为每个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() );


推荐阅读