如何在MV3扩展中运行GitHub仓库中的JavaScript?
解决Chrome MV3扩展加载远程JavaScript的方案(针对Mod Tamer)
针对你开发Mod Tamer(面向Taming.IO的mod商店)时遇到的Chrome MV3无法加载远程JavaScript的问题,以下是几个可行的解决方案:
方案1:动态下载+安全校验后注入页面上下文
MV3禁止扩展直接加载远程脚本,但可以通过先下载脚本文本,再注入到网页本身的上下文执行的方式绕开限制——网页的CSP通常允许动态脚本执行,不受扩展自身的CSP约束:
- 具体步骤:
- 在扩展的
content script中,用fetch从你的仓库下载mod脚本的文本内容。 - 对下载的脚本做哈希校验(提前在扩展内置每个mod的合法哈希值),确保脚本未被篡改。
- 创建一个
<script>标签,把下载的脚本文本赋值给textContent,再插入到网页的<head>或<body>中。
- 在扩展的
- 注意事项:
- 必须做哈希校验,否则不仅有安全风险,还可能违反Chrome Web Store的审核规则。
- 绝对不要在扩展自身的上下文(比如content script、service worker)里用
eval执行远程代码,MV3默认禁止unsafe-eval,强行开启会导致审核不通过。
方案2:仿Tampermonkey的用户脚本管理模式
让用户主动导入/安装mod脚本,扩展仅负责存储和注入执行:
- 具体步骤:
- 扩展提供管理界面,支持用户上传本地mod脚本,或者手动输入脚本的仓库地址触发下载(必须由用户主动操作)。
- 将用户选择的脚本存储到
chrome.storage.local或chrome.storage.sync中。 - 在Taming.IO页面加载时,从存储中读取脚本内容,注入到页面上下文执行。
- 优势:完全符合MV3的规则,因为脚本是用户主动提供的,不属于扩展远程加载的代码,Chrome Web Store审核更容易通过。
- 缺点:用户操作成本略高,无法自动推送新mod,需要用户手动更新或安装。
方案3:内置mod并通过扩展更新推送
把所有mod脚本打包到扩展安装包中,每次更新mod时发布新的扩展版本:
- 具体步骤:
- 将mod脚本放到扩展的
assets目录下,在manifest.json中声明为可访问资源。 - 当有新mod上线时,更新扩展代码,提交新版本到Chrome Web Store。
- 用户通过扩展的自动更新机制获取新mod。
- 将mod脚本放到扩展的
- 优势:最合规,无安全风险,审核通过率极高。
- 缺点:用户无法即时获取新mod,必须等待扩展更新;扩展包体积会随着mod数量增加而变大。
额外建议
- 优先考虑方案2,既合规又能满足mod商店的核心需求,用户主动安装的模式也更贴合Chrome的安全理念。
- 如果选择方案1,一定要做好安全校验,并且在扩展描述中明确说明mod的来源和校验机制,避免审核被拒。
- 不要尝试用
chrome.scripting.executeScript加载远程URL,MV3明确禁止这种用法。
内容的提问来源于stack exchange,提问作者KittenCoder
相关产品推荐
相关产品推荐

