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 を確認する必要がある。

今の手順

四段階、必ずこの順で。

  1. node_modules/.vite(と .astro)を消し、コールドで astro sync
  2. npm run check が 0/0/0
  3. npm run build のページ数が合う
  4. dev を起動し、少なくとも五つの異なるルート(ホーム / 一覧 / 記事 / アプリ / 言語入口)をリクエストして、すべて 200 を確認

四番目が最も省かれやすく、最も壊れやすい。省いた回は、あとで必ず払い戻しがあった。

← 記事一覧に戻る

コメント

…