我们正在使用升级适配器来设置 Angular 1/2 Hybrid 应用程序。我们正在像这样引导应用程序(如 Angular 文档https://angular.io/guide/upgrade中所述):
class AppModule {
constructor(private upgrade: UpgradeModule) { }
ngDoBootstrap() {
this.upgrade.bootstrap(document.body, ['ngApp'], { strictDi: true });
}
}
对于我们的 HMR 设置,我们使用 Angular CLI 并遵循这些说明https://github.com/angular/angular-cli/blob/master/docs/documentation/stories/configure-hmr.md
问题是,当 HMR 运行并尝试再次运行该引导代码时,它会尝试重新引导 Angular 1 应用程序,这会导致 Angular 1 模块已被引导的错误。
如果尚未引导 angular 1,则尝试仅有条件地运行该代码也行不通,因为虽然组件确实刷新,但它不会重新加载新的更新。
我们采用了一些似乎可行但不太理想的方法,即删除 angular 1 应用程序元素并重新创建它,以便引导程序不会出错。
像这样的东西:
ngDoBootstrap() {
// reinitialize angular 1 app
var element = document.getElementById('ng-app');
let windowRef = <any>window;
if(!windowRef.appContents) {
windowRef.appContents = element.innerHTML;
} else {
document.body.removeChild(element);
element = document.createElement('div');
element.id = 'ng-app';
element.innerHTML = windowRef.appContents;
document.body.appendChild(element);
}
this.upgrade.bootstrap(element, ['ngApp'], { strictDi: true });
}
虽然有点 hacky,但至少似乎可以让 HMR 正常工作。然而,因为它导致整个 angular 1 应用程序重新启动,而不是仅仅刷新更改的模块,这仅比简单的 livereload 快一点。
有没有更好的方法来重新启动混合应用程序以允许 HMR 工作?