利用シーン
Reactでフロントを作ったとき、https://site.domain
ではなく、
https://site.domain/sub_dirctory
にindex.js
やindex.html
を設置する場面。
そのままでは、大量のcontents
が404 Not Found
になります。
たくさんURLを書き換えるのは骨が折れるので、数か所の変更で済む方法はないのか?
情報源がいろいろあって分かりにくかったので、1ページにまとめました。
※下記で./
はプロジェクトルートディレクトリを指します。
package.jsonを設定
./package.json
に"homepage": "/sub_dirctory/"
を追加します。
{
"name": "project001",
"version": "0.1.0",
"private": true,
// -- any things
// -- any things
+ "homepage": "/sub_dirctory/"
}
historyを追加
Routingを行っているjsファイルにて、Router系のJSXのpropsであるhistory
に設定を行います。
この時、ライブラリhistory/createBrowserHistory
が必要です。
history
を使っていない場合は、ここで新規にインストールします。
npmを使ってインストールする場合のコマンドです。
npm install history
npmではなくyarnの場合です。
yarn add history
次に、該当箇所に変更を入れます。
// -- any things
import MiniApp_001 from 'miniapp_001';
import MiniApp_002 from 'miniapp_002';
import { Router, Route, Switch } from 'react-router-dom';
import { createBrowserHistory } from 'history';
// -- any things
const customizedhistory = createBrowserHistory({ basename: '/sub_dirctory' });
// -- any things
class App extends React.Component {
render() {
return (
// -- any things
<Router history={customizedhistory}>
<Switch>
<Route exact path="/" component={MiniApp_001} />
<Route exact path="/test" component={MiniApp_002} />
<Route component={NotFound} />
</Switch>
</Router>
// -- any things
);
}
}
export default App;
上から順に説明していくと、
まず、先ほどインストールしたhistory
からcreateBrowserHistory
をインポートします。
import {createBrowserHistory} from "history"
次に、createBrowserHistory
を使って、/subdirectory
を指定するためのオブジェクトcustomizedhistory
を用意します。
const customizedhistory = createBrowserHistory({ basename: '/sub_dirctory' });
JSXオブジェクトであるRouter
のprops
に、history
があります。このhistory
の値にcustomizedhistory
を設定します。
<Router history={customizedhistory}>
この例ではRouter
を用いていますが、他にBrowserRouter
やHashRouter
、MemoryRouter
、StaticRouter
があります。いずれも同様に設定可能です。
ちなみに、JSXのネストの根っ子にRouterは1個あればいいです。<Switch/>
設置するたびに<Router/>
設置すると沼にハマります。
.htaccessを設定する
Apache の場合にはhtaccessの設定を必要とします。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ ./index.html [QSA,L]
Rewrite系構文のドキュメント
nginx.confを設定する
nginxの場合はnginx.conf
に下記設定を追記する必要があります。
location ^~ /sub_dirctory{
alias /var/www/project001/build;
try_files $uri $uri/ /sub_dirctory/index.html;
}
まとめ
多くのWebフレームワークでは、ドメインのルートに設置する前提で設計されています。もちろんReactも例外ではありません。デフォルトでは/
に設定されています。しかし、いくつか設定すれば簡単に変更できます。
多くのWebフレームワークがDRYの原則から生まれたようなもの。これが出来るのは当たり前品質かもしれませんね。少しぐらいの誤差は吸収できるように、ロバストなコードを使えばサボれる。サボりは大切です。
Excelsior!