如何解决Google App Engine,index.html在快速/反应应用中部署后缓存
我有一个nodejs10应用程序,已部署到Google App Engine。如果用户以前在Chrome中使用过该应用程序,则在重新部署该应用程序后该应用程序将无法运行。该应用程序是使用create-react-app创建的,并使用webpack构建的,因此在构建时将css和js重命名,但引用这些文件的index.html却没有。因此,当用户在部署后访问该站点时,它将获得引用不再存在的js / css文件的缓存index.html。这又导致Uncaught syntax error: unexpected token '<'
我发现重新使应用程序正常工作的唯一方法是打开检查器,禁用缓存并重新加载页面。不用说,这不是您可以要求最终用户执行的操作。
我正在寻找解决方案,发现了类似的问题,但并不完全相同,或者如果它们相同,则没有解决方案。
当未向现有静态文件发出请求以使React路由器正常工作时,快速代码将{。{1}}用作index.html:
res.sendFile
问题是我最近将应用程序从个人Google云帐户迁移到了我的企业帐户,而我以前从未遇到过此问题。因此,要么我更改了导致此的内容,要么App Engine更改了。
响应头(响应代码304)如下:
app.get('*',(req,res) =>{
try {
res.sendFile(path.join(public+'/index.html'))
} catch(e) {
res.status(404).send()
}
});
因此您可以看到文件上的“上次修改”日期是1980年1月1日。我已经验证了该文件实际上在应用程序引擎上具有上次修改的日期。但是在已部署的本地构建文件夹中,该文件具有当前日期。不知道这是什么导致了问题。
所以我有点迷路。我想我可以破解“最后修改的”标头,但是那感觉不像是一个好的解决方案。我还担心其他文件上可能发生相同的行为,这会导致类似的问题。有人遇到这个问题提出解决方案吗?
解决方法
我在奇怪的时间戳上遇到了完全相同的问题。
事实证明这是设计使然,因为所有时间戳在应用程序引擎部署时都设为零。参见:https://issuetracker.google.com/issues/168399701
我这样用快递解决了这个问题:
app.use("/",express.static(root,{ etag: false,lastModified: false }));
或者对于单个文件:
app.get("/*",async (req,res) => {
return res.sendFile("index.html",{ root,lastModified: false,etag: false });
});
,
如原问题所述,index.html上的etag是:
W/"967-49773873e8"
我认出了 etag,我的 appengine + express 网站上的一个 etag 示例是 W/"bd1-49773873e8"
之后我注意到我所有的 etags 都以相同的哈希值结尾:49773873e8
这应该是正在发送的文件正文的哈希值。
express 或应用引擎似乎出了点问题,导致哈希总是以 49773873e8
结尾
第一部分来自文件的长度,因此如果 2 个文件(或旧的 index.html)长度相等,则会发生哈希冲突。
,如评论中所述,您将不会清除客户端浏览器缓存。因此,这对您而言不是可行的解决方案。但是,考虑到一切正常,但只有缓存问题,我进行了搜索并找到了可能的选择。
似乎这个名为nocache
的存储库here是关闭缓存的中间件,可以在Javascript中使用。您只需要运行npm install --save nocache
来安装它,然后将以下几行添加到您的代码中即可。
const nocache = require('nocache')
app.use(nocache())
这是我在此案例here中找到的解决方案,它是停止在客户端进行缓存的解决方案。
,我怀疑您也在用包含app.use(express.static())
的目录呼叫index.html
。将模板文件从静态内容移到单独的目录。
人。
经过努力,我找到了正确的解决方案。
从express提供静态文件时,普通中间件不适用。您需要使用express.static中的自定义函数sort
。
- 一方面,当访问“ /”路由时,我们正在提供index.htmnl。这使用普通的快递标头
- 另一方面,通过静态服务请求index.html。这不使用其他标头。
所以我们需要涵盖两种情况。
代码如下:
setHeaders
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。