はじめに
先日作ったExpressアプリの改造です。
このときの課題として、Reactアプリを、サーバーアプリのpublicの直下に置く方法しかわからなかったのですが、フォルダを掘れたのでその内容です。
上の記事では、②-3のあたりの話。
最終系
public/scatter-app-build
以下に、丸っとコピーしています。
routes/index.jsだけの話
router.get('/', function(req, res, next) {
// res.sendFile("index.html"); // 削除
res.sendFile("index.html", { // ①追加
root: path.join("public","scatter-app-build"),
});
});
// ↓②追加
router.use(express.static(path.join("public","scatter-app-build")));
①の追加分があるrouter.get()
の目的は、URLで/
とリクエストが来た場合は、index.html
を返すよということ。なのでここで、デフォルトのpublic/index.html
から、public/scatter-app-build/index.html
を返すよう変更します。
参考:Express 4.x - API リファレンス(Express公式)
②の関数は、URLで/
以下でファイル名を指定された場合に見に行くファイル群のこと。たとえば、http://~~~/favicon.ico
を頂戴って言われたら、どのファイルを渡す?という設定。ここでは、/~
と最上位の直下で呼び出されるときは、public/scatter-app-build/~
のファイルを返してということ。http://~~~/favicon.ico
と言われたら、public/scatter-app-build/favicon.ico
となります。
これは、public/scatter-app-build/index.html
の中から、.jsファイルやら.cssファイルを呼び出しているので、その時に行きます。逆にいうと、②の関数がないと、.jsとか.cssがない(読み込めない)となります。
以上です。
ついで話
今後、別のアプリもこのExpressに載せたくなった場合、http://~/
以下は入口として、http://~/scatter-app/
で今のアプリ、http://~/another-app/
で別のアプリ、とかやりたくなります。
その場合も今回の話が生きて、②の関数の書き方を変えて対応します。
やり方は2つあって、1つは、
// public以下を階層ごと全部公開する
router.use(express.static("public"));
として、public以下の構造を、全部公開すること。まぁこれもありのケースも多そう。
もう1つは、このURLの場合はこのフォルダ、このURLの場合は別のこっち、という方法。第一引数に、"このURLの場合は~"というのを追加します。
// アプリごとに公開するフォルダを指定する
router.use("/scatter-app", express.static(path.join("public","scatter-app-build")));
router.use("/another-app", express.static(path.join("public","another-app-build")));
どちらもやりたいときはありそうではあります。
参考:Express での静的ファイルの提供(Express公式)
階層を分けた場合、追加でやらないといけないこと
URLのルーティングはそれでいいんですが、Reactアプリでbuildされる、index.html
は、/~.js
を読むようになってます。http://~/scatter-app/index.html
のファイルを開けても、そのjsファイルが/
から始まるということは、http://~/~.js
を見にいっちゃうという問題。
./~.js
になっててくれれば、http://~/scatter-app/~.js
を読んでくれるので、./
にする=相対パスにする設定が必要です。
方法は、Reactアプリのpackage.json
に、homepage: "./"
を追加するだけ。
{
"name": "scatter-app",
"version": "0.1.0",
"private": true,
"homepage": "./",
"main": "index.html",
・・・略・・・
}
もし厳格にやりたければ、scatter-app/
とかにすればいいのかもしれないけど、アプリの設定でサーバーのURLを書くのは嫌な気分です。なのでカレント以下を見てねという相対パス設定がよいと、思います。
まとめ
少しずつ、Expressさんとも仲が良くなってきた気がします。恰好悪くてもとりあえず作って出し、改善点があったら直していくというスタンスで、どんどんアウトプットしていこうと思います!
今思ってる改善点は、Renderを使った今のサイトは、15分アクセスしないと次回起動時に数十秒かかるので、Next.jsの一部にしたいなーという点。
今回気づいた相対パスの設定があるので、できそうな感触です。
ではまた。