Angular 4,Hot模块替换附加而不是替换

时间:2018-02-07 15:31:18

标签: angular webpack hot-module-replacement

我遇到了一个奇怪的问题,热模块更换在我的应用程序中运行了一段时间,但最近在某些时候,它已经改变了。它不是替换页面上的特定组件,而是将组件附加到页面顶部,并且仍然在下面留下旧组件的副本。

我已经搜遍了谷歌,并试图通过很少的运气找出改变了什么。我的WebPack文件没有太大变化。

这是我的Webpack.js文件。

Angular 4

Visual Studio 2017

.Net Core 2.0

2 个答案:

答案 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)

接受的答案不适用于角度5。

几个小时后,我终于想出了一个对我有用的解决方案。

首先安装@ 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();
}

到目前为止,这一直很好。