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

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

// 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>
)

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

但是在 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

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

import ReactDOM from 'react-dom/client'
import App from './App.jsx'

ReactDOM.createRoot(document.getElementById('root')).render(<App />)

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

import Routes from "./router";

function App() {
  return (
    <>
      <div className="page">
        <Routes></Routes>
      </div>
    </>
  )
}
export default App

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

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以回答这个问题。在使用vite搭建React 18应用程序时,可以使用import.meta.glob函数来批量导入组件。这个函数接受一个字符串参数,返回一个promise,可以通过await来等待导入的结果。具体使用方法可以参考vite的官方文档。 ### 回答2: 在使用ViteReact 18时,我们可以使用新的`import.meta.glob`来配置动态导入模块。 `import.meta.glob`是一个自动匹配和导入模块的功能。它允许我们根据指定的匹配模式,动态地导入多个模块。这种导入方式灵活且高效,特别适用于需要动态加载多个模块的场景。 要在Vite使用`import.meta.glob`,我们需要在项目的`vite.config.js`配置文件进行相应的设置。 首先,我们需要确保安装了Vite的依赖,包括vite和@vite/react-plugin。 ```shell npm install vite @vite/react-plugin --save-dev ``` 然后,在`vite.config.js`添加以下内容: ```javascript import reactRefresh from '@vite/react-plugin'; export default { plugins: [ reactRefresh(), ], optimizeDeps: { include: ['react', 'react-dom'], }, }; ``` 接下来,我们可以在React组件使用`import.meta.glob`来动态地导入多个模块。 ```javascript const pages = import.meta.glob('./pages/*.js'); function App() { return ( <div> {Object.keys(pages).map((path) => { const PageComponent = pages[path]().default; return <PageComponent key={path} />; })} </div> ); } ``` 上述代码示例,我们使用`import.meta.glob`动态地导入了某个目录下的所有`.js`文件,并渲染每个导入的组件。 这样,我们就可以利用ViteReact 18的`import.meta.glob`功能来实现动态导入和渲染多个模块的需求。这种方式不仅简洁高效,还能提高开发效率。 ### 回答3: 在使用React 18配置import.meta.glob时,我们需要确保项目已经升级到React 18版本,并且已经支持相关的API。 首先,我们需要在项目vite.config.js文件配置相关内容。假设我们要匹配以".jsx"和".js"结尾的所有文件,我们可以使用import.meta.glob模式来快速导入这些文件。 ``` import { defineConfig } from 'vite'; export default defineConfig({ ... plugins: [ ... reactRefresh(), { name: 'import-meta-glob', enforce: 'pre', resolveId(source, importer) { if (source.startsWith('/dir/')) { const glob = source.replace('/dir/', '/dir/**/*'); return glob; } return null; }, load(id) { if (id.match(/\.jsx?$/)) { // 加载我们匹配到的文件 return fs.promises.readFile(id, 'utf-8'); } return null; }, }, ... ], ... }); ``` 在这个示例,我们定义了一个插件名为import-meta-glob,并且在resolveId函数进行了匹配路径的处理。当路径以"/dir/"开头时,我们将使用import.meta.glob模式匹配所有后缀为".jsx"和".js"的文件。 然后,在load函数,我们加载匹配到的文件内容。你可以根据自己的需求,使用不同的处理方式来处理这些文件。 最后,在项目可以直接使用import来引入匹配到的文件,例如: ``` import files from '/dir/*.js'; console.log(files); ``` 这样,我们就成功地在React 18项目配置了import.meta.glob,可以方便地批量导入文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值