我有一个web应用,允许用户添加JavaScript脚本,并在用户的浏览器中运行。当我本地开发新脚本时,我向应用程序添加了一个按钮,可以从本地运行的Web服务器加载它(即您单击它并输入http://path.to.my.pc:12345/script.js)。我的应用程序将获取此脚本并附加到DOM。
这些脚本被假定为ES6模块,Chrome可以正确递归导入这些模块。
但是,在本地运行时,我也希望用户能够进行“刷新”,以便应用程序再次访问他们的服务器以重新下载脚本。然而,Chrome似乎不想这样做。具体来说,尽管我的本地测试服务器已指定Cache-Control为no-store,但Chrome并不关心。即使我使用cacheBust script.js(例如http://blah/script.js?cb=randomInt),此cacheBust参数也不会递归传递给导入项。
这是我本地运行的开发服务器的文本:
const express = require("express");
const serveStatic = require("serve-static");
const morgan = require("morgan");
function setHeaders(res, path) {
res.setHeader('Cache-Control', 'no-store');
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', '*');
}
const app = express();
app.use(morgan('combined'));
app.use(serveStatic('./', { setHeaders });
app.listen(12345);
还有其他什么可以做吗?我真的不想强迫我的用户运行webpack。这个想法是保持尽可能简单和愚蠢,让他们专注于编写自己的脚本。
编辑更新:在Devtools中勾选“禁用缓存”也不能防止Chrome实际上... 不缓存。
Cache-Control
标头之前插入)?Cache-Control: no-store
可以防止新的缓存条目,但不能阻止浏览器使用现有的条目(Cache-Control: no-cache, no-store
将同时防止两者)。如果您能展示获取并将脚本附加到 DOM 的代码,那也会很有帮助。 - Heiko Theißen