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
脑子里有很多问题...
- 为什么可以在debug.apk中运行?
- 但一般来说:这样的故障转移可能吗?
感谢任何提示和建议!
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) 移动设备上。
我对 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
脑子里有很多问题...
- 为什么可以在debug.apk中运行?
- 但一般来说:这样的故障转移可能吗?
感谢任何提示和建议!
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) 移动设备上。