我正在使用React/Vite/Express来构建托管在收件箱中的应用程序.例如,假设它托管在:https://example.com/my/app/

在我的Vite配置中,我将base设置为./

export default defineConfig({
    base: './',
    build: {
        outDir: './public/build',
    },
    plugins: [react()],
    css: {
        preprocessorOptions: {
            scss: {
                implementation: sass,
            },
        },
    }
});

我还使用react-Router-dom.这是我的createBrowserRouter配置:

export const router = createBrowserRouter(
    [
        {
            path: '/',
            element: <App />,
            errorElement: <Error />,
            children: [
                {
                    path: '/',
                    element: <Home />,
                },
                {
                    path: '/test1',
                    element: <Test1 />,
                },
                {
                    path: '/test2',
                    element: <Test2 />,
                },
            ],
        },
    ],
    {
        basename: '/my/app',
    },
);

当我访问包含/的页面时,它运行良好,例如https://example.com/my/app/

然而,如果我使用https://example.com/my/app删除尾随应用程序,Vite会认为基目录是父目录/my/并将其用作根目录.React JS和CSS然后抛出404.

Vite中是否有一种方法可以在不将完整路径硬编码为base的情况下修复这个问题,或者我需要在服务器上修复这个问题才能重定向到带有尾部斜线的URL?

我宁愿不对基础进行硬编码,因为它会根据环境而变化.不过,如果这是最佳实践方法,我会 Select 该解决方案.

我预计应用程序会假设my/app是一个目录.相反,它似乎使用my/作为目录.我try 将base更改为.并更改为空字符串,但没有成功.

推荐答案

该问题不仅与vite配置有关,还与react-路由配置有关. 试试这个:

export const router = createBrowserRouter(
    [
        {
            element: <App />,
            errorElement: <Error />,
            children: [
                {
                    index: true,
                    element: <Home />,
                },
                {
                    path: '/test1',
                    element: <Test1 />,
                },
                {
                    path: '/test2',
                    element: <Test2 />,
                },
            ],
        },
    ],
    {
        basename: '/my/app',
    },
);
  1. basename值应该有前斜线,没有后斜线:'/my/app' -您已经在代码片段中更正了这一点
  2. 对于索引路由(在我们的示例中为<Home />),设置index: true而不是path: '/'
  3. <App>路由摆脱path

vite个配置输入:

export default defineConfig({
    base: '/my/app/',
    ...
});

Javascript相关问答推荐

可以将SuperTest导入为ES 6模块吗?

当没有固定间隔时,是否可以在d3.js中进行画笔捕捉?

二维数组,过滤并返回带有索引而不是值的新数组

Toast函数找不到其dis

为什么在获取回调内设置状态(不会)会导致无限循环?

禁用从vue.js 2中的循环创建的表的最后td的按钮

获取表格的左滚动位置

如何在不分配整个数组的情况下修改包含数组的行为主体?

React存档iframe点击行为

是什么原因导致此Angular 16电影应用程序中因类型错误而不存在属性?

我应该绑定不影响状态的函数吗?'

为什么按钮会随浮动属性一起移动?

无法读取未定义错误的属性路径名''

Next.js服务器端组件请求,如何发送我的cookie token?

IF语句的计算结果与实际情况相反

Phaserjs-创建带有层纹理的精灵层以自定义外观

Google脚本数组映射函数横向输出

使用Document.Evaluate() Select 一个包含撇号的HTML元素

警告框不显示包含HTML输入字段的总和

用于测试其方法和构造函数的导出/导入类