• 修复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

  • 相关阅读:
    26.分页
    固定资产管理系统给企业带来的价值?
    02_静态链接和简单宕机分享
    第十五章 jQuery中的事件
    [linux(静态文件服务)] 部署vue发布后的dist网页到nginx
    【手把手教你写服务器】监听端口功能的实现、epoll技术概述
    Centos7系统编译Hadoop3.3.4
    webfunny埋点漏斗功能
    如何使用单链表实现队列
    冰蝎加密 WebShell 过杀软
  • 原文地址:https://blog.csdn.net/AXBNMD/article/details/137468854