banner
cos

cos

愿热情永存,愿热爱不灭,愿生活无憾
github
tg_channel
bilibili

Tailwind CSS v4.0 のアップグレードと Astro 5.2 プロジェクト移行記録

自用小记。

Tailwind CSS v4.0 - Tailwind CSS

  • 新しい高性能エンジン - 完全ビルドの速度が 5 倍速く、インクリメンタルビルドの速度は 100 倍以上速くなります —— マイクロ秒単位で測定。
  • 現代の Web デザインのために - 最先端の CSS 機能に基づいて構築され、カスケードレイヤー、 @propertycolor-mix() などの最先端 CSS 機能を使用してカスタムプロパティを登録。
  • 簡素化されたインストール - 依存関係が少なく、ゼロ設定で、CSS ファイル内に 1 行のコードを追加するだけ。
  • ファーストパーティ Vite プラグイン - 高性能と最低限の設定を実現するために緊密に統合。
  • 自動コンテンツ検出 - すべてのテンプレートファイルは自動的に検出され、設定は不要。
  • 組み込みインポートサポート - 追加のツールなしで複数の CSS ファイルをバンドル。
  • CSS ファースト設定 - 再設計された開発者体験で、JavaScript 設定ファイルではなく CSS 内でフレームワークを直接カスタマイズおよび拡張できます。
  • CSS テーマ変数 - すべてのデザイントークンがネイティブ CSS 変数として公開され、どこでもアクセス可能。
  • 動的ユーティリティ値とバリアント - スペーシングにどの値があるかを推測する必要がなくなり、基本データ属性などの拡張設定も不要。
  • 現代化された P3 カラーパレット - より生き生きとした再設計されたパレットで、現代の表示技術を最大限に活用。
  • コンテナクエリ - コンテナのサイズに基づいて要素のスタイルを設計するためにコンテナクエリを使用でき、プラグインは不要。
  • 新しい 3D 変換ユーティリティ - HTML 内の 3D 空間で要素を変換し、 rotate-x-*rotate-y-*scale-z-*translate-z-* などの 3D 変換用 API を追加。
  • 拡張されたグラデーション API - 放射状および円錐グラデーション、補間モードなど。現在、線形グラデーションは角度を値としてサポートしているため、 bg-linear-45 などのユーティリティを使用して 45 度の角度でグラデーションを作成できます。 bg-gradient-*bg-linear-* に名前変更。
  • @starting-style サポート - 新しい starting バリアントは、新しい CSS @starting-style 機能のサポートを追加し、要素が最初に表示されるときに要素属性を遷移させることができます:
  • not-* バリアント - 要素が他のバリアント、自カスタムセレクタ、またはメディアや機能クエリに一致しない場合にスタイルを適用。
  • さらに多くの新しいユーティリティとバリアント - color-scheme のサポート、 field-sizing 、複雑なシャドウ、 inert など。

さらに新しいバリアント#

  • 新しい inset-shadow-*inset-ring-* ユーティリティ - 1 つの要素に最大 4 層のボックスシャドウをスタックできます。
  • 新しい field-sizing ユーティリティ - 自動化されたテキスト列用で、1 行の JavaScript を書く必要がありません。
    • field-sizing-content を使用して、フォームコントロールが内容に基づいてサイズを調整できるようにします。
    • field-sizing-fixed で固定サイズを使用:
  • 新しい color-scheme - light-dark () を使用した CSS 配色スキーム関連の色を参照。
  • 新しい font-stretch ユーティリティ - 異なる幅をサポートする可変フォントを慎重に調整するためのもの。
  • 新しい inert バリアント - inert バリアントを使用すると、要素を inert 属性としてスタイル付けでき、視覚的なヒントを追加するのに役立ち、コンテンツの各部分がインタラクティブでないことを明確に示します。
  • 新しい nth-* バリアント - nth-*nth-last-* バリアントを使用して、リスト内の子の位置に基づいてスタイルを設定できます。デフォルトでは、これらの数字に任意の数字を渡すことができ、 nth-[2n+1_of_li] などのより複雑な式に任意の値を使用できます。例: nth-3:underline nth-last-5:underline nth-last-of-type-6:underline
  • 新しい in-* バリアント - group-* に非常に似ていますが、 group クラスは不要です。
    • in-* バリアントは、任意の親の状態変化に応じて反応するため、より細かい制御が必要な場合は group を使用する必要があります。
  • サポート:popover-open - 既存の open スタイルバリアントを使用して、オープンポップオーバーにも対応。
  • 新しい子孫バリアント - 良いも悪いもすべての子孫要素をスタイル付けするためのもの。
    • * と同様に、 ** バリアントも要素の子要素にスタイルを設定するために使用できます。主な違いは、 ** がすべての子孫にスタイルを適用するのに対し、直接の子孫だけではないことです。これを別のバリアントと組み合わせて選択範囲を狭めるときに特に便利です。

