详解react-webpack2-热模块替换[HMR]


Posted in Javascript onAugust 03, 2017

本文介绍了react-webpack2-热模块替换[HMR],分享给大家,具体如下:

模块热替换功能会在应用程序运行过程中替换、添加或删除模块,而无需重新加载页面。这使得你可以在独立模块变更后,无需刷新整个页面,就可以更新这些模块,极大地加速了开发时间。

babel 配置

需要先下载 npm install --save-dev react-hot-loader@3.0.0-beta.6

然后在 .babelrc 中配置

{
 "presets": [
  ["es2015", {"modules": false}], // webpack 2 中需要这样配置禁用

  "stage-2",

  "react"
 ],
 "plugins": [
  "react-hot-loader/babel"
  // 开启 React 代码的模块热替换(HMR)
 ]
}

webpack 配置

入口插入模块热替换

entry: {
    app: [
      'react-hot-loader/patch',
      // 开启 React 代码的模块热替换(HMR)

      'webpack-dev-server/client?http://localhost:8080',
      // 为 webpack-dev-server 的环境打包代码
      // 然后连接到指定服务器域名与端口,可以换成本机ip

      'webpack/hot/only-dev-server',
      // 为热替换(HMR)打包好代码
      // only- 意味着只有成功更新运行代码才会执行热替换(HMR)


      './index.js'
      // 我们 app 的入口文件
    ],
    vendor: ['react', 'react-router']
    // 公共文件打包
  }

出口配置 publicPath,(必须配置)

output: {
    path: defPath.DEV_PATH,
    // 所有输出文件的目标路径

    filename: 'js/bundle.js',

    publicPath: '/',

    chunkFilename: '[name].chunk.js'
  },

plugins 添加相应插件

plugins: [
    new webpack.HotModuleReplacementPlugin(),
    // 开启全局的模块热替换(HMR)

    new webpack.NamedModulesPlugin()
    // 控制台输出模块命名美化
  ]

devServer 配置 HMR

devServer: {
    // ... 其他配置

    hot: true,
    // 开启服务器的模块热替换(HMR)

    contentBase: defPath.DEV_PATH,
    // 输出文件的路径

    publicPath: '/'
    // 和 output 的 publicPath 保持一致
  }

应用代码中修改

应用代码中需要做很大的改动

拆分原入口文件

新建一个根组件,存放原入口文件中的路由配置部分

/*
    Root, Router 配置
  */
  import React from 'react';
  import {Provider} from 'react-redux';
  import {browserHistory, Router} from 'react-router';
  import {syncHistoryWithStore} from 'react-router-redux';


  import store from '../store/index'; // 引入 配置后的 store 
  import routes from '../routes.js'; // 子级路由配置

  // 创建一个增强版的history来结合store同步导航事件
  const browhistory = syncHistoryWithStore(browserHistory, store);

  const Root = () => (
    <Provider store={store}>
     <div>
       <Router history={browhistory} routes={routes}/>
     </div>
    </Provider>
  );


  export default Root;

原入口文件改为

/*
    app/js/index.js
    入口文件, 配置 webpack 热加载模块
  */
  import '../scss/index.scss';
  import '../scss/commoncom.scss';

  import React from 'react';
  import ReactDOM from 'react-dom';
  import {AppContainer} from 'react-hot-loader'; 
  // 引入 react-hot-loader 提供的容器
  import injectTapEventPlugin from 'react-tap-event-plugin';

  // 引入总路由的配置模块
  import Root from './containers/Root';

  // 定义要挂载的 DOM 节点
  const mountNode = document.getElementById('app');

  // react 的插件,提供onTouchTap()
  injectTapEventPlugin();

  // 封装 render 函数
  const render = (Component) => {
    ReactDOM.render((
      <AppContainer>
        <Component/>
      </AppContainer>
    ), mountNode);
  };

  // 初始化调用
  render(Root);

  // 配置需要热模块替换的条件
  if (module.hot && process.env.NODE_ENV !== 'production') {
    // 处理对特定依赖的更改
    module.hot.accept('./containers/Root', (err) => {
      if (err) {
        console.log(err);
      }
      // 从DOM 中移除已经挂载的 React 组件 然后重装
      ReactDOM.unmountComponentAtNode(mountNode);
      render(Root);
    });
  }

以上就可以使用 webpack 2 模块热替换,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript Global对象
Aug 13 Javascript
Javascript 倒计时源代码.(时.分.秒) 详细注释版
May 09 Javascript
Javascript跨域请求的4种解决方式
Mar 17 Javascript
jquery xMarquee实现文字水平无缝滚动效果
Apr 29 Javascript
node.js中的http.response.getHeader方法使用说明
Dec 14 Javascript
javascript js 操作数组 增删改查的简单实现
Jun 20 Javascript
jquery滚动条插件(可以自定义)
Dec 11 Javascript
Validform验证时可以为空否则按照指定格式验证
Oct 20 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
Jan 18 jQuery
AngularJS ui-router刷新子页面路由的方法
Jul 23 Javascript
es6 symbol的实现方法示例
Apr 02 Javascript
jquery轻量级数字动画插件countUp.js使用详解
Oct 17 jQuery
webpack开发跨域问题解决办法
Aug 03 #Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
Aug 03 #Javascript
react-native ListView下拉刷新上拉加载实现代码
Aug 03 #Javascript
解决ionic和angular上拉加载的问题
Aug 03 #Javascript
ES6学习教程之Map的常用方法总结
Aug 03 #Javascript
微信小程序之电影影评小程序制作代码
Aug 03 #Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
Aug 03 #Javascript
You might like
phpmail类发送邮件函数代码
2012/02/20 PHP
coreseek 搜索英文的问题详解
2013/06/08 PHP
php中的观察者模式简单实例
2015/01/20 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
Jquery Select操作方法集合脚本之家特别版
2010/05/17 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
jQuery EasyUI 入门必看
2016/06/03 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
[03:17]DOTA2英雄基础教程 剧毒术士
2013/12/12 DOTA
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
python中requests库session对象的妙用详解
2017/10/30 Python
python 不以科学计数法输出的方法
2018/07/16 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
Python ORM框架Peewee用法详解
2020/04/29 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
J2EE包括哪些技术
2016/11/25 面试题
秘书行业自我鉴定范文
2013/12/30 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
工作证明书
2015/06/15 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书
python绘图subplots函数使用模板的示例代码
2021/04/30 Python