详解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 相关文章推荐
ASP中进行HTML数据及JS数据编码函数
Nov 11 Javascript
关于JavaScript与HTML的交互事件
Apr 12 Javascript
js sort 二维数组排序的用法小结
Jan 24 Javascript
jquery JSON的解析方式示例介绍
Jul 27 Javascript
使用phantomjs进行网页抓取的实现代码
Sep 29 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
Jul 11 Javascript
javascript 解决浏览器不支持的问题
Sep 24 Javascript
微信小程序网络请求的封装与填坑之路
Apr 01 Javascript
基于vue.js路由参数的实例讲解——简单易懂
Sep 07 Javascript
vue interceptor 使用教程实例详解
Sep 13 Javascript
详解express使用vue-router的history踩坑
Jun 05 Javascript
vue递归组件实战之简单树形控件实例代码
Aug 27 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
php判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
Javascript 颜色渐变效果的实现代码
2013/10/01 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
js跳转页面方法总结
2014/01/29 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
谈谈第三方App接入微信登录 解读
2016/12/27 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
JS PHP字符串截取函数实现原理解析
2020/08/29 Javascript
Python类的多重继承问题深入分析
2014/11/09 Python
python中zip和unzip数据的方法
2015/05/27 Python
Python3.x对JSON的一些操作示例
2017/09/01 Python
Pandas实现数据类型转换的一些小技巧汇总
2018/05/07 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
使用Keras实现简单线性回归模型操作
2020/06/12 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
德国户外商店:eXXpozed
2020/07/25 全球购物
学校元旦晚会方案
2014/02/19 职场文书
欢迎横幅标语
2014/06/17 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
Docker下安装Oracle19c
2022/04/13 Servers