Javascript “处理”;“加载区块失败”;延迟加载/代码拆分错误
我们正在开发一个基于Vue CLI 3的Vue.js应用程序,其中包含Vue路由器和网页包。用于破坏缓存的和。总的来说,一切正常 但是,在部署过程中存在一个问题。复制的步骤如下Javascript “处理”;“加载区块失败”;延迟加载/代码拆分错误,javascript,vue.js,webpack,lazy-loading,code-splitting,Javascript,Vue.js,Webpack,Lazy Loading,Code Splitting,我们正在开发一个基于Vue CLI 3的Vue.js应用程序,其中包含Vue路由器和网页包。用于破坏缓存的和。总的来说,一切正常 但是,在部署过程中存在一个问题。复制的步骤如下 用户打开应用程序(假设路由“/”),从而加载主块文件 我们在应用程序中更改了一些内容,并部署了一个新版本。 旧块文件将被删除 正在添加新的区块文件(即区块文件名中的哈希值更改) 用户单击指向其他路由的链接(例如“/foo”) 应用程序尝试加载已重命名的区块文件时出错:error:“加载CSS区块foo失败。”。
- 用户打开应用程序(假设路由“/”),从而加载主块文件
- 我们在应用程序中更改了一些内容,并部署了一个新版本。
- 旧块文件将被删除
- 正在添加新的区块文件(即区块文件名中的哈希值更改)
- 用户单击指向其他路由的链接(例如“/foo”)
- 应用程序尝试加载已重命名的区块文件时出错:
(这可能是css或JavaScript)error:“加载CSS区块foo失败。”。 (/assets/css/foo.abc123.css)“
- 应用程序尝试加载已重命名的区块文件时出错:
- 一种可行的方法是保留旧块文件,然后在以后删除它们。但是,这会使新版本的部署变得复杂,因为您需要跟踪旧版本,并始终使用新版本部署旧块文件
- 另一种(幼稚的)方法是在检测到此类错误后立即重新加载(例如)。它在某种程度上起作用,但它会重新加载旧路线,而不是新路线。但至少它可以确保连续的路线更改再次起作用
还有其他想法吗?也许网页包中有什么东西可以解决这个问题?只要你有一个版本化的API,你就可以使用旧的应用程序文件(只需将它们留在服务器上,几天后删除即可) 在部署过程中,只要API发生更改,您就会遇到问题 我假设,每次部署新的JS代码时都会部署一个新的API 然后你可以:
- 将API版本(只需使用git哈希)作为每个响应(JS资源、CSS、API请求、404响应)的头传递给应用程序
- 将API版本存储在主JS入口点中(或以某种方式使其可访问,例如作为生成的常量)
- 在每个服务器响应上,检查服务器版本是否与主客户端版本匹配
- 如果没有:向用户显示一个突出的警告(如cookie横幅),提示用户应该重新加载页面(=>允许用户保存技术,希望API没有为该保存按钮更改)
然后,在刷新客户端代码后,您可以使用vue路由器的错误挂钩检测错误并正确执行操作。热重新加载(webpack)不应该完全按照您的要求执行吗?@bigless在开发过程中是的,但在生产过程中不是。在生产过程中动态哈希链接又称块不是一个好主意。它应该是查询参数或锚点的形式,但不是在文件名中抛出404..@bigless哈希的链接显然有其问题,但据我所知,这是行业标准(例如)。查询参数在几年前还不能很好地工作(例如,由于代理),但它们可能在今天工作。我在这方面找不到确切的资料。但是锚定肯定不起作用。我们在生产中使用查询版本控制已经多年了,而且很有效。我们在包构建时将版本(f.e.?v=1.66.5)生成到模板中,并将其作为页面上每个本地资源的后缀。
expires 0;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate';