Deno v2.8.x で `@tailwindcss/vite` がクラッシュする問題を修正

tailwindlabs/tailwindcss

Tailwind CSS の @tailwindcss/vite が Deno v2.8 系で context.parentURL が無効な URL のときに発生していたクラッシュを防止する修正が加えられました。

背景

Tailwind CSS の @tailwindcss/vite が Deno v2.8.x 環境で Vite のリゾルバが期待通りに動作しない問題が報告されました(#20232)。

この問題の根本は、@tailwindcss/vite が内部で利用する context.parentURL が URL 文字列でないケースで new URL(context.parentURL) を実行し、TypeError がスローされてビルドがクラッシュする点です。

Deno v2.7.x では正常に動作するものの、v2.8.x 以降で URL 正規化が厳格化されたことに起因し、@tailwindcss/vite@4.3.1 が Vite の tsconfig extends 解決を阻害していました。

技術的な変更

この PR では packages/@tailwindcss-node/src/esm-cache.loader.mtsprocessResolve 関数に例外安全化が追加され、context.parentURL が有効な URL でない場合にクラッシュを防止します。

変更前:

function processResolve(context: ResolveHookContext, result: ResolveFnOutput) {
  if (result.url === import.meta.url) return result
  if (isBuiltin(result.url)) return result
  if (!context.parentURL) return result

  let parent = new URL(context.parentURL)
  let id = parent.searchParams.get('id')
  if (id === null) return result

  let url = new URL(result.url)
  url.searchParams.set('id', id)

  return {
    ...result,
    url: `${url}`,
  }
}

変更後:

function processResolve(context: ResolveHookContext, result: ResolveFnOutput) {
  try {
    if (result.url === import.meta.url) return result
    if (isBuiltin(result.url)) return result
    if (!context.parentURL) return result

    let parent = new URL(context.parentURL)
    let id = parent.searchParams.get('id')
    if (id === null) return result

    let url = new URL(result.url)
    url.searchParams.set('id', id)

    return {
      ...result,
      url: `${url}`,
    }
  } catch {
    return result
  }
}

新しい実装は try { … } catch { return result } により、URL 生成に失敗した際は元の result をそのまま返すだけで処理を続行し、他のリゾルバロジックに影響を与えません。

設計判断

設計上、例外が発生した場合にビルド全体を停止させるよりも、失敗したリゾルバ呼び出しをスキップして既存の結果を返す方針が選択されました。

このアプローチは processResolve の副作用を最小限に抑え、既存の URL 正規化ロジックや isBuiltin 判定をそのまま保持しつつ、Deno の新しいバージョンでも安全に動作させるための後方互換性を提供します。

また、コード変更は 15 行の追加と 11 行の削除に留まり、ロジックの可読性と保守性を損なわない形で実装されています。

まとめ

@tailwindcss/vite が Deno v2.8.x でクラッシュする根本原因は context.parentURL が不正な URL だったことにあります。本修正は例外安全化を導入し、無効な URL が渡された場合でも元の解決結果を返すことでビルドを継続させます。これにより、Tailwind CSS の Vite プラグインは Deno の新バージョンでも安定して利用できるようになりました。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
5ec0e3e7

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文・背景・技術的変更・設計判断・まとめの5セクションが揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ✓ PASS

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

コードブロックは `ts:パス` 形式で正しく記載され、GitHubリンクは # 付きで正しいURLへリンクされています。

対象読者への適合性 ✓ PASS

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

専門的なエンジニア向けの内容で、余計な基礎説明はなく適切です。

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

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

各セクションが総論→各論→結論の構成で、段落はトピックセンテンスで始まり、1段落1トピック・適切な長さが保たれています。

Diff内容との照合 ✓ PASS

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

記事中の before/after コードは Diff に示された変更と完全に一致しており、追加・削除箇所も正確に反映されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

使用している技術用語は PR と一致し、誤用はありません。

説明の技術的正確性 ✓ PASS

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

例外安全化の目的や挙動は PR 記述と合致し、技術的に正確です。

事実の突合 ✓ PASS

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

全ての主張は PR タイトル・説明・Diff で裏付けられており、推測や根拠のない情報は含まれていません。

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

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

PR 番号 #20245、Issue 番号 #20232 など数値は正しく記載されています。

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

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

記事タイトルは PR の内容を正確に日本語化しており、一致しています。

外部知識の正確性 ✓ PASS

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

PR に記載されていないバージョンサポート情報やリリース日程等の外部知識は含まれていません。

時間表現の正確性 ✓ PASS

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

時間表現は PR の記述と整合しており、歪曲はありません。