这个问题说得非常好。
我会补充说,“删除”可能不是正确的名称,具体取决于设置。
我对这个问题的最初反应是这是一个缓存问题。旧的块文件被拾取而不是新的。至少在我的情况下,它接近正在发生的事情,我有以下几点:
index.js
const Page1 = lazy(() => import('./page/Page1'));
const Page2 = lazy(() => import('./page/Page2'));
const main = () => {
{
'/page1': Page1,
'/page2': Page2,
}[window.location.href](); /* Some Render Router Implementation */
};
- V1 部署在 (https://my-domain/distribution_folder/*)
- 用户将加载 V1
index.js
- V2 部署在 (https://my-domain/distribution_folder/*)
- 用户(未刷新)将使用其缓存的 V1
index.js
文件动态加载分块路由。
- 请求将被发送到 (https://my-domain/distribution_folder/{page_name}.{chunk_hash}.js)
- 将发生块错误,因为该唯一块将不再存在。
这很有趣,因为正在使用的提供商正在将流量迁移到新版本。所以我认为这将是它的结束,但我没有意识到任何用户仍然可以使用以前部署的版本 - 他们怎么知道?他们已经在使用该应用程序。浏览器已下载应用程序 ( index.js
)。
解决方案实际上取决于您在哪里动态导入这些块。在上面的例子中,因为它们是页面路由,当我们找不到块时,当用户请求不同的页面时,我们可以进行硬刷新。但是,这假设您的Cache-Control
标题设置正确。例如:
index.js
->Cache-Control: no-store
page/{page_name}.{chunk_hash}.js
->Cache-Control: public,max-age=31536000,immutable
我们可以使这些块不可变,因为有时它们在版本之间不会更改,如果它们不更改,为什么不使用缓存版本。但是,index.js
不能存储在缓存中,因为这是动态加载内容的“路由器”,并且总是会改变。
优点
- 没有更多的块加载错误
- 我们不需要在第一页加载时加载所有内容
- 没有服务人员,复杂性降低
缺点
相关问题