移行記録#

既存のプロジェクトについては、包括的なアップグレードガイドを公開し、最新バージョンをできるだけ早く無痛で使用するための自動アップグレードツールを構築しました。

小さなプロジェクトで試してみて、自動化移行コマンドを実行します。

npx @tailwindcss/upgrade@next

移行出力は以下の通りです。

 tailwindcss v4.0.2
 現在のディレクトリとそのサブディレクトリ内のCSSファイルを検索中…
 `./tailwind.config.js` `./src/styles/theme/shadcn.css` にリンク
 JavaScript設定ファイルを移行中…
 `./tailwind.config.js` の設定ファイルは新しいCSS設定形式に自動的に移行できなかったため、CSSは
   既存の設定ファイルを読み込むように更新されました。
 テンプレートを移行中…
 設定ファイルのためにテンプレートを移行: `./tailwind.config.js`
 スタイルシートを移行中…
 スタイルシートを移行: `./src/styles/theme/shadcn.css`
 PostCSS設定を移行中…
 インストールされたパッケージ: `@tailwindcss/postcss`
 削除されたパッケージ: `autoprefixer`
 削除されたパッケージ: `postcss-import`
 PostCSS設定を移行: `./postcss.config.js`
 依存関係を更新中…
 更新されたパッケージ: `prettier-plugin-tailwindcss`
 更新されたパッケージ: `tailwindcss`
 変更を確認し、リポジトリにコミットしてください。
npm verb exit 0
npm info ok

自動的にほとんどの作業が完了したことがわかります。 flex-grow -> grow / flex-shrink -> shrink などのクラス名の更新が行われ、成功裏に移行されました。うん、表面的には何も問題がないようです。次に別の astro 5.1 プロジェクトのアップグレードを試してみましょう。まずは更新スクリプトを実行します。

% sudo npx @tailwindcss/upgrade@next
npm verb cli /usr/local/bin/node /usr/local/lib/node_modules/npm/bin/npm-cli.js
npm info using [email protected]
npm info using [email protected]
npm verb title npm exec @tailwindcss/upgrade@next
npm verb argv "exec" "--" "@tailwindcss/upgrade@next"
npm verb logfile logs-max:10 dir:/Users/cosine/.npm/_logs/2025-02-03T10_01_41_235Z-
npm verb logfile /Users/cosine/.npm/_logs/2025-02-03T10_01_41_235Z-debug-0.log
npm sill logfile start cleaning logs, removing 1 files
npm sill logfile done cleaning log files
npm http fetch GET 200 https://registry.npmjs.org/@tailwindcss%2fupgrade 489ms (cache updated)
 tailwindcss v4.0.2

 現在のディレクトリとそのサブディレクトリ内のCSSファイルを検索中…

 `./tailwind.config.mjs` `./src/styles/global/tailwind.css` にリンク

 JavaScript設定ファイルを移行中…

 設定ファイルを読み込めませんでした: undefined は関数ではありません

npm verb exit 1
npm verb code 1

