详解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学习笔记(一) 编写高质量代码
Aug 09 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
Aug 02 Javascript
jQuery中last()方法用法实例
Jan 06 Javascript
js打造数组转json函数
Jan 14 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
Jan 08 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
Apr 28 Javascript
不同js异步函数同步的实现方法
May 28 Javascript
jQuery下拉框的简单应用
Jun 24 Javascript
基于Vue实现后台系统权限控制的示例代码
Aug 29 Javascript
5分钟学会Vue动画效果(小结)
Jul 21 Javascript
JavaScript的词法结构精华篇
Oct 17 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
Apr 30 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 无极分类(递归)实现代码
2010/01/05 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
javascript校验价格合法性实例(必须输入2位小数)
2014/05/05 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
JS插件overlib用法实例详解
2015/12/26 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
js改变css样式的三种方法推荐
2016/06/28 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
jQuery 全选 全不选 事件绑定的实现代码
2017/01/23 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
Angular8基础应用之表单及其验证
2019/08/11 Javascript
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
跟老齐学Python之用while来循环
2014/10/02 Python
Python正则表达式教程之二:捕获篇
2017/03/02 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
Python3简单实现串口通信的方法
2019/06/12 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
解决python调用自己文件函数/执行函数找不到包问题
2020/06/01 Python
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
会计专业应届生自荐信
2014/02/07 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
协会周年庆活动方案
2014/08/26 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
会议新闻稿
2015/07/17 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
python plt.plot bar 如何设置绘图尺寸大小
2021/06/01 Python