网站搜索

typescript - 当应用程序部署时在 Angular 13 中遇到 ChunkLoadError,但该块存在


我们有一个应用程序,最初是基于 Angular 11 的,后来升级到了 13。该应用程序在本地使用 'ng serve' 运行时没有问题,但一旦部署到我们的 Azure 应用服务上,应用程序就无法加载懒加载模块。错误是 ChunkLoadError(超时),并提供了无法加载的文件名——点击该文件会直接打开该文件,其内容是存在的。

几乎我遇到的每个问题/解决方案都与块文件不存在有关,因为应用程序已经更改,但缓存仍然指向旧的块文件。在我的情况下,文件确实存在,但由于某种原因加载失败。

我们的主要路由配置摘录:

     path: 'app', component: AppContainerComponent, canActivateChild: [OktaAuthGuard],
       children: [
        {
          path: 'dashboard',
          loadChildren: dashboardModule
        },

错误:

ERROR Error: Uncaught (in promise): ChunkLoadError: Loading chunk 817 failed.
(timeout: https://example.org/817.db7e09935e1b6a3b.js)
ChunkLoadError: Loading chunk 817 failed.
(timeout: https://example.org/817.db7e09935e1b6a3b.js)
    at r.f.j (runtime.980b937f2a57cd22.js:1:2660)
    at runtime.980b937f2a57cd22.js:1:845
    at Array.reduce (<anonymous>)
    at r.e (runtime.980b937f2a57cd22.js:1:824)
    at loadChildren (main.a0466523bce8e6ce.js:1:524541)
    at Xi.loadModuleFactory (main.a0466523bce8e6ce.js:1:3287175)
    at Xi.load (main.a0466523bce8e6ce.js:1:3286812)
    at main.a0466523bce8e6ce.js:1:3313088
    at ct.preload (main.a0466523bce8e6ce.js:1:3312029)
    at ut.preloadConfig (main.a0466523bce8e6ce.js:1:3313016)
    at Pt (polyfills.c77665f988682a29.js:1:16778)
    at Pt (polyfills.c77665f988682a29.js:1:16304)
    at polyfills.c77665f988682a29.js:1:17645
    at W.invokeTask (polyfills.c77665f988682a29.js:1:7920)
    at Object.onInvokeTask (main.a0466523bce8e6ce.js:1:3093065)
    at W.invokeTask (polyfills.c77665f988682a29.js:1:7841)
    at lt.runTask (polyfills.c77665f988682a29.js:1:3277)
    at k (polyfills.c77665f988682a29.js:1:9977)
    at invokeTask (polyfills.c77665f988682a29.js:1:9009)
    at G.invoke (polyfills.c77665f988682a29.js:1:8880)

我已经尝试多次重新加载应用程序,使用 PreloadAllModules,但错误仍然存在。也不是立即出现的错误,需要大约 30 秒或更长时间错误才会出现——在此之前应用程序只是静静地停在那里。

这可能与这个问题类似:Webpack 代码分割:ChunkLoadError - 加载块 X 失败,但块存在

因为这些块似乎在两种情况下都存在。然而,在我的情况下,我并没有在错误日志中看到报告,我实际上是在控制台中看到它们,因为应用程序无法正常加载。我也没有看到实际的解决方案,只看到另一个回应,说“文件可能不存在,所以你应该重新加载它”,但在这种情况下,这并不是问题所在。

答案#1

对于将来可能会偶然遇到这个问题的任何人,我找到了我的问题所在。我们的应用程序使用了一个叫 Osano 的工具,它用于管理隐私和 Cookie 政策。它的部分工作是让用户对网站使用的脚本和 Cookie 给予同意。一旦网站上线,除非脚本被加入白名单,否则不允许运行新的脚本。

在我的情况下,这阻止了这些块文件的加载,尽管它们确实存在于磁盘上。我们对本地开发和部署的策略一定不同,这就是为什么它可以在本地运行的原因。