良いですね、エラー 設定ファイルを読み込めませんでした: undefined は関数ではありません が出ました。調べたところ、プラグインの互換性がないことが原因でした。(設定ファイルを読み込めませんでした: v は関数ではありません・tailwindlabs/tailwindcss・Discussion #15781・GitHub)

以前に移行が成功したプロジェクトには、これらの 2 つのプラグインがありました: tailwindcss-animate@tailwindcss/typography

問題のある astro プロジェクトには tailwind-clip-path プラグインが追加されていました。コメントアウトすると正常に実行されました。

// tailwind.config.js
module.exports = {
  plugins: [
    require("@tailwindcss/container-queries"),
    require("tailwindcss-animate"),
    // require("tailwind-clip-path"),
    require("@tailwindcss/typography"),
  ],
};

それから、試しに起動してみます:

> [email protected] dev /Users/cosine/Documents/Programming/cos-space
> astro dev

パッケージのサブパス './nesting/index.js' は、/Users/cosine/Documents/Programming/cos-space/node_modules/.pnpm/@[email protected][email protected]_@[email protected][email protected][email protected][email protected]._5qh5alcn5ztelwntajptz64i4q/node_modules/tailwindcss/package.json "exports" によって定義されていません
  スタックトレース:
    at exportsNotFound (node:internal/modules/esm/resolve:304:10)
    at packageResolve (node:internal/modules/esm/resolve:837:14)
    at defaultResolve (node:internal/modules/esm/loader:359:25)
    at ModuleLoader.resolve (node:internal/modules/esm/loader:322:34)
    at ModuleLoader.import (node:internal/modules/esm/loader:322:34)
 ELIFECYCLE  コマンドは終了コード1で失敗しました。

良いですね、astro の移行はそれほど簡単ではないと知っていました。 astro/packages/integrations/tailwind/CHANGELOG.md at main · withastro/astro · GitHub を確認すると、Tailwind CSS は現在 Vite プラグインを提供しており、これは Astro で Tailwind 4 を使用するための推奨方法です。元の @astrojs/tailwind をアンインストールし、tailwind のドキュメントに従って手動でインストールします。

うん、Astro のバージョンもAstro 5.2 | Astroにアップグレードする必要があります。

npx @astrojs/upgrade
pnpm rm @astrojs/tailwind
pnpm i tailwindcss @tailwindcss/vite

成功しました!設定ファイルを比較してみましょう。

diff --git a/astro.config.mjs b/astro.config.mjs
index bf8e9b1..20513bd 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -1,22 +1,17 @@
 // @ts-check
 import react from '@astrojs/react';
-import tailwind from '@astrojs/tailwind';
 import { siteConfig } from './src/constants/site-config';
 import icon from 'astro-icon';
 import { defineConfig } from 'astro/config';
 import svgr from 'vite-plugin-svgr';
 import umami from '@yeskunall/astro-umami';
+import tailwindcss from '@tailwindcss/vite';

 // https://astro.build/config
 export default defineConfig({
   site: siteConfig.site,
   integrations: [
     react(),
-    tailwind({
-      //  Tailwindの構文に基づいてネストされたCSS宣言を書くことを許可
-      nesting: true,
-      applyBaseStyles: false,
-    }),
     icon({
       include: {
         gg: ['*'],
@@ -35,7 +30,7 @@ export default defineConfig({
     enabled: true,
   },
   vite: {
-    plugins: [svgr()],
+    plugins: [svgr(), tailwindcss()],
   },
   trailingSlash: 'never',
 });
diff --git a/tailwind.config.mjs b/tailwind.config.mjs
index a7de2d0..28e5899 100644
--- a/tailwind.config.mjs
+++ b/tailwind.config.mjs
@@ -140,10 +140,5 @@ export default {
       },
     },
   },
-  plugins: [
-    require('@tailwindcss/container-queries'),
-    require('tailwindcss-animate'),
-    require('tailwind-clip-path'),
-    require('@tailwindcss/typography'),
-  ],
+  plugins: [require('@tailwindcss/container-queries'), require('tailwindcss-animate'), require('@tailwindcss/typography')],
 };

元のプラグインは無効になり、@plugin のインポートも機能しませんが、CSS 内に直接書くことができるので問題ありません。また、レイヤーの階層の問題がいくつかのスタイルの継承に影響を与える可能性があります。全体的に見て、この 2 つの小さなプロジェクトの移行は問題なく行えました。今後の移行については、この文章を更新していきます。

アップグレード問題解決策のまとめ#

問題 1:Astro PostCSS 設定の競合#

Error: Package subpath './nesting/index.js' is not defined by "exports" in...

対策

  1. Astro を 5.2 + バージョンにアップグレード npx @astrojs/upgrade
  2. @astrojs/tailwind をアンインストール
  3. 古い PostCSS プラグイン依存関係をクリーンアップ
  4. tailwind のドキュメントに従って手動でインストールし、 tailwindcss @tailwindcss/vite / astro add tailwind をインストール
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。