如何在AWS Amplify Hosting中保留旧构建的工件?
解决AWS Amplify部署后旧用户因缺失JS文件崩溃的问题
核心原因
AWS Amplify每次部署都会启动全新的Docker容器执行构建流程,容器内的文件系统是临时且独立的——上一次构建的产物不会被带到新容器里,所以你设置vite的build.emptyOutDir: false根本没用,因为新容器的输出目录本来就是空的,没有旧文件可保留。
可行解决方案
给静态资源加哈希后缀(最推荐)
让vite在构建时给JS、CSS等资源文件名加上唯一哈希,这样新构建的文件和旧版本文件名完全不同,Amplify会同时保留新旧文件,旧用户访问时不会出现文件缺失。
修改vite配置文件:export default defineConfig({ build: { rollupOptions: { output: { entryFileNames: `assets/[name].[hash].js`, chunkFileNames: `assets/[name].[hash].js`, assetFileNames: `assets/[name].[hash].[ext]` } } } })同时调整Amplify的缓存规则:给
index.html设置5分钟以内的短缓存,确保用户能及时获取最新入口文件;给带哈希的静态资源设置1年的长缓存,提升加载性能。用分支预发布+流量切换
先在开发分支完成构建和测试,确认没问题后,再通过Amplify控制台将生产流量切换到这个新分支。旧用户在切换前一直访问旧分支的稳定版本,切换后统一加载新版本,彻底避免中间状态的文件缺失问题。自定义构建脚本合并旧产物
如果必须保留无哈希的旧文件,可以在Amplify构建脚本中先从Amplify关联的S3桶同步旧构建文件,再执行vite构建:# 同步S3桶里的旧构建文件到当前dist目录,排除index.html避免覆盖新入口 aws s3 sync s3://<你的Amplify存储桶名>/<分支名>/build ./dist --exclude "index.html" # 执行vite构建 vite build注意:需要给Amplify的构建IAM角色添加对应S3桶的读写权限,否则无法同步文件。
内容的提问来源于stack exchange,提问作者James Raynor
相关产品推荐
相关产品推荐

