Anix2012 Anix2012
我读得书少,你不要骗我
关注数: 5 粉丝数: 45 发帖数: 122 关注贴吧数: 23
Greasemonkey 4 致脚本作者 本帖翻译自 https:%%http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.greasespot.net%2F2017%2F09%2Fgreasemonkey-4-for-script-authors.html&urlrefer=359a5be3be3de8d49d6ecab28e7c6bc3(要访问链接,把%%改为//,下同) 2017年9月20日星期 Greasemonkey 4 致脚本作者 正如在后文中提到的,Greasemonkey 4正在改变为与浏览器扩展API(Browser Extension API)兼容。 这个API的核心是完全异步的。 Greasemonkey的旧版的“GM_”API通常是同步的。 为什么? 现有的其他用户脚本引擎已经做了桥接(bridging the gap)。 Greasemonkey已经选择专门朝着一个更高性能的异步模式。 在未来,这样的脚本会更快。 什么? Greasespot Wiki已更新,解释了Greasemonkey 4的细节。 这里给出一个简短的总结。 首先,只有一个嵌入式编辑器。 浏览器扩展无法访问(电脑本地)文件系统,因此您不能再在熟悉的文本编辑器中编写用户脚本了。 现在只有一个对象可以给用户脚本调用,名为GM。 它有几个属性。 其中之一是info - 相当于旧版的GM_info。 这个对象还有几个方法: getResourceUrl,deleteValue / getValue / listValues / setValue,xmlHttpRequest。 要使用这些方法,您仍然需要@grant,并使用新名称,例如: // @grant GM.setValue 新的形式是一个点,旧的形式是一个下划线。 如果您希望同时兼容Greasemonkey 4和其他用户脚本引擎,则可以同时指定(多个)@grant。 目前,已经不支持: GM_log(使用console.log),GM_addStyle,GM_registerMenuCommand或GM_getResourceText。 一般来说,这些方法和旧的方法一样,但是它们的返回值是Promise类。 async和await关键字使异步的promise易用。 例如: // ==UserScript== // @name GM set/get demo // @grant GM.getValue // @grant GM.setValue // ==/UserScript== (async function() { console.log('Starting the get/set demo ...'); let i = await GM.getValue('i', 0); console.log(`This time, i was ${i}.`); GM.setValue('i', i+1); })(); 在这里,GM.getValue()方法实际上返回一个promise,但是await关键字将它彻底(transparently)转换成它的resolved值,使我们可以像直接返回值一样编写代码 - 既不需要回调函数,也不需要用promise的resolve方法。 详情请参阅关于async和await的文档。 如果您希望您的脚本与Greasemonkey 4和Greasemonkey 3(或其他用户脚本引擎)兼容,我们提供了一个polyfill,这使得新型API调用可以在旧引擎上运行。 要使用它:1)在@grant行保持你的旧的API,2)在@grant行添加一个新的API ,3)引入polyfill脚本,4)切换您的代码使用新的API风格(可能异步/等待)。 所以上面的例子可能看起来像这样: // ==UserScript== // @name GM set/get demo // @require https:%%greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js // @grant GM.getValue // @grant GM_getValue // @grant GM.setValue // @grant GM_setValue // ==/UserScript== ... 使用与上面完全相同的新API风格的代码。 这样的脚本可以安装在Greasemonkey 4或Greasemonkey 3(或TamperMonkey,或ViolentMonkey等)中,并按预期运行。 unsafeWindow 由于新的扩展系统给我们的能力越来越有限,我们目前无法使@grant none脚本以相同的方式工作。 最重要的是,它们与unsafeWindow有不同的联系。 至少在短期内,采用cloneInto和exportFunction是个好方法。 命名 请注意,新风格的API名称略有不同。 总之,一致的命名风格已被采用:所有的单词和首字母缩略词都得到一致的情况。 那么GM_getResourceURL现在是GM.getResourceUrl。 以前的GM_xmlhttpRequest现在是GM_xmlHttpRequest。 在不久的将来,Greasespot Wiki将更新所有新API的细节,包括具体案例的确切名称。 反馈 我们欢迎反馈意见,通过greasemonkey用户讨论组联系。 请记住这个开源项目的志愿者性质! 发贴者arantius于1:57 PM
1 下一页