详解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 相关文章推荐
jQuery开发者都需要知道的5个小技巧
Jan 08 Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
Jan 24 Javascript
JS中Date日期函数中的参数使用介绍
Jan 02 Javascript
javascript实现左右控制无缝滚动
Dec 31 Javascript
jQuery+ajax实现无刷新级联菜单示例
May 21 Javascript
Vue-Router的使用方法
Sep 05 Javascript
更改BootStrap popover的默认样式及popover简单用法
Sep 13 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
Jan 18 Javascript
webpack DllPlugin xxx is not defined解决办法
Dec 13 Javascript
node.js使用stream模块实现自定义流示例
Feb 13 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
Apr 21 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
Nov 06 Javascript
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
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
微信支付开发维权通知实例
2016/07/12 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
javascript XML数据显示为HTML一例
2008/12/23 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
jQuery多项选项卡的实现思路附样式及代码
2014/06/03 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
JavaScript简单表格编辑功能实现方法
2015/04/16 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
详解JavaScript的变量和数据类型
2015/11/27 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
javascript中数组的常用算法深入分析
2019/03/12 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
Python使用requests发送POST请求实例代码
2018/01/25 Python
Python管理Windows服务小脚本
2018/03/12 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
介绍一下Java中的static关键字
2012/05/12 面试题
《雕塑之美》教学反思
2014/04/24 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
学习保证书范文
2014/04/30 职场文书
欢迎领导检查标语
2014/06/27 职场文书
安全生产知识竞赛活动总结
2014/07/07 职场文书
公司授权委托书范本
2014/09/18 职场文书
毕业生爱心捐书倡议书
2015/04/27 职场文书