Astroで大量の画像を扱おうとしたら踏んだ穴
大量の画像を扱うのは実用的ではない
これはAstroに限らずSSG全般に言えることだが、画像が大量にあるとコンパイルがクッソ遅くなる。かつ容量が大きい画像ほど遅い。
ので、写真をメインに見せるサイトなどでサイト内部に画像を抱えるのはきついとわかった。
具体的には5MB~30MBの画像6000枚で、大中小サイズ、サムネイルをあわせて3万枚の画像がある場合は無理すぎた。
Astroは下記の問題でビルドが通らなかったので分からないが、Nanocで試すとビルドに2時間とかかかってしまう。
そして画像ではなくちょっとMarkdownの文言を変更しただけでもまた再ビルドで凄まじく時間がかかるので、実用は到底無理だった。
回避策としてはとりあえず画像サーバーはほかに立てて、コンテンツとしての画像はSSGの管理下からは外した。
とりあえずこの方法しか術はないような気がする。
Cannot find package ‘html-escaper’
ついでの話になるが、npm run buildが通らなくなって、以下のエラーを吐いて停止するようになってしまった。
error Cannot find package 'html-escaper' imported from /mnt/d/dist/entry.mjs
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'html-escaper' imported from /mnt/d/dist/entry.mjs
at new NodeError (node:internal/errors:371:5)
at packageResolve (node:internal/modules/esm/resolve:864:9)
at moduleResolve (node:internal/modules/esm/resolve:910:18)
at defaultResolve (node:internal/modules/esm/resolve:1005:11)
at ESMLoader.resolve (node:internal/modules/esm/loader:530:30)
at ESMLoader.getModuleJob (node:internal/modules/esm/loader:251:18)
at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:79:40)
at link (node:internal/modules/esm/module_job:78:36)
html-escaperは入ってるしなんでやねん、と長時間あれこれと調べたり試したりして首をひねったが、端的に言うと原因はdistをシンボリックリンクにしていたことだった。
シンボリックリンクを使ったのは上記の大量画像によってWSLに割り当てられたディスク領域があふれてしまったため。
public以下にソースとなる画像、tmp以下にコンパイル中の中間データ、dist以下にコンパイルされたコンテンツが入るので3倍のディスク容量が必要となるのだね。
5時間くらいかけて無理なことが分かったという進捗であった。