~Hiroki Kayanuma

このサイトを Astro 7 にアップグレードした

このサイトを Astro 6.4 から Astro 7.0 にアップグレードした。結論から言うと本体の移行はほぼノーコード変更で完了したが、その後の依存関係まわりで 2 つほど罠を踏んだので、あわせて記録しておく。

更新したパッケージ

パッケージ 変更
astro ^6.4.6 → ^7.0.6
@astrojs/cloudflare ^13.7.0 → ^14.1.1

@astrojs/rss@astrojs/sitemap@astrojs/check はそのままで Astro 7 に対応済みだった。

Astro 7 の主な破壊的変更

Rust コンパイラがデフォルトに

Go 製コンパイラが Rust 製(@astrojs/compiler-rs)に置き換わった。ビルドが速くなる一方で、不正な HTML に厳格になり、閉じタグのない要素はエラーになる。このサイトはビルド一発で通ったので影響なし。

Markdown プロセッサが Sätteri に

.md のレンダリングが remark/rehype から Astro ネイティブの Sätteri パイプラインに変わった。remark/rehype プラグインを使っている場合は @astrojs/markdown-remark を明示的にインストールして設定する必要がある。

// astro.config.mjs — remark/rehype を使い続ける場合
import { unified } from '@astrojs/markdown-remark';

export default defineConfig({
  markdown: {
    processor: unified(),
  },
});

このサイトはプラグインなしの素の Markdown なので Sätteri のまま移行した。日本語見出しの ID 生成(<h2 id="技術スタック">)も従来どおりで、レンダリング結果に目立った差はなかった。

compressHTML のデフォルトが ‘jsx’ に

HTML の空白除去が JSX ルールになり、インライン要素間の改行由来のスペースが消えるようになった。英文サイトだと <span>hello</span> <em>world</em> のような箇所に影響しうる。従来挙動に戻すなら compressHTML: true(HTML-aware 圧縮)か false(無圧縮)を設定する。

そのほか

  • advanced routing がデフォルト有効化src/fetch.ts がエントリポイントとして予約された。同名ファイルがある場合はリネームが必要
  • astro:transitions の非推奨 API 削除createAnimationScope()TRANSITION_* 定数など
  • @astrojs/db 削除node:sqlite や Drizzle ORM への移行が案内されている

いずれもこのサイトでは未使用だった。チェックリスト的に grep して確認しただけで済んだ。

罠 1: Dependabot の transitive 依存

アップグレード後も Dependabot が undici / ws / yaml / esbuild の脆弱性を報告し続けていた。いずれも直接依存ではなく、wrangler や miniflare が exact バージョンで固定している transitive 依存なので、pnpm update undici では何も起きない。

対処は 2 段構え:

  1. 親パッケージごと上げる — wrangler を最新化すると undici / ws / esbuild の修正版が入った。pnpm update --depth Infinity @cloudflare/vite-plugin miniflare で古い pin も一掃
  2. どうにもならないものは overrides — yaml は volar-service-yaml が古い yaml-language-server を固定していたため、pnpm-workspace.yamloverrides で強制した
# pnpm-workspace.yaml
overrides:
  yaml: ^2.9.0

ここで注意点がひとつ。pnpm 11 は package.json の top-level "overrides"読まない(npm 用のフィールド)。以前から置いてあった vite の override は実は一度も効いていなかった。pnpm の overrides は pnpm-workspace.yaml に書く。

罠 2: CI の pnpm バージョン不一致

overrides を追加した途端、Cloudflare Workers Builds のデプロイがこけた。

ERR_PNPM_LOCKFILE_CONFIG_MISMATCH  Cannot proceed with the frozen installation.
The current "overrides" configuration doesn't match the value found in the lockfile

原因はローカルが pnpm 11、CI が pnpm 10 だったこと。pnpm 11 が lockfile に記録した overrides セクションを pnpm 10 は同じように解釈できず、「設定と lockfile が一致しない」と判定して frozen install を拒否する。

修正は package.json に 1 行。

"packageManager": "pnpm@11.6.0"

Workers Builds は packageManager フィールドを尊重するので、これで CI もローカルと同じバージョンを使う。lockfile を触るツールはバージョンを固定しておくべきだった、という教訓。

まとめ

  • Astro 7 本体の移行は、破壊的変更に該当機能がなければ package.json の更新だけで終わる
  • 移行そのものより、wrangler / miniflare の transitive 依存と pnpm のバージョン差異のほうが手間だった
  • packageManager フィールドは最初から書いておくのが吉