我遇到了一个奇怪的问题,热模块更换在我的应用程序中运行了一段时间,但最近在某些时候,它已经改变了。它不是替换页面上的特定组件,而是将组件附加到页面顶部,并且仍然在下面留下旧组件的副本。
我已经搜遍了谷歌,并试图通过很少的运气找出改变了什么。我的WebPack文件没有太大变化。
这是我的Webpack.js文件。
Angular 4
Visual Studio 2017
.Net Core 2.0
答案 0 :(得分:2)
使用.NET Core / Angular模板时,我发生了这种情况。此代码段应确保删除旧组件,并在热模块更换配置挂钩期间创建新的组件。
如果您有boot.client.ts,请查看它是否包含:
if (module.hot) {
module.hot.accept();
module.hot.dispose(() => {
// Before restarting the app, we create a new root element and dispose the old one
const oldRootElem = document.querySelector('app');
const newRootElem = document.createElement('app');
oldRootElem!.parentNode!.insertBefore(newRootElem, oldRootElem);
modulePromise.then(appModule => appModule.destroy());
});
}
答案 1 :(得分:1)
几个小时后,我终于想出了一个对我有用的解决方案。
首先安装@ angularclass / hmr:
npm install --save-dev @angularclass/hmr
然后使用这个boot.browser.ts(有些调用boot.client.ts):
import 'reflect-metadata';
import 'zone.js';
import 'bootstrap';
import { enableProdMode, NgModuleRef, ApplicationRef } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module.browser';
import { createNewHosts } from '@angularclass/hmr';
const bootstrap = () => platformBrowserDynamic().bootstrapModule(AppModule);
if (module.hot) {
let ngModule: NgModuleRef<any>;
module.hot.accept();
bootstrap().then(mod => ngModule = mod);
module.hot.dispose(() => {
const appRef: ApplicationRef = ngModule.injector.get(ApplicationRef);
const elements = appRef.components.map(c => c.location.nativeElement);
const makeVisible = createNewHosts(elements);
ngModule.destroy();
makeVisible();
});
} else {
enableProdMode();
}
到目前为止,这一直很好。