• 修复vite中使用react提示Fast refresh only works when a file only exports components.


    前言

    我通过 vite 构建了一个 react 应用并使用 react.lazy懒加载组件,但是在使用过程中 一直提示 Fast refresh only works when a file only exports components. Move your component(s) to a separate file.eslint(react-refresh/only-export-components)。这里简单的记录下问题的修复方式。

    复现方式

    先定义一组路由并导出

    // src/router/index.jsx
    import { lazy } from "react"
    import { Navigate } from "react-router-dom"
    
    const Home = lazy(() => import("../views/home"))
    
    const routes = [
      { path: "/", element: <Navigate to="/home" /> },
      { path: "/home", element: <Home /> },
    ]
    export default router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    main.jsx中使用简洁的 URL 将当前位置存储在浏览器地址栏中,并使用浏览器内置的历史堆栈进行导航。

    // src/main.jsx
    import ReactDOM from 'react-dom/client'
    import App from './App.jsx'
    import { BrowserRouter } from "react-router-dom"
    
    ReactDOM.createRoot(document.getElementById('root')).render(
      <BrowserRouter>
        <App />
      </BrowserRouter>
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    App.jsx 使用钩子函数 useRoutes 的返回一个有效的 React 元素来呈现路由树。

    // src/App.jsx
    import { useRoutes } from "react-router-dom"
    import routes from './router/index'
    
    function App() {
      return (
        <>
          <div className="page">
            { useRoutes(routes) }
          </div>
        </>
      )
    }
    export default App
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    但是在 router/index.jsx 中一直会提示如下错误:

    在这里插入图片描述

    解决措施

    这里有两种解决方案:

    • 为所有文件的此规则添加禁用注释。这实际上不会打破快速刷新。

    • 导出呈现路由器提供程序的组件,而不是导出路由器。

    在不修改原有配置的基础上我们推荐使用第二种方式进行修改,而且也是副作用最小的方式。

    1、在 router\index.jsx 文件中使用 createBrowserRouter 这个 React Router Web 项目推荐使用的路由并使用 RouterProvider 导出路由。修改代码如下:

    import { lazy } from "react"
    import { Navigate, createBrowserRouter, RouterProvider } from "react-router-dom"
    
    const Home = lazy(() => import("../views/home"))
    
    const routes = [
      { path: "/", element: <Navigate to="/home" /> },
      { path: "/home", element: <Home /> },
    ]
    
    const router = createBrowserRouter(routes)
    
    const Routes = () => {
      return <RouterProvider router={router} />
    }
    export default Routes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2、在 main.jsx 中直接渲染 App 组件即可

    import ReactDOM from 'react-dom/client'
    import App from './App.jsx'
    
    ReactDOM.createRoot(document.getElementById('root')).render(<App />)
    
    • 1
    • 2
    • 3
    • 4

    3、在 App.jsx 中直接使用 router\index.jsx 中导出的函数式组件,修改代码如下:

    import Routes from "./router";
    
    function App() {
      return (
        <>
          <div className="page">
            <Routes></Routes>
          </div>
        </>
      )
    }
    export default App
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    参考链接:Lazy Loading react component get some warning

  • 相关阅读:
    重生之我要学后端100--计算机网络部分概念(持续更新)
    uniapp 获取设备唯一标识(OAID、AAID、AndroidID、IMEI等)插件 Ba-IdCode
    【LeetCode】C++:新手村题单记录-重在解出问题
    跟艾文学编程《Python基础》(2)Python 容器
    html实现个人空间(源码)
    教育行业的网络安全:保护学生数据与防范网络欺凌
    聊聊自动驾驶必须解决哪些感知问题?交通标志识别技术详解
    《Hidden Markov Map Matching Through Noise and Sparseness》读书笔记
    求组合数算法的实现
    从简历被拒到收割 8个大厂offer,我用2个月的时间破茧成蝶
  • 原文地址:https://blog.csdn.net/AXBNMD/article/details/137468854