Astro v5のエイリアス解決に対応するため、`config.createResolver`へのフォールバックを実装

tailwindlabs/tailwindcss

@tailwindcss/viteで、Vite Environment APIが利用可能な環境でもconfig.createResolverを適切にフォールバックするようになりました。これにより、Astro v5のようにEnvironment APIとレガシーなリゾルバの両方が混在する環境で、インポートエイリアスが正常に動作するようになります。

背景

Astro v5では、Vite Environment APIが利用可能なバージョンを使用している一方で、内部的にはconfig.createResolverをオーバーライドしてカスタムエイリアスを注入しています。Vite 7.0.0でconfig.createResolverは正式に非推奨となりましたが、それ以前のバージョンでは技術的に有効な手法でした。#19677は、この混在状況でTailwindのインポートエイリアスが機能しなくなる問題を報告しています。

@tailwindcss/viteは、Environment APIが利用可能な場合はvite.createIdResolver()を使用し、そうでない場合はconfig.createResolver()を使用する実装でした。しかし、Astro v5のように両方が存在する環境では、Environment APIの存在によりconfig.createResolver()が呼ばれず、Astroが設定したエイリアスが無視される問題が発生していました。

技術的な変更

packages/@tailwindcss-vite/src/index.tsに、Vite内部で使用されているcreateBackCompatIdResolver()関数が追加されました。この関数は、Environment名に応じて適切なリゾルバを選択します。

変更前:

// Newer Vite versions
let cssResolver = vite.createIdResolver(env.config, {
  // ...
});

変更後:

function createBackCompatIdResolver(
  config: ResolvedConfig,
  options?: Partial<InternalResolveOptions>,
): ResolveIdFn {
  const compatResolve = config.createResolver(options)
  let resolve: ResolveIdFn
  return async (environment, id, importer, aliasOnly) => {
    if (environment.name === 'client' || environment.name === 'ssr') {
      return compatResolve(id, importer, aliasOnly, environment.name === 'ssr')
    }
    resolve ??= vite.createIdResolver(config, options)
    return resolve(environment, id, importer, aliasOnly)
  }
}

let cssResolver = createBackCompatIdResolver(env.config, {
  // ...
});

createBackCompatIdResolver()は、Environment名が'client'または'ssr'の場合にconfig.createResolver()を優先的に使用します。それ以外のEnvironmentでは、代わりにvite.createIdResolver()が使用されます。この判定により、Astro v5のような環境でも正しくエイリアスが解決されます。

統合テストintegrations/vite/astro.test.tsには、tsconfig.jsonでエイリアスを定義し、Astroの<style>ブロック内で@referenceディレクティブを使用するケースが追加されました。

'tsconfig.json': json`
  {
    "compilerOptions": {
      "paths": {
        "@styles/*": ["./src/styles/*"]
      }
    }
  }
`,

このテストケースは、#19677で報告された問題を再現し、修正が有効であることを検証します。

設計判断

Viteの内部実装をコピーする方式が採用されました。

PR本文では、Vite自身が内部的にこのフォールバックロジックを使用しているものの、公開APIとして提供していないことが述べられています。createBackCompatIdResolver()関数はViteのソースコードから直接コピーされ、必要な調整が加えられています。関数内のコメントでも「Copied as-is from vite」と明示されています。

clientssrという特定のEnvironment名に依存する判定ロジックは、Viteの標準的なEnvironment命名規則に基づいています。vitejs/vite#20031config.createResolverが正式に非推奨となったことを踏まえ、将来的にVite 7未満のサポートを終了する際には、この関数を削除する予定がコメントに記載されています。

まとめ

本PRは、Environment APIとレガシーなリゾルバAPIが混在する環境での互換性問題を解決しています。Viteの内部実装を活用することで、Astro v5のようなフレームワークが設定するカスタムエイリアスを正しく解決できるようになりました。Vite 7への移行期における実用的な対応として、既存のエコシステムとの互換性を保ちつつ、新しいAPIへの移行を支援する設計判断が反映されています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
4回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

記事の構成は「リード文(総論)→セクション群(各論)→まとめ(結論)」というガイドラインに完全に準拠しています。必須要素である背景、技術的な変更、さらに任意である設計判断まで網羅されており、非常に分かりやすい構成です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト、GitHubのIssue/PRへのリンク記法など、全てのカスタムMarkdown構文が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

ViteやAstroの知識を持つエンジニアを対象としており、専門用語を適切に使用しつつ、冗長な初心者向けの説明を排除しています。技術レベルが対象読者に完全に適合しています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが「総論→各論」で構成され、各段落は明確なトピックセンテンスで始まっています。「1段落1トピック」の原則も守られており、非常に読みやすい文章構造です。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているコードブロックは、提供されたDiff情報と正確に一致しています。ファイル名も正しく、変更内容を的確に反映しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`Vite Environment API`や`config.createResolver`などの技術用語が、PRの文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

Astro v5でエイリアス解決が失敗する原因と、`createBackCompatIdResolver`による解決策の説明は技術的に正確で、論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(Astro v5との関連性、Viteの非推奨化の経緯、内部実装のコピーなど)は、PRのDescriptionやコードコメントによって完全に裏付けられており、ハルシネーションは一切見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#19679)、Issue番号(#19677)、関連するViteのPR番号など、すべての数値と固有名詞は正確に記載されています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトルはPRの主題を的確に要約しており、特にユーザーへの影響(Astro v5でのエイリアス解決)を明示することで、PRの内容をより分かりやすく伝えています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事で言及されているViteの非推奨化に関する情報は、PR Descriptionに記載されている内容を正確に反映したものであり、PRに基づかない外部知識の捏造はありません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「正式に非推奨となった」「将来的に削除する予定」といった時間表現は、PR内の情報("properly deprecated", "TODO"コメント)と正確に一致しています。