详解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模仿ie的自动完成类似自动完成功的表单
Dec 12 Javascript
用js实现trim()的解决办法
Apr 16 Javascript
对frameset、frame、iframe的js操作示例代码
Aug 16 Javascript
javascript禁制后退键(Backspace)实例代码
Nov 15 Javascript
jQuery使用height()获取高度需要注意的地方
Dec 13 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
Jun 01 Javascript
浅谈vuex之mutation和action的基本使用
Aug 29 Javascript
React Native基础入门之初步使用Flexbox布局
Jul 02 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
Aug 24 Javascript
Vue + Elementui实现多标签页共存的方法
Jun 12 Javascript
JS动态图片的实现方法完整示例
Jan 13 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
Feb 24 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
提问的智慧
2006/10/09 PHP
PHP句法规则详解 入门学习
2011/11/09 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
2016/08/24 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
nodejs 实现钉钉ISV接入的加密解密方法
2017/01/16 NodeJs
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
详解基于node.js的脚手架工具开发经历
2019/01/28 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
python的launcher用法知识点总结
2020/08/07 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
利用CSS3的3D效果制作正方体
2020/03/10 HTML / CSS
Currentbody西班牙:美容仪专家
2019/09/28 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
小学教师先进事迹材料
2014/12/15 职场文书
九年级英语教学反思
2016/02/15 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
python中os.path.join()函数实例用法
2021/05/26 Python
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python