Reactjs AWS CloudFront如何更新现有的S3文件?

Reactjs AWS CloudFront如何更新现有的S3文件?,reactjs,amazon-web-services,amazon-s3,amazon-cloudfront,Reactjs,Amazon Web Services,Amazon S3,Amazon Cloudfront,我使用AWS的CloudFront,我有一个S3静态网站。 我使用ReactJs,并且在大多数页面上更改了一些文本。 我现在的问题是我使用 npm运行构建 生成生产应用程序。我想更新我之前上传的相同文件中S3 bucket中AWS的内容,但是发生了两件事: -当我以匿名方式访问时,一切正常,我得到了网站的更新版本 -当我使用以前访问该网站的web浏览器以正常模式访问时,我仍然会收到旧版本的文件 我访问了,我有两个解决方案: -等待24小时,让CloudFront在边缘位置缓存文件 -使用文件的版

我使用AWS的CloudFront,我有一个S3静态网站。 我使用ReactJs,并且在大多数页面上更改了一些文本。 我现在的问题是我使用

npm运行构建

生成生产应用程序。我想更新我之前上传的相同文件中S3 bucket中AWS的内容,但是发生了两件事:

-当我以匿名方式访问时,一切正常,我得到了网站的更新版本

-当我使用以前访问该网站的web浏览器以正常模式访问时,我仍然会收到旧版本的文件

我访问了,我有两个解决方案:

-等待24小时,让CloudFront在边缘位置缓存文件

-使用文件的版本名例如,将image.jpg的名称更改为image_1.jpg;图2.jpg等

我肯定会选择第二种选择,这确实很耗时,但肯定不到24小时。我应该更改构建中的每个文件的名称还是仅更改静态文件的名称

还有其他解决办法吗


我没有尝试过的是,在上传到AWS S3之前,创建一个像V1这样的文件夹并上传我的react文件。当我进行更改时,我调用文件夹V2,以此类推

使用版本名是最可靠的方法。它使您能够完全控制缓存行为,而不会与CloudFront发生冲突。 因此,是的,每次有新版本更新您的文件名。 顺便说一句,如果您使用CreateReact应用程序引导react应用程序,那么默认情况下构建过程会这样做。每次包更改时,它都会使用唯一的散列来命名每个包。这样,您可以利用浏览器中的长期缓存和文件的CF


您可能仍然需要在每个部署中使root index.html无效,因为它的名称在不同版本之间不会更改。

您多久执行一次?因为如果不是每月少于1000次,那么你是在免费层,你可以使缓存失效。当然,每月少于1000次。然而,让我们考虑1年后,这将不再是免费的,亚马逊提供的“可扩展性”。但是感谢这个解决方案,我正在考虑使reactWell制作的静态文件夹的缓存失效。在免费层之后,每次失效的成本为0.005美元,我不认为一旦你的应用程序完成,你真的不需要这么多的失效。您将只添加改进。您还可以为S3添加触发器,这样您就可以使用Lambdas自动失效:@Cristian请注意,每个帐户每月1000条失效路径不是免费层的一部分-这是一项持续津贴。无论您拥有帐户多长时间,每个帐户每月都允许1000条失效路径。通配符(包括/*使分布中的所有内容无效)仅计为1,无论它们匹配多少个对象。