Amazon s3 创建react应用程序:从CDN提供index.html,并在新版本后加载正确的静态资产
Context:当使用create-react应用程序并通过CDN(CloudFront)+S3(源服务器)托管它时,每当生成新的构建时,build index.html引用文件名中带有更新的“hash”的静态资产,以处理这些资产的缓存破坏 缓存:根据create react应用程序文档,建议将静态文件(js、css、媒体)长期缓存到期(缓存控制:最大年龄=31536000),对于index.html:缓存控制:无缓存 我发现这种方法的问题是,index.html总是从源服务器(s3)获取,而CDN被绕过。这将导致延迟,并破坏使用CDN提供快速页面加载的目的 在参考了很多文章之后,我考虑了一些选项,但我没有找到一个看起来很理想的解决方案: 选项1:不要在S3上的index.html上设置缓存控制头,让CDN(CloudFront)为其服务。每当部署新版本时,显式使CDN上index.html的缓存无效 问题:当任何CDN上的缓存密钥无效时,其所有边缘服务器可能需要几分钟才能反映更新的s3对象(index.html)。在此时间窗口期间,从CDN获取旧index.html服务的浏览器将尝试从CDN下载旧静态资产(js、css),如果缓存未命中,CDN将尝试从源服务器(S3)下载S3存储桶中不再存在的资产。这将导致某些遇到此竞争条件的用户无法加载应用程序 选项2:从CRA中弹出,生成一个散列输出文件夹(webpack会自动生成该文件夹),所有静态资产都放置在该文件夹中。创建一个“version.json”文件,在该json文件中写入此输出构建文件夹的名称,并将其上载到S3。 在index.html中,有一个内联脚本,它获取两个文件:Amazon s3 创建react应用程序:从CDN提供index.html,并在新版本后加载正确的静态资产,amazon-s3,caching,create-react-app,amazon-cloudfront,Amazon S3,Caching,Create React App,Amazon Cloudfront,Context:当使用create-react应用程序并通过CDN(CloudFront)+S3(源服务器)托管它时,每当生成新的构建时,build index.html引用文件名中带有更新的“hash”的静态资产,以处理这些资产的缓存破坏 缓存:根据create react应用程序文档,建议将静态文件(js、css、媒体)长期缓存到期(缓存控制:最大年龄=31536000),对于index.html:缓存控制:无缓存 我发现这种方法的问题是,index.html总是从源服务器(s3)获取,而C