详解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利用ajax调用后台方法实例
Aug 23 Javascript
javascript:window.open弹出窗口的位置问题
Mar 18 Javascript
浅谈jQuery中replace()方法
May 13 Javascript
浅析javascript函数表达式
Feb 10 Javascript
JS中对象与字符串的互相转换详解
May 20 Javascript
vue实现验证码输入框组件
Dec 14 Javascript
Vue精简版风格概述
Jan 30 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
Sep 02 Javascript
Vue.js 十五分钟入门图文教程
Sep 12 Javascript
JavaScript函数重载操作实例浅析
May 02 Javascript
Element Input输入框的使用方法
Jul 26 Javascript
为什么推荐使用JSX开发Vue3
Dec 28 Vue.js
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
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
2010/03/07 Javascript
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
node中socket.io的事件使用详解
2014/12/15 Javascript
JS获取鼠标坐标位置实例分析
2016/01/20 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
jQuery Dom元素操作技巧
2018/02/04 jQuery
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
如何理解Vue的v-model指令的使用方法
2018/07/19 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
Python中的字典遍历备忘
2015/01/17 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
python爬虫爬取网页表格数据
2018/03/07 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
复化梯形求积分实例——用Python进行数值计算
2019/11/20 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
巴西电子、家电、智能手机购物网站:Girafa
2019/06/04 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
Overload和Override的区别
2012/09/02 面试题
校园自助餐厅的创业计划书
2013/12/26 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
营销与策划专业求职信
2014/06/20 职场文书
2015年银行客户经理工作总结
2015/04/01 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android