React18 +ts 路由写法

命令:npm i react-router-dom
版本声明:

在这里插入图片描述
写法一:
src>router>index.tsx

import App from "../App";
import React, { lazy } from "react";
import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";
const Home = lazy(() => import("../views/Home"));


// 抽取懒加载组件
const withReactSuspense = (comp: JSX.Element) => (
    // lazy路由懒加载 需要搭配 Suspense 组件进行优化
  <React.Suspense fallback={<div>Loading...</div>}>{comp}</React.Suspense>
);

function baseRouter() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<App />}>
          {/* Navigate 重定向 */}
          <Route path="/" element={<Navigate to="/home" />}></Route>
          <Route
            path="/home"
            element={
              withReactSuspense(<Home />)
            }
          ></Route>

        </Route>
      </Routes>
    </BrowserRouter>
  );
}

export default baseRouter;

main.tsx

import React from "react";
import ReactDOM from "react-dom/client";
import Router from "./router";

ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
  <React.StrictMode>
    <Router />
  </React.StrictMode>
);

App.tsx

import { Outlet } from "react-router-dom";

function App() {
  return (
    <div className="App">
      {/* Outlet 占位符组件,类似于vue的router-view */}
      <Outlet />
    </div>
  );
}

export default App;

第二种写法:

<think>好的,我现在需要帮助用户解决在使用Vite、ReactTypeScript时遇到的路由丢失导致白屏且无报错的问题。首先,我得理清可能的原因,并逐步排查。 用户提到白屏且无报错,这说明问题可能出在路由配置或组件渲染阶段,没有触发JavaScript错误。首先考虑路由配置是否正确。React Router的版本不同,配置方式会有差异。比如v6版本相比v5有较大变化,如果用户使用的版本文档不一致,可能会导致路由无法正确匹配。用户可能没有正确使用RoutesRoute组件,或者路径书写有误,比如忘记添加通配符*来处理未匹配的路由。 接下来是文件路径的问题。Vite的项目结构可能导致某些文件路径引用错误,特别是在使用绝对路径时,需要检查tsconfig.json中的baseUrlpaths配置是否正确。如果组件路径错误,动态导入可能会失败,导致组件无法加载,但可能不会抛出明显错误,从而出现白屏。 然后是History API的问题。如果使用BrowserRouter,需要确保服务器端配置支持SPA,所有路由请求都指向index.html。否则,当用户直接访问某个路由时,服务器可能返回404,导致前端路由无法接管。不过用户提到的是开发环境,Vite服务器应该默认处理好了,但生产环境可能需要额外配置。 组件本身的错误也是一个可能性。虽然用户说没有报错,但某些情况下,组件内部的错误可能在渲染时被静默处理,比如未正确导出组件,或使用了未定义的变量。这时使用React的Strict模式或错误边界(Error Boundaries)可能帮助捕获问题。 此外,构建问题也不能排除。检查vite.config.ts中的配置是否正确,特别是alias设置是否与tsconfig.json一致。如果构建后的路径有问题,可能导致资源加载失败。 现在,我需要一步步给出解决方案。首先检查路由配置是否正确,确保使用正确的React Router版本,并正确包裹路由组件。然后验证文件路径是否正确,必要时使用相对路径或配置别名。接着检查服务器配置,确保支持History API。使用错误边界来捕获可能的组件错误,并检查构建配置。最后,调试技巧如打印日志、检查浏览器控制台网络请求等可能有帮助。 同时,用户可能需要生成相关问题,比如如何配置Vite的路径别名,或者React Router的最佳实践。根据引用内容,用户之前可能关注过前端性能,比如白屏时间,所以优化加载速度也可能相关。不过当前问题主要集中在路由配置组件加载上,需要围绕这些点展开。</think>### 分步解决方案:Vite + React + TypeScript 路由丢失导致白屏问题排查 --- #### **1. 检查路由配置逻辑** ```tsx // main.tsx import { createRoot } from 'react-dom/client' import { BrowserRouter } from 'react-router-dom' import App from './App' createRoot(document.getElementById('root')!).render( <BrowserRouter> <App /> </BrowserRouter> ) ``` ```tsx // App.tsx(React Router v6 正确写法) import { Routes, Route } from 'react-router-dom' import HomePage from './pages/Home' import AboutPage from './pages/About' function App() { return ( <Routes> <Route path="/" element={<HomePage />} /> <Route path="/about" element={<AboutPage />} /> {/* 必须添加通配符处理未匹配路由 */} <Route path="*" element={<NotFound />} /> </Routes> ) } ``` - **关键点**:React Router v6 必须用`<Routes>`包裹,路径匹配规则严格区分大小写 - **常见错误**:v5 升级到 v6 时未替换`<Switch>`为`<Routes>`,导致路由失效[^1] --- #### **2. 验证动态路由加载** ```tsx // 使用lazy + Suspense的正确实现 import { lazy, Suspense } from 'react' const HomePage = lazy(() => import('./pages/Home')) function App() { return ( <Suspense fallback={<Loading />}> <Routes> <Route path="/" element={<HomePage />} /> </Routes> </Suspense> ) } ``` - **注意**:动态导入的组件路径必须准确,建议使用绝对路径别名 - **排查方法**:在浏览器开发者工具的 Network 面板检查 chunk 文件是否成功加载 --- #### **3. 配置路径别名(解决文件路径问题)** ```json // tsconfig.json { "compilerOptions": { "baseUrl": ".", "paths": { "@/*": ["./src/*"] } } } ``` ```ts // vite.config.ts import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import path from 'path' export default defineConfig({ plugins: [react()], resolve: { alias: { '@': path.resolve(__dirname, './src') } } }) ``` - **典型错误**:忘记在 Vite TypeScript 中同时配置路径别名 --- #### **4. 添加错误边界捕获** ```tsx class ErrorBoundary extends React.Component { state = { hasError: false } static getDerivedStateFromError() { return { hasError: true } } componentDidCatch(error: Error) { console.error('路由组件渲染失败:', error) } render() { return this.state.hasError ? <FallbackUI /> : this.props.children } } // 在根组件中使用 <ErrorBoundary> <App /> </ErrorBoundary> ``` - **作用**:捕获路由组件初始化时的静默错误(如未处理的undefined变量) --- #### **5. 服务器配置验证** ```bash # 本地开发时确保vite启动命令正确 vite --host --port 3000 ``` - **生产环境**:需配置Nginx添加try_files规则 ```nginx location / { try_files $uri $uri/ /index.html; } ``` --- #### **6. 调试技巧** 1. 在路由组件中添加`console.log('Component mounted')` 2. 检查浏览器控制台的: - Network 面板(404错误) - Console 面板(静默错误) - React DevTools(组件树是否正常渲染) 3. 尝试将动态导入改为静态导入,排查路径问题 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值