8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何使用 Chrome 扩展清单版本 3 将脚本导入服务工作线程?

John P Kent 1月前

15 0

我正在尝试将我的 chrome 扩展程序从清单版本 2 迁移到 3。现在,清单 v3 中的后台脚本已被服务工作线程取代,我不能再使用 html 文件并引用 js 文件……

我正在尝试将我的 chrome 扩展从清单版本 2 迁移到 3。现在,清单 v3 中的后台脚本已被服务工作线程取代,我不能再使用 html 文件并 js 在脚本标签中引用文件。

有什么方法可以将我的个人脚本文件导入到该 service_worker.js 文件中吗?

我几乎搜索了互联网上的所有内容,但找不到任何解决方案。即使是这里的官方文档 注册后台脚本 不太有用。任何帮助都将不胜感激。

帖子版权声明 1、本帖标题:如何使用 Chrome 扩展清单版本 3 将脚本导入服务工作线程?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由John P Kent在本站《google-chrome》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 使用 chrome-extension-cli

    chrome-extension-cli package 通过安装和预配置 webpack 解决了这个问题。这允许你轻松导入包或模块

    立即开始

    不需要 安装或配置 Webpack。
    Webpack 是预先配置的,因此您可以专注于代码。

    只需创建一个项目,就可以开始了。

    阅读更多: https://github.com/dutiyesh/chrome-extension-cli

  • 通过省略 .js 文件扩展名,您没有使用 ES 模块导入语法,这就是它失败的原因。

  • 遗憾的是,我得到了变体:2. Chrome 92 及更新版本中的 ES 模块错误获取脚本时发生未知错误。导入已完成:从 './lib/BackupsManager' 导入 BuM;并且 BackupsManager 默认导出 BackupsManager 的单例实例。你知道为什么会发生这种情况吗 @wOxxOm

  • 我收到错误 \' 服务工作者安装后不允许 importScripts() 新脚本。\'

  • 首先,重要警告:

    • p1

    • p2

    • p3

    0. NPM 包

    使用像 webpack 这样的捆绑器。

    1. Chrome 92 及更高版本中的静态 ES 模块

    在 manifest.json 中 "type": "module" 声明来 background 启用

    • 名称必须以路径开头并以扩展名结尾: ./foo.js , /foo/bar.mjs
    • 可以使用 import 静态
    • 动态 import() 尚未实现( crbug/1198822 )。

    清单.json:

    "background": { "service_worker": "bg.js", "type": "module" },
    "minimum_chrome_version": "92",
    

    背景.js:

    // files must start with a path and end with an extension!
    import {foo} from '/path/file.js';
    import './file2.js';
    try {
      chrome.runtime.onMessage.addListener(...........);
      doSomething();
      // .................
    } catch (err) { console.error(err); }
    

    每个导入的模块也应该在内部使用 try/catch。如果仍然无法捕获错误,请使用 --enable-logging=stderr --v=1 2>log.txt 命令行重新启动 chrome,并在 log.txt 中查找带有扩展程序 ID 的消息。

    2. 全局 importScripts

    此内置函数同步获取并运行脚本,因此其全局变量和函数可立即使用。它比 import Chrome 中的静态函数慢得多,这在导入大量脚本时会变得明显。

    清单.json:

    "background": { "service_worker": "bg-loader.js" },
    

    bg-loader.js 只是一个 try/catch 包装器,用于包装单独文件中的实际代码:

    try {
      importScripts('/path/file.js', '/path2/file2.js' /*, and so on */);
    } catch (e) {
      console.error(e);
    }
    

    如果某个文件抛出错误,则不会导入任何后续文件。如果您想忽略此类错误并继续导入,请在其自己的 try-catch 块中单独导入此文件。

    不要忘记指定文件扩展名,通常 .js .mjs .

    2b. importScripts 监听器内部的

    根据规范,我们必须使用服务工作线程的 install 事件并导入我们希望稍后能够在异步事件中导入的所有脚本(从技术上讲,是 JS 事件循环 任务 )。 仅在安装或更新扩展程序或重新加载解压的扩展程序时(因为它等同于更新)才会调用此处理程序。

    在 MV3 中,这个问题很复杂,因为服务工作线程是为 Web 设计的,远程脚本可能无法离线使用。希望在 crbug/1198822 .

    另请参阅: webpack-target-webextension 插件。

    const importedScripts = [];
    
    function tryImport(...fileNames) {
      try {
        const toRun = new Set(fileNames.filter(f => !importedScripts.includes(f)));
        if (toRun.size) {
          importedScripts.push(...toRun);
          importScripts(...toRun);
        }
        return true;
      } catch (e) {
        console.error(e);
      }
    }
    
    self.oninstall = () => {
      // The imported script shouldn't do anything, but only declare a global function
      // (someComplexScriptAsyncHandler) or use an analog of require() to register a module
      tryImport('/js/some-complex-script.js');
    };
    
    chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
      if (msg.action === 'somethingComplex') {
        if (tryImport('/js/some-complex-script.js')) {
          // calling a global function from some-complex-script.js
          someComplexScriptAsyncHandler(msg, sender, sendResponse);
          return true;
        }
      }
    });
    
返回
作者最近主题: