level 5
Anix2012
楼主
本帖翻译自 https:%%http://www.greasespot.net/2017/09/greasemonkey-4-for-script-authors.html(要访问链接,把%%改为//,下同)
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
2018年01月08日 04点01分
1
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