详解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 相关文章推荐
JS中==与===操作符的比较
Mar 21 Javascript
利用jQuery插件扩展识别浏览器内核与外壳的类型和版本的实现代码
Oct 22 Javascript
使用jQuery设置disabled属性与移除disabled属性
Aug 21 Javascript
Bootstrap每天必学之前端开发框架
Nov 19 Javascript
很不错的两款Bootstrap Icon图标选择组件
Jan 28 Javascript
详解js中的apply与call的用法
Jul 30 Javascript
详解支持Angular 2的表格控件
Jan 19 Javascript
手把手教你使用vue-cli脚手架(图文解析)
Nov 08 Javascript
ES6使用export和import实现模块化的方法
Sep 10 Javascript
Vue resource三种请求格式和万能测试地址
Sep 26 Javascript
微信小程序实现留言板(Storage)
Nov 02 Javascript
vue接入腾讯防水墙代码
May 07 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/02/08 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
2014/07/28 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
js实现日历的简单算法
2017/01/24 Javascript
JS基于封装函数实现的表格分页完整示例
2018/06/26 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
Python学习笔记之常用函数及说明
2014/05/23 Python
Python实现的HTTP并发测试完整示例
2020/04/23 Python
python模拟Django框架实例
2016/05/17 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
浅析两列自适应布局的3种思路
2016/05/03 HTML / CSS
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
机电工程专业应届生求职信
2013/10/03 职场文书
化妆品促销方案
2014/02/24 职场文书
婚宴领导致辞
2015/07/28 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers
Linux中如何安装并部署Redis
2022/04/18 Servers