在React中实现代码热重载(HMR)的操作步骤

 更新时间:2025年05月15日 10:10:13   作者:几何心凉  
在现代 React 开发中,代码热重载(HMR)是一项极大提升开发效率的技术,它允许在不刷新整个页面的情况下,实时更新模块代码,从而保留应用状态,避免因页面刷新导致的状态丢失,本文将深入探讨如何在 React 项目中实现 HMR,包括其原理、配置步骤以及最佳实践

一、HMR 的工作原理

HMR 的核心在于通过 Webpack 的能力,在应用运行时替换、添加或删除模块,而无需重新加载整个页面。其主要流程如下:

  1. 文件监听与编译:Webpack 通过 webpack-dev-server 监听源代码的变化,一旦检测到文件变动,立即重新编译受影响的模块。

  2. 模块更新通知:编译完成后,webpack-dev-server 通过 WebSocket 向浏览器发送更新通知,包含更新的模块信息。

  3. 模块替换执行:浏览器接收到更新通知后,使用 HMR Runtime 替换旧模块,执行新的模块代码,实现模块的热更新。

这种机制确保了在开发过程中,代码的修改能够即时反映在浏览器中,而无需手动刷新页面,从而提高开发效率。

二、在 React 项目中配置 HMR

1. 使用 create-react-app(CRA)

如果你的项目是通过 create-react-app 创建的,HMR 已经默认集成,无需额外配置。你只需运行:

npm start

即可享受 HMR 带来的开发便利。

2. 自定义 Webpack 配置

对于自定义配置的 React 项目,需要手动设置 HMR。以下是配置步骤:

a. 安装必要的依赖

npm install --save-dev webpack webpack-cli webpack-dev-server react-refresh @pmmmwh/react-refresh-webpack-plugin

b. 配置 Webpack

在 webpack.config.js 中进行如下配置:

const path = require('path');
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');

module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
    publicPath: '/',
  },
  devServer: {
    hot: true,
    open: true,
    port: 3000,
    static: path.resolve(__dirname, 'dist'),
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            plugins: [require.resolve('react-refresh/babel')],
          },
        },
      },
    ],
  },
  plugins: [new ReactRefreshWebpackPlugin()],
};

此配置中,ReactRefreshWebpackPlugin 插件与 react-refresh/babel 插件共同作用,实现 React 组件的热更新。

c. 启动开发服务器

在 package.json 中添加启动脚本:

"scripts": {
  "start": "webpack serve --config webpack.config.js"
}

然后运行:([cn.mobx.js.org][1])

npm start

即可启动带有 HMR 功能的开发服务器。([webpack][2])

三、最佳实践与注意事项

  1. 状态保留:HMR 能够保留组件状态,但需确保组件的状态管理逻辑不会因模块替换而重置。

  2. 错误处理:在开发过程中,确保对可能出现的错误进行适当处理,避免因错误导致 HMR 失败。

  3. 插件兼容性:使用 HMR 时,确保所用的插件与 HMR 兼容,避免因插件不兼容导致热更新失败。

  4. 生产环境禁用:HMR 主要用于开发环境,生产环境应禁用 HMR,以避免不必要的性能开销。

到此这篇关于在React中实现代码热重载(HMR)的操作步骤的文章就介绍到这了,更多相关React代码热重载HMR内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React捕获并处理异常的方式

    React捕获并处理异常的方式

    这篇文章主要给大家介绍了React优雅的捕获并处理渲染异常方式,文章通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-11-11
  • React报错之Object is possibly null的问题及解决方法

    React报错之Object is possibly null的问题及解决方法

    这篇文章主要介绍了React报错之Object is possibly null的问题,造成 "Object is possibly null"的错误是因为useRef()钩子可以传递一个初始值作为参数,而我们传递null作为初始值,本文给大家分享详细解决方法,需要的朋友可以参考下
    2022-07-07
  • react时间分片实现流程详解

    react时间分片实现流程详解

    实现react时间分片,主要内容包括什么是时间分片、为什么需要时间分片、实现分片开启 - 固定、实现分片中断、重启 - 连续、分片重启、实现延迟执行 - 有间隔、时间分片异步执行方案的演进、时间分片简单实现、总结、基本概念、基础应用、原理机制和需要注意的事项等
    2022-11-11
  • React创建组件的的方式汇总

    React创建组件的的方式汇总

    React 是一个用于构建用户界面的 JAVASCRIPT 库。这篇文章主要介绍了React组件的两种创建方式,一种是使用函数创建组件另一种是使用类创建组件,需要的朋友可以参考下
    2021-11-11
  • react组件的创建与更新实现流程详解

    react组件的创建与更新实现流程详解

    React组件分为函数组件与class组件;函数组件是无状态组件,class称为类组件;函数组件只有props,没有自己的私有数据和生命周期函数;class组件有自己私有数据(this.state)和生命周期函数
    2022-10-10
  • react-native只保留3x图原理解析

    react-native只保留3x图原理解析

    这篇文章主要为大家介绍了react-native只保留3x图原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 浅谈React中组件间抽象

    浅谈React中组件间抽象

    这篇文章主要介绍了浅谈React中组件间抽象,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • React受控组件与非受控组件详细介绍

    React受控组件与非受控组件详细介绍

    具体来说这是一种react非受控组件,其状态是在input的react内部控制,不受调用者控制。可以使用受控组件来实现。下面就说说这个React中的受控组件与非受控组件的相关知识,感兴趣的朋友一起看看吧
    2022-09-09
  • React合成事件详解

    React合成事件详解

    这篇文章主要介绍了React合成事件的相关资料,帮助大家更好的理解和学习使用React,感兴趣的朋友可以了解下
    2021-05-05
  • 详解React中组件之间通信的方式

    详解React中组件之间通信的方式

    这篇文章主要介绍了React中组件之间通信的方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07

最新评论