Astro 7 に上げた:Rust コンパイラは速い、刺されたのはコールドキャッシュ
Astro 7 はコンパイラと Markdown パイプラインを Rust に、バンドラを Rolldown に置き換えた。移行自体は軽かったが、その後に出てきた問題は軽くなかった。
Astro 7 は 2026 年 6 月 22 日に出た。売り文句は一行で済む。今回のリリースは速度がすべて。
中身はかなり入れ替わっている。
.astroコンパイラを Rust で書き直し- Markdown / MDX が新しい Rust パイプラインを通る
- レンダリングエンジンをキュー方式に置き換え
- Vite 8、つまり Rolldown バンドラ
- 公式ベンチマークでビルドが 15〜61% 高速
- ルートキャッシュが安定化、Netlify / Vercel / Cloudflare 向けの CDN キャッシュ provider も(実験的)
src/fetch.tsによる Advanced Routing でリクエストパイプラインを丸ごと引き受けられる- AI コーディングエージェントの検出、バックグラウンド dev サーバー、構造化 JSON ログ
このサイトは 533 ページ、CSS 40 本、検索インデックス 532 ページ。移行そのものは安かった。時間を食ったのは、移行の後に出てきたものだ。
罠その一:CJS 専用の依存が事前バンドルされなくなる
アップグレード後の最初の astro sync がこう落ちた。
require is not defined
原因は自分のコードではない。コンテンツコレクション(src/content.config.ts が astro/loaders の glob を使う)の依存チェーンに CJS 専用のパッケージがあり、コンテンツコレクションは astro という名前の Vite environment で評価される —— client でも ssr でもない。トップレベルの optimizeDeps は client にしか効かないので、その環境では事前バンドルされず、モジュールランナーが CJS ファイルを ESM として評価してしまう。
直し方は環境を名指しで指定すること。
optimizeDeps: { include: ['picomatch'] }, // client 環境
environments: { astro: { optimizeDeps: { include: ['picomatch'] } } }, // astro 環境
両方必要。そして astro だけ、ssr は書かない —— 両方書くと astro dev が全ページ 500 になる。
罠その二:温かいキャッシュが本当の失敗を隠す
この問題、以前に「直した」つもりでいた。回避策を消すと dev は即座に戻り、ビルドも緑だった。
それは偽の緑だ。node_modules/.vite は .gitignore にあるのでローカルでは常に温かく、前回ビルドの依存が残っている。キャッシュを消して走らせると、最初のステップで同じエラーが出る。
「この回避策はもう不要」と判断できる唯一の方法は、コールドキャッシュでの再検証だ。
node_modules/.viteを消すか、クリーンなマシンか CI で走らせる。ローカルの緑は何も証明しない。
罠その三:ビルドが通っても dev は動かない
このプロジェクトの失敗の形は二通りある。
astro buildは最後まで正常なのに、astro devはどのリクエストにも 500 を返す。ログには「コンポーネントインスタンスが見つからない」の一行だけ。- dev は ready を出し、そのあと全リクエストで 500。
つまりビルド設定を触ったあとは、ready を見ただけでは足りない。実際にページを一つリクエストして 200 を確認する必要がある。
今の手順
四段階、必ずこの順で。
node_modules/.vite(と.astro)を消し、コールドでastro syncnpm run checkが 0/0/0npm run buildのページ数が合う- dev を起動し、少なくとも五つの異なるルート(ホーム / 一覧 / 記事 / アプリ / 言語入口)をリクエストして、すべて 200 を確認
四番目が最も省かれやすく、最も壊れやすい。省いた回は、あとで必ず払い戻しがあった。

コメント
…