You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在应用级别为React-Router设置Base URL?

当然可以!不用重复拼接process.env.PUBLIC_URL的优雅方案

完全没必要在每个RouteLink或者NavLink里重复写${process.env.PUBLIC_URL},React Router本身就提供了官方推荐的统一配置方案,几步就能彻底解决这个问题:

1. 利用Router组件的basename属性(核心方案)

不管你用的是React Router v5还是v6,BrowserRouter(或HashRouter)都支持basename属性,直接把process.env.PUBLIC_URL传入即可。它会自动为所有路由、链接加上这个基础路径。

示例(React Router v5):

import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';

function App() {
  return (
    <Router basename={process.env.PUBLIC_URL}>
      <Switch>
        {/* 这里直接写相对路径,不用拼接PUBLIC_URL! */}
        <Route exact path="/signin" component={SigninPage} />
        <Route exact path="/dashboard" component={DashboardPage} />
      </Switch>
    </Router>
  );
}

示例(React Router v6):

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';

function App() {
  return (
    <Router basename={process.env.PUBLIC_URL}>
      <Routes>
        <Route path="/signin" element={<SigninPage />} />
        <Route path="/dashboard" element={<DashboardPage />} />
      </Routes>
    </Router>
  );
}

配置完成后,所有的LinkNavLink都会自动带上基础路径:

// 原本需要写 <Link to={`${process.env.PUBLIC_URL}/signin`} />
// 现在直接写就行,Router会自动拼接
<Link to="/signin">登录</Link>

2. 自定义导航逻辑也能自动适配

如果你用useNavigate(v6)或useHistory(v5)做编程式导航,同样不用手动拼接路径,钩子会自动识别basename

import { useNavigate } from 'react-router-dom';

function SomeComponent() {
  const navigate = useNavigate();

  const goToDashboard = () => {
    // 直接写相对路径,自动带上PUBLIC_URL
    navigate('/dashboard');
  };

  return <button onClick={goToDashboard}>去控制台</button>;
}

额外提示:配合create-react-app的homepage配置

别忘了在你的package.json里设置homepage字段,比如部署到子目录/my-app的话:

{
  "homepage": "/my-app"
}

这样create-react-app会自动把process.env.PUBLIC_URL设置为/my-app,build后的产物也会自动适配这个路径,部署时不用额外调整。


内容的提问来源于stack exchange,提问作者Fabrice

火山引擎 最新活动