typescript Angular 2.误差:加载块失败

hjqgdpho  于 2023-02-17  发布在  TypeScript
关注(0)|答案(9)|浏览(131)

使用带有延迟加载模块的angular2,我可以从服务器接收(例如)401HTTP代码
Bootstrap 0b40费用...:101获取http://localhost:8082/2.chunk.js

Error: Loading chunk 2 failed.
at HTMLScriptElement.onScriptComplete (bootstrap 0b40fee…:91)
at HTMLScriptElement.wrapFn (zone.js:1032)
at ZoneDelegate.invokeTask (zone.js:414)
at Object.onInvokeTask (core.es5.js:4119)
at ZoneDelegate.invokeTask (zone.js:413)
at Zone.runTask (zone.js:181)
at HTMLScriptElement.ZoneTask.invoke (zone.js:476)

如何处理此错误?

fv2wmkja

fv2wmkja1#

有关详细信息,请检查my answer

  • 绕过此区块失败错误的解决方案=〉如果使用global error handler发生区块失败错误,则以编程方式强制应用重新加载。
import { ErrorHandler } from '@angular/core';

@Injectable()
export class GlobalErrorHandler implements ErrorHandler {

  handleError(error: any): void {
   const chunkFailedMessage = /Loading chunk [\d]+ failed/;

    if (chunkFailedMessage.test(err.message)) {
      window.location.reload();
    }
  }
}
  • 在根模块中提供它以更改应用中的默认行为,因此我们使用自定义GlobalErrorHandler类,而不是使用默认ErrorHandler类。
@NgModule({   
  providers: [{provide: ErrorHandler, useClass: GlobalErrorHandler}]
})
jfgube3f

jfgube3f2#

我也遇到了同样的问题,所以我进行了调查。我找到了解决方案。当我重新部署到另一台服务器时,块有一个[散列],这种情况发生在我身上。
您可以在如下的catch all中捕获错误:

ngOnInit() {
    if (!this.previousRouterErrorHandler) {
        this.previousRouterErrorHandler = this.router.errorHandler;
        let that = this;
        this.router.errorHandler = function (err: any) {
            // Handle here. err.message == "Loading chunk chunk-name failed."

            return that.previousRouterErrorHandler.apply(that.previousRouterErrorHandler, arguments);
        };
    }
}

或直接在导航的链接处

click() {
    this.router.navigate(['/lazy-route'])
        .catch(err => {
            // Handle here
        });
}
pengsaosao

pengsaosao3#

下面是我的解决方案,我将这个服务作为一个单例注入到我的app / core模块中。
它等待来自路由器的NavigationError示例,检查它们是否是X1 M0 N1 X的,然后重定向到用户无论如何都想去的地方。

// Angular
import { Injectable, OnDestroy } from '@angular/core';
import { Router, NavigationError } from '@angular/router';
// Rxjs
import { Subscription } from 'rxjs';
import { filter } from 'rxjs/operators';

@Injectable()
export class ChunkErrorHandler implements OnDestroy {
  private subscription: Subscription;

  constructor(router: Router) {
    this.subscription = router.events
      .pipe(filter(event => event instanceof NavigationError))
      .subscribe(event => {
        this.handleRouterErrors(event as NavigationError);
      });
  }

  ngOnDestroy() {
    this.subscription.unsubscribe();
  }

  private handleRouterErrors(event: NavigationError) {
    if (event.error.name === 'ChunkLoadError') {
      window.location.href = `${window.location.origin}${event.url}`;
    }
  }
}
kyxcudwk

kyxcudwk4#

当部署新代码时会发生这种情况。保存文件和哈希的manifest.js在不刷新的情况下不会更新,当它加载块时,显然使用了manifest.js中的旧哈希。
因此,在捕捉错误时,我们可以使用给定的url:-强制重载

click() {
      this.router.navigate(['/lazy-route'])
           .catch(err => {
              // Handle here
              // reload with given route
              // window.location.pathname('/lazy-route');

              // OR
              // reset existing route(containing query params) with given route and force reload
               window.history.pushState({}, document.title, '/lazy-route' );
               window.location.reload();
           });
 }
nom7f22z

nom7f22z5#

任何环境或路由选择相关问题都可能引起与块相关的错误,使得它们难以被揭穿。
在我的例子中,在PWA中移动的数据量太大,Angular 路由器无法处理,它会淹没js块getter的头,从而引发bad_request错误。
我建议你检查一下那些网络调用(像chunks.js的getter),看看头文件中是否有任何不寻常的地方,并在你当前的开发环境中重构粗略的东西,因为这是一个真实的的黑洞,需要你自己调查错误的来源。
希望能有所帮助

slhcrj9b

slhcrj9b6#

看看渔获物储藏室,我猜服务人员在渔获物储藏室里保存一些东西

mu0hgdu0

mu0hgdu07#

console.log(Object.entries(error));

这有助于我了解错误内部的内容
拒绝、承诺、区域、任务
下面是我的解决方案:

handleError(error) {
        switch (error?.rejection?.name) {
            case 'ChunkLoadError':
                window.location.href = window.location.href;
                break;

            default:
                break;
        }
    }
to94eoyn

to94eoyn8#

在我的例子中,我把我的文件放进了一个S3桶里。我一直收到这个错误,因为它一起调用了错误的文件名,并返回了一个HTML错误响应。
在某个时候,我让IT团队知道发生了什么。他们说,让我们使CloudFront上该高速缓存无效...什么?!耶!让我们这样做...
这个故事的寓意是,如果您一直在Web上搜索此错误的答案,但没有找到任何答案,请与IT团队或任何可能缓存index.html文件的地方进行检查。

ar7v8xwq

ar7v8xwq9#

这可能意味着未处理的异常.你必须到处理错误响应(4xx,5xx状态代码)从服务器在任何方式你想要:在某处显示错误消息,重定向到某个页面,执行任何操作,但不要让它不被处理。
例如:

return this.http.get(requestDetails)
          .map(res => res.json())
          .catch(err => {
console.log('server error:', err)
Observable.throw(err);
});

相关问题