Astro 6 へのバージョンアップに備えて、実行環境の取り出し方を1か所に集めた

背景

このサイトは Astro 5 で作られています。Astro の公式は、最新バージョンとその一つ前のバージョンしか手入れをしません。最新バージョンが Astro 7 になった今、Astro 5 には安全上の修正も届かなくなりました。そこで、Astro 6、そして Astro 7 へ段階的に上げる準備を始めました。

Astro 6 での大きな変更の一つが、Cloudflare の実行環境を取り出す書き方の廃止です。

取り出すもの Astro 5 まで Astro 6 から
環境変数・データベース Astro.locals.runtime.env import { env } from "cloudflare:workers"
背景処理(waitUntil) Astro.locals.runtime.ctx Astro.locals.cfContext
国コードなどの接続情報 Astro.locals.runtime.cf Astro.request.cf

Astro 6 用の Cloudflare アダプター(Astro を Cloudflare 上で動かすためのパッケージ @astrojs/cloudflare)では、古い書き方を使うとその場でエラーになります。

問題:書き方が約180ファイルに散らばっていた

調べると、この書き方はサイト中の約180ファイル、約290か所で使われていました。バージョンアップと同時にこれを全部書き換えると、変更が大きくなりすぎます。何か壊れたときに、原因がバージョンアップなのか書き換えなのかを切り分けにくくなります。

対処:取り出し方を共通関数1つに集めた

実行環境を取り出す共通関数 getRuntime() を作りました。

// 実行環境(環境変数・背景処理・接続情報)を取り出す
export function getRuntime(locals) {
  // Astro 5 では locals.runtime に入っている
  const rt = locals?.runtime;
  return { env: rt?.env, ctx: rt?.ctx, cf: rt?.cf };
}

各ファイルでは、実行環境を取り出す1行だけを、この共通関数の呼び出しに置き換えました。

// 前
const { runtime } = Astro.locals;
// 後
const runtime = getRuntime(Astro.locals);

その下にある runtime.env.DB や runtime.ctx?.waitUntil(...) などの使い方は、一切変えていません。返す形を元と同じにしたためです。Astro 6 に上げるときは、getRuntime() の中身だけを新しい書き方に変えれば、サイト全体が新しい書き方に切り替わります。

書き換えは手作業ではなく、決まった形を置き換える小さなスクリプトで行いました。そのうえで、古い書き方が1か所も残っていないことを検索で確かめています。

確かめたこと

学んだこと

参考