Open5

Remix + Vite で CloudFront 経由でクライアントの資材を配布したい

oieioioieioi

vite.config で base を設定すると remix のほうでビルドした build/client がホスティングされなくなるっぽい。なので、CloudFront のオリジンが その remix サーバだと、base に CloudFrontのドメインをして指定するとオリジンから build/client が配布されなくなり、この方式だとremixがクライアント資産を配布しつつ、ユーザにはCloudFront経由でアクセスさせる作戦は無理っぽい?

oieioioieioi

remix の起動コマンドである packages/remix-serve/cli.ts の build/client とかのフロント用の資産の配布している箇所。
https://github.com/remix-run/remix/blob/b98a53eeb551459062a076f14186951b1cae7fec/packages/remix-serve/cli.ts#L128-L134

  • build.publicPath は vite.config で base で指定したものがそのまま渡る
  • build.assetsBuildDirectory は Remix のデフォルトだと build/client

-> base に CloudFront の URL を指定すると remix サーバ自身はこれをサーブできなくなる

app.use()


Viteの base の説明
Shared Options | Viteより

Base public path when served in development or production. Valid values include:

  • Absolute URL pathname, e.g. /foo/
  • Full URL, e.g. https://bar.com/foo/ (The origin part won't be used in development so the value is the same as /foo/)
  • Empty string or ./ (for embedded deployment)

See Public Base Path for more details.


Remix が Vite を採用するにあたって、publicPathbase に置き換えられた旨
Vite | Remix より

publicPath has been replaced by Vite's "base" option which defaults to "/" rather than "/build/".

oieioioieioi

結論: 現在のバージョン(v2.13.1)では正攻法では無理っぽい。

oieioioieioi

なので、 CloudFront で build/client 以下のファイル配布したい場合は、これを S3 に展開して vite.config.js で base を CloudFront のものに指定するしかない。