为什么 downloadURL 和 updateURL 键的使用被称为异常,它们是如何工作的?

Why is usage of the downloadURL & updateURL keys called unusual and how do they work?

我正在阅读 GM's wiki 以确定 @downloadURL@updateURL 之间的区别(我没有)。但更让我困惑的是,两者都不明智:

It is unusual to specify this value. Most scripts should omit it.

我对此感到惊讶,因为这是脚本自动更新的唯一方式,我不明白为什么不应该使用这些密钥。

wiki 本身很缺乏,没有其他论坛来源被建议,所以我不得不在这里问。也希望获得有关这些密钥的更多详细信息。

主要是 Greasemonkey 的首席开发人员不鼓励使用这些密钥。大多数其他人,包括 the Tampermonkey team 认为不需要这样的警告。
另请注意,这些指令 而不是 始终是自动更新工作所必需的。

他会说这是不寻常的并且 "most" 脚本应该省略它的一些原因:

  1. 在大多数情况下都不需要,请参阅下面的更新工作原理以及这些指令的工作原理。
  2. 添加和使用这些指令只是脚本编写者必须检查和维护的更多项目。如果不需要,为什么要工作?
  3. 更新实现和那些指令have been buggy,也许在 Greasemonkey 中没有很好地实现。
  4. Tampermonkey 和其他引擎以稍微不同的方式实现更新和那些指令。这意味着在 Tampermonkey 上运行的代码在 Greasemonkey 上可能会失败。

请注意,该 wiki 条目是 made by Greasemonkey's lead developer (Arantius) himself;所以这不仅仅是 wiki 噪音。


更新的工作原理:

脚本更新分 4 个阶段进行:

  1. 启用阶段and/or"forced"更新。
  2. 检查阶段。
  3. 下载阶段。
  4. 解析和安装阶段。

对于这个问题,我们只关心checkdownload两个阶段。我们规定更新已启用并且更新的脚本有效且安装正确。

更新脚本时,Greasemonkey(和 Tampermonkey)下载文件两次

  1. 第一次下载,由脚本的 updateURL 值控制,只是为了检查文件的 @version(如果有)和日期 -- 查看是否有可用更新。
  2. 第二次下载,由脚本的 downloadURL 值控制,是要安装的新脚本的实际下载。 仅当服务器文件的 @version 编号高于本地文件 and/or 且服务器文件的日期晚于本地文件时,才会进行此下载。 (请注意,脚本引擎之间存在重大差异。)

    请参阅下面的 "Why you might use @downloadURL and @updateURL",了解使用 2 个文件下载的原因。



@downloadURL@updateURL 的工作原理:

@downloadURL 仅覆盖默认的内部 "download URL" 位置。
@updateURL 仅覆盖默认的内部 "update URL"(或检查)位置。
在大多数情况下,没有必要这样做。见下文。

  1. 当您安装用户脚本时,Greasemonkey 会自动记录安装位置。 不需要元指令。 默认情况下,Greasemonkey 将在此处检查 更新并下载 任何更新。
  2. 但是,如果指定 @downloadURL,那么 Greasemonkey 将 both 检查并从指定位置下载,而不是从存储位置。
  3. 但是,如果指定了 @updateURL,那么 Greasemonkey 将从给定的 "update" 位置检查(而不是下载)。

因此:@updateURL 覆盖 @downloadURL 和默认位置,仅用于 检查 操作。
同时:@downloadURL 覆盖 checkingdownloading 的默认位置(除非存在 @updateURL)。



为什么你可以使用 @downloadURL@updateURL:

首先,有 2 次下载 并且可能有 2 个不同的位置,主要是出于速度和带宽原因。 考虑一个非常大的用户脚本有数千个用户的场景:

  • 那些用户的浏览器会不断地敲击主机服务器,检查是否有更新可用。大多数时候,一个人不会,并且会不必要地一遍又一遍地下载大文件。 对于像现在已经不存在的网站 userscripts.org.
  • 这样的网站来说,这一定是个问题
  • 因此开发了一个系统,其中创建了一个单独的文件来保存版本(和日期)信息。所以服务器现在有 veryLarge.user.jsveryLarge.meta.js
  • veryLarge.meta.js 将在每次用户脚本更新时(由开发人员)更新,并且只会包含来自 veryLarge.user.js.
  • the Metadata Block
  • 因此成千上万的浏览器只会重复下载更小的文件 veryLarge.meta.js -- 节省每个人的时间并节省服务器带宽。

如今,Greasemonkey 和 Tampermonkey 都会自动查找 *.meta.js 文件,因此 通常不需要单独指定。

那么,为什么要明确指定@downloadURLand/or@updateURL一些可能的原因:

  1. 您的脚本可以通过多种方式或从多个来源(剪切和粘贴、本地复制的文件、辅助服务器等)安装,您只想维护一个 "master" 版本。
  2. 你想要to track how many initial and/or upgrade downloads your script has.
  3. @downloadURL 也是 recording/conveying 用户从中获取脚本的便捷 "self documenting" 方式。
  4. 出于某种原因,您希望 *.meta.js 文件与用户脚本位于不同的服务器上。
  5. 可能是 http 与 https 的问题(有朝一日需要深入研究)。
  6. 你是个坏人,你希望脚本在未来的某个日期从你控制的服务器更新恶意版本——这不是安装脚本的地方。


Greasemonkey 和 Tampermonkey 之间的一些区别:

(警告:我已经有一段时间没有验证所有这些了。由于 Tampermonkey 不断改进(并且 Greasemonkey 也发生了很多变化),无论如何都会发生变化。)

  1. Tampermonkey 需要对当前文件和较新文件使用 @version 指令。这就是 Tampermonkey 确定更新是否可用的方式。

    Greasemonkey 也将使用此方法,因此始终在您可能希望自动更新的脚本中包含 @version

    不过,Greasemonkey 也要求更新文件要更新。如果没有版本,Greasemonkey 只会比较日期。请注意,这在过去曾导致 Greasemonkey 出现问题,并且还愚蠢地假设许多不同的机器都与正确的日期和时间准确同步。

  2. Greasemonkey 默认只会从 https:// 方案更新,但可以选择设置为允许 http://ftp:// 方案。

  3. 两个引擎都不允许来自 file:// 方案的更新。