米侠浏览器v5.3升级至v5.5+后,@require、@grant none、@noframes、@include、@exclude、@run-at document-idle等元数据指令被严格校验并失效;须替换为本地内联依赖、仅保留gm_*四类有效grant、改用@match双协议匹配、强制声明@run-at document-end。

米侠浏览器从v5.3升级到v5.5或v6系列后,原本能正常执行的@require、@grant none、@noframes等旧版支持的元数据指令突然被忽略,脚本控制台报错“undefined is not a function”或直接静默跳过关键逻辑,根本原因是新版本解析器对UserScript元数据规范做了严格校验,非标准或已废弃指令不再兼容。
确认哪些指令已被移除或限制
打开你的脚本文件,在// ==UserScript==和==/UserScript==之间逐行检查:若存在@require、@grant none、@noframes、@include、@exclude、@run-at document-idle等条目,这些在v5.5+中全部失效——@require无法加载远程JS库,@grant none会触发安全拦截,@noframes被完全忽略,@include/@exclude被@match硬性替代,@run-at document-idle解析为document-start导致DOM操作失败。
【这一步必须先做,否则盲目重写可能引入新错误】
替换已失效的@require为本地内联方式
方法一:将远程依赖库内容直接复制进脚本顶部
找到原@require https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js这类行,删除它;用浏览器打开该URL,全选复制源码;回到脚本编辑页,在// ==UserScript==下方空行处粘贴整个jQuery代码(约90KB),再接你的主逻辑。这样绕过网络加载,也规避了CSP拦截。
方法二:改用米侠内置的fetch + eval动态注入(仅限可信源)
把原@require行删掉,在脚本开头加一段同步加载逻辑:注意:此方式需确保目标CDN域名未被广告规则屏蔽,否则fetch返回空字符串
const jq = await fetch('https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js').then(r => r.text());eval(jq);
重写@grant权限声明
第一步:删除所有@grant行(包括@grant none、@grant unsafeWindow、@grant GM_xmlhttpRequest等)
第二步:仅保留必需权限——v5.5+只认以下四种有效值:【GM_setValue、GM_getValue、GM_deleteValue、GM_xmlhttpRequest】,其他如unsafeWindow、clipboardWrite等已移除,强行声明会导致整个脚本不加载。
第三步:若脚本需操作页面DOM,无需声明任何@grant——v5.5+默认开放document访问权限;若需跨域请求,必须显式写@grant GM_xmlhttpRequest并配合@connect白名单。
用标准@match替代@include/@exclude
旧脚本中类似@exclude *://*.google.com/*的写法必须删除,v5.5+不识别该指令,且不会反向排除匹配。
将原@match *://*.example.com/*替换为两行:
@match https://*.example.com/*
@match http://*.example.com/*
若需排除子路径,不能用@exclude,而要改用JavaScript条件判断:if (location.href.includes('/admin/') || location.hostname === 'test.example.com') return;
强制指定@run-at时机
旧脚本若没写@run-at,v5.5+默认按document-start执行,此时document.body为null,querySelector必报错。
在元数据块中插入且仅插入一行:@run-at document-end
这是操作DOM类脚本的唯一安全时机,v5.5+不支持document-idle、document-ready等别名,写错即失效。











