我们已经将Vue SPA部署到Google App Engine,并且完全由静态处理程序提供服务。
我们面临的问题是,如果用户在我们的站点中期部署中处于活动状态,那么他们的旧Webpack块清单将变得无效(因为某些块的哈希值被覆盖)。如果他们现在尝试路由到新页面,并且该页面尝试获取被覆盖的块,则会出现以下错误:
ChunkLoadError: Loading chunk Conversations failed.
(error: https://example.com/js/Conversations.71762189.js)
理想情况下,我们希望保留N
(2-3个)应用程序静态文件的先前版本。
是将所有资产推送到Cloud Storage Bucket的唯一选择吗?如果是这样,我们将如何修剪较旧的版本?
这里是我的app.yaml
供参考:
runtime: nodejs10
instance_class: F4
automatic_scaling:
min_instances: 2
max_instances: 10
default_expiration: "30d"
error_handlers:
- file: default_error.html
handlers:
- url: /api/*
secure: always
redirect_http_response_code: 301
script: auto
- url: /js/*
secure: always
redirect_http_response_code: 301
static_dir: dist/js
- url: /css/*
secure: always
redirect_http_response_code: 301
static_dir: dist/css
- url: /img/*
secure: always
redirect_http_response_code: 301
static_dir: dist/img
- url: /(.*\.(json|js|txt))$
secure: always
redirect_http_response_code: 301
static_files: dist/\1
upload: dist/.*\.(json|js|txt)$
expiration: "10m"
- url: /.*
secure: always
redirect_http_response_code: 301
static_files: dist/index.html
upload: dist/index.html
expiration: "2m"
答案 0 :(得分:3)
当部署覆盖接收到流量的现有服务版本(即服务版本未更改)时,通常会发生此问题。来自Deploying an app:
注意:如果您部署的版本指定的版本ID与App Engine上已经存在的版本相同,则您将 deploy将覆盖现有版本。如果这可能会出现问题 该版本正在提供流量,因为到您的应用程序的流量 可能会被打乱。如果您进行部署,则可以避免干扰流量 您的新版本具有不同的版本ID,然后将流量移至 该版本。
只要已部署服务版本且未删除或覆盖该服务版本,其相应的静态资产仍可访问。
为防止出现此问题,请始终使用新的服务版本进行部署,然后(逐步)将流量迁移到新部署的版本。保持最新的N种服务版本将为您提供所需的N套静态资产。
通常,出于其他一些原因,这种部署做法是好的/推荐的做法:
答案 1 :(得分:3)
使用--no-promote
标志进行部署,并利用标准环境中的Traffic Migration功能将流量逐渐迁移到新版本,以便所有用户在新版本出现时都不会立即切换版本上线。 App Engine将在一段时间内托管新旧版本(或“蓝色”和“绿色”),直到所有流量都指向新版本,然后旧版本将被关闭。
另请参阅: