如何阻止@require缓存外部js脚本

时间:2015-05-07 19:05:00

标签: javascript firefox greasemonkey scriptish

我正在尝试弄清楚如何在我的网络服务器中添加javascript,我的脚本/ greasemonkey脚本,并在每次调用usercript时重新加载脚本。

我正在我的网络服务器上编辑脚本,每次我对包含的脚本进行更改时,我都不想重新安装用户脚本。

有没有解决这个问题的方法?我一直在寻找答案但到目前为止没有运气。

所以要清楚,我的用户脚本看起来像这样:

// ==UserScript==
// @id             HET
// @name           SettingsHandler
// @version        1.0
// @namespace      HET
// @require        http://urltoscript/scripts/he/lib.js
// @run-at         document-end
// ==/UserScript==

我的外部脚本如下所示:

alert('got it');

所有这些都非常容易用于测试目的。此设置有效,但只是第一次,当我更改我的lib.js脚本时,usercript仍然读取旧脚本。有没有办法阻止用户脚本缓存外部脚本?或者还有其他可以帮助我的元数据吗?

提前致谢, 戴夫

4 个答案:

答案 0 :(得分:4)

不确定如何使用GM / userscript指令完成此操作,但您可以自己轻松添加脚本并在网址上附加时间戳以防止浏览器缓存它:

var remoteScript = document.createElement('script');
remoteScript.src = 'http://domain.com/path/to/script.js?ts='+(+new Date());
remoteScript.onload = init;
document.body.appendChild(remoteScript);

function init() {
  ... do stuff
}

答案 1 :(得分:1)

这是唯一可行的答案 https://github.com/Tampermonkey/tampermonkey/issues/475

推荐为选项4。但是,由于它们是异步加载的,因此加载顺序可能会有所不同

  

有几种减轻疼痛的方法。 :)

     
      
  1. 您可以在保存脚本和所有脚本之前增加版本号   外部资源将被重新加载。
  2.   
  3. 将“配置模式”设置为   “高级”可以配置外部更新间隔。注意:   “始终”仍然表示资源使用后。所以你可能需要   执行/加载页面两次。
  4.   
  5. 如果您使用的是Tampermonkey Beta(Chrome或   Firefox),您可以就地编辑外部资源(因为在那里   现在是删除按钮旁边的编辑按钮)。
  6.   
  7. 复制资源   并将它们存储在本地。在启用“本地文件访问”后   Chrome的扩展程序管理页面或Tampermonkey的设置页面(如果   您正在使用Firefox),则可以@@通过本地文件:// URI来获取它们。
  8.   

答案 2 :(得分:0)

您可以将以下内容添加到.htaccess文件中:

<FilesMatch "filename.js">
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "0"
</FilesMatch>

完成开发后将其删除。

答案 3 :(得分:0)

Rob M.的答案对我不起作用,因为Tampermonkey脚本位置注入的目标位置可能不同。例如,就我而言,我还有一个本地运行的Web服务器,可以使用Tampermonkey for Firefox在IDE中进行开发,而无需从浏览器访问Tampermonkey的任何文件系统。

此脚本应注入到example.com之类的第三方网站,并在其中进行修改。因此,浏览器将阻止此脚本,因为它来自与example.com不同的域。

在开发过程中,我希望我的脚本无需任何缓存即可立即应用更改。通过使用`GM.xmlHttpRequest获取脚本内容来解决此问题。此外,具有当前时间戳记的GET参数还可以用作缓存无效化器:

let url = `http://localhost/myscript.js?ts=${(+new Date())}`

GM.xmlHttpRequest({
    method: "GET",
    url: url,
    onload: function(response) {
        let remoteScript = document.createElement('script')
        remoteScript.id = 'tm-dev-script'
        remoteScript.innerHTML = response.responseText
        document.body.appendChild(remoteScript)
    }
})

请注意,由于GM.xmlHttpRequest可以绕过相同的原始策略,因此访问权限必须明确地放在脚本的开头:

// @grant        GM.xmlHttpRequest