react-webpack2-热模块替换[HMR]

react-webpack2 - 模块热替换[HMR]

模块热替换功能会在应用程序运行过程中替换、添加或删除模块,而无需重新加载页面。这使得你可以在独立模块变更后,无需刷新整个页面,就可以更新这些模块,极大地加速了开发时间。

webpack3 react-router4 热模块替换 看这里
react16 + react-router4 + webpack开发环境搭建

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 模块热替换

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值