详解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 相关文章推荐
Div自动滚动到末尾的代码
Oct 26 Javascript
jquery 模式对话框终极版实现代码
Sep 28 Javascript
jquery创建一个ajax关键词数据搜索实现思路
Feb 26 Javascript
Bootstrap每天必学之前端开发框架
Nov 19 Javascript
实例详解ECMAScript5中新增的Array方法
Apr 05 Javascript
瀑布流的实现方式(原生js+jquery+css3)
Jun 28 Javascript
基于jQuery ligerUI实现分页样式
Sep 18 Javascript
arcgis for js 修改infowindow样式的方法
Nov 02 Javascript
JS实现简单的二元方程计算器功能示例
Jan 03 Javascript
老生常谈jquery id选择器和class选择器的区别
Feb 12 Javascript
微信小程序登录态控制深入分析
Apr 12 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 31 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
example1.php
2006/10/09 PHP
PHP之变量、常量学习笔记
2008/03/27 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
json 入门基础教程 推荐
2009/10/31 Javascript
在html页面上拖放移动标签
2010/01/08 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
node.js中的emitter.on方法使用说明
2014/12/10 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
2016/05/12 Javascript
简单封装js的dom查询实例代码
2016/07/08 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
2016/11/25 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
python新手经常遇到的17个错误分析
2014/07/30 Python
python求解水仙花数的方法
2015/05/11 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
python openCV自制绘画板
2020/10/27 Python
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
如何查找网页漏洞
2016/06/22 面试题
市场营销专业毕业生自荐信
2013/11/02 职场文书
小学中秋节活动方案
2014/02/06 职场文书
教师专业自荐书范文
2014/02/10 职场文书
监督检查工作方案
2014/05/28 职场文书