这个问题已经被问过了,但略有不同,即对我来说,路由不会只在使用构建的项目时渲染,否则在dev模式下一切都很好.为什么会这样,我该如何解决它?

dev条有效路由:

  • "http://localhost:5173/"
  • "http://localhost:5173/#/about"

production条路由(不起作用):

  • "https://my-domain/audio-ui/"
  • "https://my-domain/audio-ui/#/about"

我用tsc && vite build --base=/audio-ui/构建,因为我需要/audio-ui子路径.我有另一个项目,在那里我使用了相同的构建方法,它运行得很好,但我没有在那里使用React—Router—DOM.

整个(简单)项目是https://github.com/adrhc/audio-ui/tree/RouterProvider_only.

main. tsx内容:

// import React from 'react';
import ReactDOM from 'react-dom/client';
import Dashboard from './Dashboard.tsx';
import '@fontsource/roboto/300.css';
import '@fontsource/roboto/400.css';
import '@fontsource/roboto/500.css';
import '@fontsource/roboto/700.css';
// import { CssBaseline, ThemeProvider, createTheme } from '@mui/material';
import { RouterProvider, createHashRouter } from 'react-router-dom';
import Volume from './Volume.tsx';
import About from './About.tsx';
import ErrorPage from './ErrorPage.tsx';
import Root from './Root.tsx';

const router = createHashRouter(
  [
    {
      path: '/',
      element: <Root />,
      errorElement: <ErrorPage />,
      children: [
        {
          path: '',
          element: <Dashboard />,
        },
        {
          path: 'volume',
          element: <Volume />,
        },
        {
          path: 'about',
          element: <About />,
        },
      ],
    },
  ],
  { basename: import.meta.env.BASE_URL }
);

ReactDOM.createRoot(document.getElementById('root')!).render(
  <RouterProvider router={router} />
);

推荐答案

BrowserRouter不同的是,HashRouter并不真正需要basenameprops ,因为它们从"/"从任何"..../#/"静态URL中工作.

换句话说,对服务器的所有页面请求都是"https://my-domain/audio-ui/",散列之后的所有内容都被服务器忽略,并由HashRouter处理客户端.

如果import.meta.env.BASE_URL是值"/audio-ui/",那么你实际上是告诉React—Router和HashRouter使用URL,如:

  • "https://my-domain/audio-ui/#/audio-ui/"
  • "https://my-domain/audio-ui/#/audio-ui/about"

你是说"https://my-domain/audio-ui/#/audio-ui/"是根路由,所有路由和链路都相对于这个位置工作.

如果您正在托管和提供"https://my-domain/audio-ui"的React应用程序,那么从HashRouter中删除basenameprops ,以便它使用"/"作为根路径来路由/导航/链接.所有路由/链接将从"https://my-domain/audio-ui/#/"开始工作.

const router = createHashRouter(
  [
    {
      path: '/',
      element: <Root />,
      errorElement: <ErrorPage />,
      children: [
        {
          path: '',
          element: <Dashboard />,
        },
        {
          path: 'volume',
          element: <Volume />,
        },
        {
          path: 'about',
          element: <About />,
        },
      ],
    },
  ],
);

或者保留basenameprops (101)并使用tsc && vite build --base=/来构建应用程序.

Typescript相关问答推荐

使用前的组件渲染状态更新

typescript抱怨值可以是未定义的,尽管类型没有定义

如何修复正在处理类型但与函数一起使用时不处理的类型脚本类型

在使用Typescribe时,是否有一种方法可以推断映射类型的键?

键集分页顺序/时间戳上的筛选器,精度不相同

ANGLE找不到辅助‘路由出口’的路由路径

了解类型规则中的关键字

使用Dockerfile运行Vite React应用程序时访问env变量

已解决:如何使用值类型限制泛型键?

如何在typescript中为this关键字设置上下文

返回嵌套props 的可变元组

使用条件类型的类型保护

是否可以强制静态方法将同一类型的对象返回其自己的类?

打字错误推断

打字错误TS2305:模块常量没有导出的成员

在打字应用程序中使用Zod和Reaction-Hook-Forms时显示中断打字时出错

递归类型别名的Typescript 使用

为什么过滤器不改变可能的类型?

如何通过nx找到所有受影响的项目?

覆盖高阶组件中的 prop 时的泛型推理