Menu

キーワード

  • react
  • react-router-dom
  • PUBLIC_URL
  • axios
  • http

現象

react-router-domでルーティングしたところベースURLが抜ける。

ベースURLは cross-env で PUBLIC_URL に設定している。

また、次のようにルーティングを定義している。

<div>
  <ul>
    <li><Link to="/">Home</Link></li>
    <li><Link to="/calc">Calculator</Link></li>
    <li><Link to="/manif">Manifest</Link></li>
  </ul>
  <Switch>
    <Route path="/calc" component={Calculator} />
    <Route path="/manif" component={ManifestDetail} />
    <Route exact path="/" component={() => (
      <p>Select a page from the menus.</p>
    )} />
    <Route component={() => (
      <p>404 NOT FOUND</p>
    )} />
  </Switch>
</div>

原因

PUBLIC_URLに設定するだけではいい感じにやってくれないから(本当?)。

対策

サブパスも含めて書く。

<div>
  <ul>
    <li><Link to={`${process.env.PUBLIC_URL}/`}>Home</Link></li>
    <li><Link to={`${process.env.PUBLIC_URL}/calc`}>Calculator</Link></li>
    <li><Link to={`${process.env.PUBLIC_URL}/manif`}>Manifest</Link></li>
  </ul>
  <Switch>
    <Route path={`${process.env.PUBLIC_URL}/calc`} component={Calculator} />
    <Route path={`${process.env.PUBLIC_URL}/manif`} component={ManifestDetail} />
    <Route exact path={`${process.env.PUBLIC_URL}/`} component={() => (
      <p>Select a page from the menus.</p>
    )} />
    <Route component={() => (
      <p>404 NOT FOUND</p>
    )} />
  </Switch>
</div>

備考

httpするときのリソースパスにも注意。次のように書ける。

Axios.get(process.env.PUBLIC_URL + '/manifest.json')

参考

関連

スポンサーリンク