Deno v2.8.x で `@tailwindcss/vite` がクラッシュする問題を修正
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.mts の processResolve 関数に例外安全化が追加され、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 の新バージョンでも安定して利用できるようになりました。