Nuxt3/vite(SSR) での production build 後に
/public 以下は通常ディレクトリのように使えると思ってたんだけど、
アップロードしたものが上手く読めず、うーん、、となっていたら、
issues上がってて、ビルド後に .output/public にファイル追加できないらしい。。マジか。。
https://github.com/nuxt/nuxt/issues/15779#issuecomment-1397418353
最適化の一環でビルド前にあるもんだけを配信するらしい。。おい。。
んでとりあえずその後のコメントに
/server/routes バイパス置いて sendStream しろという事だったので、
パスごと渡してそのままpublicディレクトリ読みにいくように修正した。
export default defineEventHandler(async (event) => { let base = "public/"; if (process.env.NODE_ENV === "production") { base = path.join(".output/", base); } base = path.join(process.cwd(), base); const filePathSegments = event.context.params.path; const filePath = path.join(base, filePathSegments); return sendStream(event, fs.createReadStream(filePath)); });
んで composables にこんなの用意しておいて
export function getFile(str: string) { let result = "/file/" + str; result = result.replace("//", "/"); return result; }
動的生成が絡む部分でこんな感じで/public 以下と同じ感じでいけた。
:src="getFile('/images/test.png')"
どっかのアプデで将来的に普通にアクセスできるようになるんかな、、
書いて思ったけどNitroのproduction buildの話だったねこれ。
you
追記
結局build後の/publicディレクトリ以下をNuxt側で配信しないんなら
Nuxtのソース環境化に置かずにrootディレクトリに置いておけば
dev,prod両方から共通ソースが見れるし、build時に書き直されたりコピーが出来たりもしないので
そっちの方が求めてた挙動に近いので./outputと同ディレクトリに動的生成箇所を持つ方式に変更しました。