Ionic/Angular 引导两次,在 debug.apk 中有效但在发布时无效

Ionic/Angular bootstrapping twice, works in debug.apk but not on release

我对 Angular 或 Ionic 的了解并不深。也许它来了。但现在我有以下问题。

我有一个 Ionic 应用程序“ApplicationLatest”。这应该开始,做一些初步检查和罚款。但是如果这个检查失败,它应该完全切换 over/failover 到一个单独的“ApplicationOld”。

ApplicationLatest 在 main.ts 中:


        platformBrowserDynamic().bootstrapModule(AppModuleLatest)
            .catch(
              err => console.log(err)
            );

AppModuleLatest -> bootstrap: [AppComponent]

关于初始检查期间的发射器我触发了可能的故障转移

    this.parameterLoadError = this.initCheckup.routeError.subscribe((err) => {
    
        platformBrowserDynamic().bootstrapModule(AppModuleOld)
            .catch(
              err => console.log(err)
            );

    });

如果我创建 debug.apk

=> ionic cordova run android

但是当我运行发布

=> ionic cordova run android --prod --release

和运行我得到的带有强制故障转移的应用程序:

ERROR Error: A platform with a different configuration has been created. Please destroy it first.

但是如果我在引导 AppModuleOld 之前执行 destroyPlatform(); 屏幕保持 blank/white.

并抛出异常(我用 logcat 捕获)

09-25 09:24:02.052 20628 20628 D SystemWebChromeClient: http://localhost/main-es2015.9887f0567239099d41e3.js: Line 1 : ERROR Error: Uncaught (in promise): Error: No NgModule metadata found for 'od'.
09-25 09:24:02.052 20628 20628 D SystemWebChromeClient: Error: No NgModule metadata found for 'od'.
09-25 09:24:02.052 20628 20628 D SystemWebChromeClient:     at Gu.resolve (http://localhost/main-es2015.9887f0567239099d41e3.js:1:469088)
09-25 09:24:02.052 20628 20628 D SystemWebChromeClient:     at Nu.getNgModuleMetadata (http://localhost/main-es2015.9887f0567239099d41e3.js:1:454054)
09-25 09:24:02.052 20628 20628 D SystemWebChromeClient:     at Sh._loadModules (http://localhost/main-es2015.9887f0567239099d41e3.js:1:498940)
09-25 09:24:02.052 20628 20628 D SystemWebChromeClient:     at Sh._compileModuleAndComponents (http://localhost/main-es2015.9887f0567239099d41e3.js:1:498616)
09-25 09:24:02.052 20628 20628 D SystemWebChromeClient:     at Sh.compileModuleAsync (http://localhost/main-es2015.9887f0567239099d41e3.js:1:497741)
09-25 09:24:02.052 20628 20628 D SystemWebChromeClient:     at useClass.compileModuleAsync (http://localhost/main-es2015.9887f0567239099d41e3.js:1:509629)
09-25 09:24:02.052 20628 20628 D SystemWebChromeClient:     at zo (http://localhost/main-es2015.9887f0567239099d41e3.js:1:136755)
09-25 09:24:02.052 20628 20628 D SystemWebChromeClient:     at Qo.bootstrapModule (http://localhost/main-es2015.9887f0567239099d41e3.js:1:138680)
09-25 09:24:02.052 20628 20628 D SystemWebChromeClient:     at ld.initFailover (http://localhost/main-es2015.9887f0567239099d41e3.js:1:529186)
09-25 09:24:02.052 20628 20628 D SystemWebChromeClient:     at http://localhost/main-es2015.9887f0567239099d41e3.js:1:529730

脑子里有很多问题...

感谢任何提示和建议!

ionic --version
6.5.0

Angular CLI: 8.3.23
Node: 10.15.3
OS: linux x64
Angular: 8.2.13

在一些好朋友的帮助下,我们找到了可行的解决方案。

记住最初的平台


    const platformRef = platformBrowserDynamic();
    platformRef.bootstrapModule(AppModuleLatest)
        .catch(
          err => console.log(err)
    );

在故障转移期间,拿走 platformRef,只销毁那个。

    this.parameterLoadError = this.initCheckup.routeError.subscribe((err) => {
        // Destroy the old one
        platformRef.destroy();
        //bstrap a new one
        platformBrowserDynamic().bootstrapModule(AppModuleOld)
            .catch(
              err => console.log(err)
            );

    });

此外,我还必须更改 angular.json

中的以下参数
              "buildOptimizer": false,
              "aot": false,
              "outputHashing": "none",

它对我有用。在桌面和 (Android) 移动设备上。