# azukiazusa のテックブログ2 > このブログは [azukiazusa](https://github.com/azukiazusa1) によって運営されている技術ブログです。主に Web フロントエンド周辺の技術について書いています。 ## Blog Posts - [ブログで llms.txt を提供してみた](https://azukiazusa.dev/blog/llms-txt.md): 従来のウェブサイトは人間用のマークアップが主であり、bot が情報を収集するために無駄な情報が多く含まれています。一方でウェブサイトを提供する側にとっても AI エージェントにより過剰なスクレイピングによりサーバーの負荷がかかることが問題となっています。LLM に適したコンテンツを提供するために Answer.AI の共同創業者である Jeremy Howard 氏により `llms.txt` というファイルが提案されました。 - [インラインで条件分岐する CSS の if() 関数](https://azukiazusa.dev/blog/inline-conditional-css-if-function.md): if() 関数は CSS Values and Units Module Level 5 という仕様で提案されている関数です。if() 関数は CSS でインラインの条件分岐を可能にします。 - [ブラウザで非同期イベントストリームを処理する Observable API](https://azukiazusa.dev/blog/observable-api-for-handling-asynchronous-event-streams-in-the-browser.md): Observable API は非同期イベントストリームを処理するための API です。 EventTarget に .when() メソッドを追加し addEventListener() よりも宣言的で優れたイベントハンドリングを提供します。 - [ブラウザに広くサポートされていない CSS を検証する require-baseline ESLint ルール](https://azukiazusa.dev/blog/require-baseline-eslint-rule-to-validate-css-not-widely-supported-in-browsers.md): Baseline はブラウザで利用可能な JavaScript や CSS のサポート状況を明確化するプロジェクトです。ESLint/CSS の require-baseline ルールを使用することで、Baseline でサポートされていない CSS プロパティや値を検出することができます。 - [アップグレードされた CSS の `attr()` 関数を使う](https://azukiazusa.dev/blog/upgraded-css-attr-function.md): `attr()` 関数は HTML の属性を読み取り、それを CSS で利用できるようにする関数です。従来までは `content` プロパティのみで使用できましたが、CSS Values and Units Module Level 5 ではこの制限が見直され、`attr()` 関数がカスタムプロパティを含む任意の CSS プロパティで使用できるようになりました。 - [ボタンが押し込まれた状態を表す Press Button の提案](https://azukiazusa.dev/blog/proposal-press-button.md): UI デザインにおいてボタンが「押し込まれた」状態を表現することはしばしばあります。しかし、ネイティブの HTML 要素では表現できず `aria-pressed` 属性を使用する必要がありました。Press Button Proposal では `type="press"` 属性を追加することでボタンが押し込まれた状態を表現することが提案されています。 - [Deno v2.2 で追加されたビルドイン OpenTelemetry サポートを試してみる](https://azukiazusa.dev/blog/deno-v2-2-opentelemetry.md): Deno v2.2 でビルドインの OpenTelemetry サポートが追加されました。アプリケーションのコードに変更を加えることなく、Deno のビルトイン API から自動的にテレメトリーデータを計装できるようになります。 - [Prisma で OpenTelemetry のトレースデータを計装する](https://azukiazusa.dev/blog/prisma-opentelemetry-trace.md): Prisma は OpenTelemetry の仕様に準拠したトレースデータを計装するためのパッケージを提供しています。この記事では、Prisma で OpenTelemetry のトレースデータを計装する方法について紹介します。 - [スキーマバリデーションライブラリの標準インターフェース standard-schema](https://azukiazusa.dev/blog/schema-validation-library-standard-interface-standard-schema.md): スキーマバリデーションライブラリはここ数年で人気を集めています。多くのライブラリが登場する中で、standard-schema はスキーマバリデーションライブラリの標準インターフェースを提供します。これにより、エコシステムツールがユーザー定義の型検証ツールをより簡単に受け入れられるようにすることを目指しています。 - [パスキーによる認証をブラウザで実装してみる](https://azukiazusa.dev/blog/implement-path-key-in-browser.md): パスキーとはパスワードに代わる認証方法で、生体認証やデバイス PIN を使ってログインができる仕組みです。ユーザーはパスワードを覚える必要がなく、またフィッシング攻撃にも強いという点からよりセキュア認証方法として注目を集めています。この記事では WebAuthn を使ってパスキーをブラウザで実装する方法を紹介します。 - [React Server Components を手軽に扱うフレームワーク react-server](https://azukiazusa.dev/blog/react-server.md): react-server は Node.js で JavaScript ファイルを実行するかのように React Server Components を扱うことを目的としたフレームワークです。Next.js の機能が過剰に感じられるような小さなアプリケーションを開発する際に有用です。 - [型安全にクエリパラメーターを扱う nuqs](https://azukiazusa.dev/blog/type-safe-query-string-parameters-with-nuqs.md): フロントエンドの状態管理のパターンとしてクエリパラメータを信頼できる唯一の情報源(single source of truth)として扱うことがあります。ですが、クエリパラメーターの型が文字列であるため、型安全性が保証されないという課題があります。この記事では `nuqs` というライブラリを使用してクエリパラメーターを型安全に扱う方法について解説します。 - [ダイアログの Light dismiss を有効にする `` 属性](https://azukiazusa.dev/blog/dialog-closedby-attribute-for-light-dismiss.md): `` 属性はダイアログの外側をクリックした際にダイアログを閉じる Light dismiss 機能を実現するための属性です。closedby 属性は `any`, `closerequest`, `none` の 3 つの値を受け付けます。 - [React の `` コンポーネントで宣言的にページ遷移アニメーションを追加する](https://azukiazusa.dev/blog/declarative-page-transition-animation-with-react-viewtransition-component.md): `` コンポーネントは React の実験的なバージョンとして導入されました。これは View Transition API を 宣言的な方法で使用できるようにするものです。 - [MPA でページ遷移アニメーションを行う `@view-transition` CSS アットルール](https://azukiazusa.dev/blog/view-transition-css-at-rule-for-page-transition-animation-in-mpa.md): View Transition API はページを遷移する際に簡単にアニメーションを追加できる API です。SPA では `document.startViewTransition()` メソッドを DOM が変更される前に呼び出すことでページ遷移アニメーションを追加できます。MPA の場合 CSS アットルール `@view-transition` を使用できます。SPA の場合と異なり、JavaScript を使用せずに CSS だけでアニメーションを追加できる点が特徴です。 - [scroll-state() CSS コンテナクエリを使用して sticky で張り付いたときに境界線を出す](https://azukiazusa.dev/blog/scroll-state-function-to-show-border-when-sticky.md): scroll-state() はコンテナ要素のスクロール状態に応じてスタイルを変更することができるコンテナクエリです。例えば、スクロール中にヘッダーを sticky な場合の境界線を表示することが挙げられます。 - [ユーザーにヒントを表示するための `popover=hint` 属性](https://azukiazusa.dev/blog/popover-hint-attribute.md): ポップオーバー API は 2024 年の Baseline に組み込まれており、主要なブラウザでサポートされています。Chrome Beta 133 では 3 番目の値として `hint` が追加されました。`popover=hint` はユーザーに対してヒントを表示する「ツールチップ」として動作します。この記事では `popover=hint` 属性について詳しく見ていきます。 - [AI エディター Cursor を試してみる](https://azukiazusa.dev/blog/try-ai-editor-cursor.md): AI エディター Cursor は GitHub Copilot と同様にコードの補完やチャットによるコードの生成をサポートしてくれます。Cursor は VS Code をフォークして作られており、既存の VS Code の拡張機能やキーバインドをそのまま利用することも特徴の 1 つです。 - [GitHub Actions で再利用可能なワークフローを作成する](https://azukiazusa.dev/blog/github-actions-reusable-workflow.md): GitHub Actions で CI/CD 環境を構築する際に、同じような処理を複数のファイルで記述するようなことがよくあります。この記事では、GitHub Actions で再利用可能なワークフローを作成する方法と、実際に再利用可能なワークフローを作成する手順を紹介します。 - [2024 年に読んでよかった本](https://azukiazusa.dev/blog/books-read-in-2024.md): 私は今年 1 年間でおおよそ 300 冊の本を読んだようです。その中から、特に印象に残った本をいくつか紹介します。 - [カード UI の入れ子のリンクの問題を解決する Link Area Delegation の提案](https://azukiazusa.dev/blog/link-area-delegation-proposal.md): 多くのウェブサイトではリンクを入れ子にしたカード UI が利用されています。しかし、このような UI では HTML 仕様に違反していたり、ハッキーな手法で実装されていることがあります。Open UI コミュニティでは Link Area Delegation という提案を行っており、標準化された方法で入れ子のリンクを実装することで UX やアクセシビリティを損なうことを防ぐことを目的としています。この記事では Link Area Delegation の内容について紹介します。 - [MSW で Web Socket のリクエストをモックする](https://azukiazusa.dev/blog/msw-mock-web-socket-request.md): Mock Service Worker (MSW) の v2.6.0 から Web Socket のリクエストをモックすることができるようになりました。Web Socket のサポートのリクエストは 2020 年から存在しており、多くの議論の末 4 年の歳月を経てリリースされた機能となります。この記事では、MSW で Web Socket のリクエストをモックする方法を紹介します。 - [Zod を使って OpenAI の構造化された出力を扱う](https://azukiazusa.dev/blog/zod-openai-structured-output.md): OpenAI の gpt-4o-2024-08-06 以降のモデルではパラメータとして JSON Schema を指定することで構造化された出力をサポートしています。Node.js 向けの OpenAI SDK では Zod を使ってスキーマを定義し、構造化された出力を扱うことができます。この記事では実際に Zod を使って OpenAI の構造化された出力を扱う方法を紹介します。 - [Tailwind CSS v4 で導入される CSS First Configurations](https://azukiazusa.dev/blog/tailwind-css-v4-css-first-configurations.md): Tailwind CSS v4 における最も大きな変更点の 1 つは、CSS First Configurations です。今まで `tailwind.config.js` で設定していたテーマなどの設定を CSS ファイル内で行うことができるようになります。 - [アクセシビリティツリーを比較する Playwright の Aria snapshots がよさそう](https://azukiazusa.dev/blog/playwright-aria-snapshot.md): Playwright の Aria snapshots はアクセシビリティツリーを比較することでテストする手法です。アクセシビリティツリーは DOM のスナップショットテストと比較して、外部から見た振る舞いが変わりづらいという利点があります。`.toMatchAriaSnapshot()` メソッドを使ってアクセシビリティツリーのスナップショットテストを行うことができます。 - [新しいパッケージマネージャーの vlt を使ってみる](https://azukiazusa.dev/blog/new-package-manager-vlt.md): vlt は npm と互換性のあるパッケージマネージャーです。`npm` と同じように、パッケージのインストールや script の実行ができます。また、npm registry 互換のサーバーレジストリである vsr も同時に提供されています。 - [Next.js で OpenTelemetry を使用した計装を行う](https://azukiazusa.dev/blog/instrumentation-with-opentelemetry-in-nextjs.md): この記事では Next.js で OpenTelemetry を使用した計装を行う方法について紹介します。Next.js では `instrumentation.ts` ファイルを使用して監視ツールやログツールの計装を設定できます。 - [Next.js の "use cache" ディレクティブによるキャッシュ制御](https://azukiazusa.dev/blog/cache-control-with-use-cache-directive-in-nextjs.md): Next.js の App Router はデフォルトでキャッシュされる設計でリリースされました。一方でデフォルトでキャッシュされることに対して不満を持つ開発者も多かったように思います。このようなフィードバックを受けて、Next.js 15 ではいくつかのキャッシュ戦略が変更されました。さらに現在 canary チャンネルで提供されている dynamicIO フラグを有効にすることで、"use cache" ディレクティブを用いてキャッシュを制御できるようになります。 - [JavaScript でスタイルシートを構築する CSSStyleSheet](https://azukiazusa.dev/blog/cssstylesheet-to-build-stylesheets-in-javascript.md): CSSStyleSheet インターフェースは、JavaScript でスタイルシートを構築し、操作するための API です。CSSStyleSheet() コンストラクターで新しいスタイルシートを作成し、.replaceSync() メソッドでスタイルを適用できます。 - [react-to-web-component を使って React コンポーネントを Web Components に変換する](https://azukiazusa.dev/blog/react-to-web-component.md): @r2wc/react-to-web-component は React コンポーネントを Web Components に変換するためのライブラリです。このライブラリを使用することで、React コンポーネントを任意の HTML 要素として使用することが可能になります。 - [HTML だけで Shadow DOM を構築するための宣言型 Shadow DOM](https://azukiazusa.dev/blog/declarative-shadow-dom.md): 宣言型 Shadow DOM は `