Angular hmr

作者: 一梦欧巴 | 来源:发表于2017-11-02 19:42 被阅读0次

先决条件

angular cli 至少 1.0.0-beta.22 以上版本

创建项目

使用Angular CLI创建一个空项目。

ng new ng-hmr

cd ng-hmr

添加HMR环境配置文件

HMR需要一定代码嵌入,而这些模块我们希望只在开发过程中使用,所以这里创建一个环境配置文件,用于区分我们什么时候需要引入hmr模块,而不会影响我们生产环境。

首先,创建src/environments/environment.hmr.ts文件,内容为:

export const environment = {

production: false,

hmr: true

};

这里相比较默认两个环境,增加了hmr: true变量。那么,另外两个,也一并设置相应hmr变量,来确保什么情况下才允许开启 HMR。

environment.prod.ts生产环境肯定不会开启它:

export const environment = {

production: true,

hmr: false

};

environment.ts默认环境,如果有必要也可以设置为true,为了后面更好的演示,这里我设置false:

export const environment = {

production: false,

hmr: false

};

新环境配置还需要更新angular-cli.json的environments节点,以确保angular cli 能认识:

"environments": {

"source": "environments/environment.ts",

"dev": "environments/environment.ts",

"prod": "environments/environment.prod.ts",

// 新增的节点

"hmr": "environments/environment.hmr.ts"

}

到此,与配置相关已经完成,你可以尝试使用ng serve --hmr -e=hmr来启用HMR。而且和之前相比会有这样一段提醒:

NOTICE Hot Module Replacement (HMR) is enabled for the dev server.

The project will still live reload when HMR is enabled,

but to take advantage of HMR additional application code is required

(not included in an Angular CLI project by default).

Seehttps://webpack.github.io/docs/hot-module-replacement.html

for information on working with HMR for Webpack.

添加angular-hmr模块依赖与配置

正如提醒信息中说的,Angular CLI默认并不提供HMR所需要的额外应用代码。但Angular已经有了一个现成HMR模块即【Angular 2 Hot Module Replacement】,安装它:

npm install --save-dev @angularclass/hmr

接下来,创建src/hmr.ts文件,配置模块内容:

import { NgModuleRef, ApplicationRef } from '@angular/core';

import { createNewHosts } from '@angularclass/hmr';

export const hmrBootstrap = (module: any, bootstrap: () => Promise<NgModuleRef<any>>) => {

let ngModule: NgModuleRef<any>;

module.hot.accept();

bootstrap().then(mod => {

ngModule = mod;

});

module.hot.dispose(() => {

let appRef: ApplicationRef = ngModule.injector.get(ApplicationRef);

let elements = appRef.components.map(c => c.location.nativeElement);

let makeVisible = createNewHosts(elements);

ngModule.destroy();

makeVisible();

});

};

最后,修改src/main.ts内容:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { enableProdMode, ApplicationRef } from '@angular/core';

import { environment } from './environments/environment';

import { AppModule } from './app/app.module';

import { hmrBootstrap } from './hmr';

if (environment.production) {

enableProdMode();

}

const bootstrap = () => {

return platformBrowserDynamic().bootstrapModule(AppModule);

}

if (environment.hmr) {

if (module['hot']) {

hmrBootstrap(module, bootstrap);

} else {

// 未加上 --hmr 时,控制台会有错误提醒

console.error('HMR没有启用,确保 ng server 命令加上 --hmr 标记');

}

} else {

bootstrap();

}

运行

现在,我们可以使用以下命令来启动HMR:

ng serve --hmr -e=hmr

作者:cipchk

链接:http://www.jianshu.com/p/a6361cf7bb4c

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章

  • Angular hmr

    先决条件 angular cli 至少 1.0.0-beta.22 以上版本 创建项目 使用Angular CLI...

  • angular-cli如何启用HMR

    先决条件 angular cli 至少 1.0.0-beta.22 以上版本 创建项目 使用Angular CLI...

  • angular-cli如何启用HMR

    webpack有一个非常好玩的插件叫:模块换替换(HMR),即添加或删除模块时应用持续运行,不需要页面刷新。虽然a...

  • 从这十几个方面优化你的 Webpack 配置

    开发环境性能优化 优化打包构建速度 HMR 优化代码调试 source-map HMR 概念:「HMR:」 hot...

  • Angular HMR(热模块替换) 功能实现

    最近一个同事在使用Angular的时候,希望能像VUE那样,修改代码后浏览器不刷新,页面对应修改的组件自动更新的功...

  • Angular6 配置 hmr (热加载)

    前置条件 先安装项目依赖包 yarn ( 推荐使用 yarn 包管理工具 ) 安装 hmr 依赖包 yarn ad...

  • HMR

    描述 HMR 全称 Hot Module Replacement,即模块热更新。 当代码变更时,局部替换掉部分模块...

  • webpack之热更新/替换

    模块热替换(HMR)什么是模块热替换HMR(Hot Module Replacement),在应用程序运行过程中,...

  • webpack2搭建开发环境

    开发环境 本文主要介绍使用webpack2进行前端开发以及编译发布文件,主要涉及: HMR - React HMR...

  • react-hot-loader fixbug

    [HMR] Update check failed: Error: Failed to execute 'open...

网友评论

    本文标题:Angular hmr

    本文链接:https://www.haomeiwen.com/subject/ejuapxtx.html