You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Safari Web扩展importScripts加载JS触发unsupported URL报错

Safari MV3扩展background脚本importScripts加载失败解决方案

核心排查与修复步骤

  • 优先修复路径解析问题
    Safari 15.x 系列的扩展service worker上下文存在已知的相对路径解析bug:Chrome下self.importScripts("Platform.js")会默认从当前service worker脚本所在目录解析资源,但Safari 15会错误将相对路径绑定到当前访问页面的origin,而非扩展自身的safari-web-extension://协议根路径,直接触发unsupported URL报错。
    将动态导入语句替换为显式调用扩展API获取资源合法URL的写法即可:

    // 替换原有 self.importScripts("Platform.js") 语句
    const scriptUrl = self.runtime.getURL("Platform.js");
    self.importScripts(scriptUrl);
    

    注意:如果Platform.js存放在扩展的子目录(如/libs/Platform.js),getURL的参数要写相对于扩展根目录的完整路径,不要写相对于service worker文件的相对路径。

  • 移除冗余的web_accessible_resources配置
    web_accessible_resources配置仅用于向外部网页上下文暴露扩展资源,service worker属于扩展自身的特权上下文,加载内部脚本完全不需要该配置。Safari 15.x对加入该列表的资源会单独分配临时访问origin,和service worker自身的扩展origin不一致,会直接触发跨域加载拦截。
    操作方式:将Platform.js从web_accessible_resources数组中删除,修改manifest后必须完全退出Safari、清除扩展缓存数据,再重新加载扩展——Safari对扩展manifest的缓存机制非常顽固,不彻底清缓存即使配置正确也不会生效。

  • 检查Xcode转换打包的资源完整性
    如果你是通过Safari自带的转换工具将Chrome扩展转为Xcode项目运行,需要打开Xcode项目,进入Build Phases > Copy Bundle Resources列表检查是否存在Platform.js:
    转换工具只会自动识别manifest中静态声明的脚本(如background.service_worker字段指定的入口脚本、content_scripts数组中声明的脚本),importScripts动态加载的脚本不会被自动加入打包资源列表,会导致安装后的扩展包内根本不存在对应文件,触发加载失败。如果列表中缺失该文件,手动将Platform.js拖入资源列表,勾选「Copy items if needed」后重新构建运行即可。

  • 低版本Safari兼容兜底方案
    如果以上操作后仍存在加载问题,可直接在构建阶段将Platform.js的代码合并到background service worker的入口脚本中,移除运行时动态importScripts的逻辑,从根源上规避路径解析、资源打包、权限校验类问题。
    注意不要尝试将service worker声明为type: "module"用静态import导入,Safari 15.x对MV3扩展的模块型service worker支持存在严重bug,会出现后台脚本随机休眠后无法唤醒、事件丢失的问题,该问题直到Safari 16.4才正式修复。


内容的提问来源于stack exchange,提问作者Timmy K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:33:11