Communitygithub.com

バニラ静的サイト on Cloudflare Pages

フレームワークを使わない静的サイト(HTML/CSS/JS)をCloudflare Pagesに構築・デプロイします。GitHub自動デプロイ、キャッシュバスティング、デプロイ後自動リロード、セキュリティヘッダー機能を備えています。

バニラ静的サイト on Cloudflare Pages とは?

このスキルは、フレームワークに依存しないバニラの静的サイト(HTML/CSS/JS)をCloudflare Pages上で構築・運用するための完全なワークフローを提供します。ビルドステップが不要で、ファイルを編集してmainブランチにプッシュするだけで自動デプロイされるため、開発サイクルが非常に高速です。「ツールチェーンと戦わない」という哲学のもと、小〜中規模のサイトに最適化されています。スキルには、デプロイのたびにアセット参照にGitハッシュベースのバージョンクエリ(?v=)を付与するキャッシュバスティングスクリプト、バージョン変更を検出してユーザーに通知・自動リロードする小さなJavaScriptスニペット、インラインスクリプトの構文チェックツール、Content-Security-PolicyやX-Frame-Optionsなどのセキュリティヘッダー設定例が含まれます。また、CSS変数ベースのテーマ管理やダークモードの階層設計についての実践的なガイドラインも提供し、「古いキャッシュが表示される」「フレームワーク選定で迷う」といった問題を解決します。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Mreboredo/skills-cobros-argentina/tree/HEAD/vanilla-site-cloudflare

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Cloudflare Pages上のバニラ静的サイト

ビルドステップ不要。ファイルを編集 → main にプッシュ → Cloudflare Pagesが自動デプロイ。高速で安価、ツールチェーンと格闘することはありません。

バニラを選ぶ理由(判断基準)

  • ビルド/CIの煩わしさゼロ。2行のコピー修正も30秒でデプロイ。
  • フレームワークへのロックインや書き換えのコストがありません。「追加、書き換えなし」がルール。
  • サイト全体がgrep可能で、デバッグしやすく、直感的。
  • トレードオフ: より手動のDOMコードが必要。小〜中規模なら価値があります。

リポジトリ + デプロイ

  • 1つのGitHubリポジトリ → Cloudflare Pagesプロジェクト、mainブランチへのプッシュで自動デプロイ。
  • Pagesはリポジトリルートを配信。クリーンURL: /mi-cuenta.html は /mi-cuenta で配信されます。
  • Functions(サーバーレス)は /functions に配置(supabase-backend 参照)。

デプロイルーティン(毎回のデプロイで実施)

  1. ファイルを編集します。
  2. JSがコンパイルできるか確認 — 壊れたインラインJSをプッシュしないでください。インライン <script> ブロックを抽出し、それぞれに vm.compileFunction を実行。.js/.cjs ファイルは node --check を使用。reference/verify-inline.cjs を参照。
  3. アセットをキャッシュバストする: node .claude/cache-bust.cjs — HTML内の assets/**/*.css|js 参照すべてに ?v=<git-short-hash> をスタンプし、version.json を書き込みます。reference/cache-bust.cjs を参照。
  4. バージョンスタンプを更新(単一の真実源は1つのJSファイルにあり、フッターに控えめに表示)し、ログに記録します。バージョン管理スキームについては project-continuity を参照。
  5. コミット(そのプロジェクトの言語で説明的に、共著者トレーラーを付けて)、main にプッシュ。
  6. ライブ確認: curl でデプロイされたアセットを取得し、新しいバージョンスタンプと、version.json がアセットの ?v= と一致することを確認(一致しないと自動リローダーがループします)。Cloudflareのボット対策はプレーンなクローラーをブロックするので、ブラウザのUser-Agentを使用してください。

.claude/ は通常gitignoreされるため、キャッシュバスト/確認スクリプトはローカルに残ります(リポジトリではなく、ビルド時に自分のマシンで実行されます)。

キャッシュバスティング + 自動リロード(「表示されない」問題を解消)

2つのレイヤー。どちらも reference/ にあります:

  1. cache-bust.cjs — デプロイのたびにすべてのアセット参照に ?v=<git hash> を再スタンプし、ブラウザが変更されたCSS/JSを再取得するようにします。さらに version.json = {"v":"<hash>"} を書き込みます。
  2. 自動リローダー (reference/auto-reload.js) — すべてのページに含まれる小さなスクリプトで、自身の読み込まれた ?v= を読み取り、/version.json(no-store で配信)をポーリングし、新しいデプロイを検出すると: タブに戻ったときにリロード(安全なタイミング)、閲覧中はワンタップの「Actualizar」バナーを表示し、入力途中に中断することはありません(window.__noAutoReload で試験/チェックアウトフローなどをオプトアウト)。ブートストラップの注意点: 初回のみ、ユーザーは一度ハードリフレッシュしてリローダーを読み込みます。以降は自動的になります。

マーカーを常に新鮮に配信するには _headers を使用:

/version.json
  Cache-Control: no-store, max-age=0

セキュリティヘッダー(リポジトリルートの _headers)

常に設定: Content-Security-Policy(script-src/frame-src/connect-src を正確なCDN + Supabase URL + リアルタイム用のwssに制限)、X-Frame-Options: DENY、X-Content-Type-Options: nosniff、Referrer-Policy: strict-origin-when-cross-origin、Permissions-Policy、Strict-Transport-Security。実際の注意点: 動画iframeを埋め込むには、プレイヤードメインを frame-src に追加しないと、ブラウザが静かにブロックします。

再利用可能なCSSの慣例

  • CSS変数を使ったトークンベースのテーマ設定。data-theme="dark" の再マップと共有の localStorage キーで、テーマがページ/タブ間で同期されます。
  • ダークモード: コントラストの確保だけでは不十分。レイヤー階層(bg < surface < card)を明るい段階とシャドウで可視化しないと、フラットに見えます。
  • white/色はハードコードしないでください。トークンを使ってテーマが応答するようにします。
  • グローバルな .btn/.btn-primary は壊さないでください。スコープ内で上書きします。

このスキルに含まれるファイル

  • reference/cache-bust.cjs — アセットスタンパ + version.json 書き込みツール
  • reference/auto-reload.js — デプロイ自動リローダー(グローバルに読み込まれるJSファイルに追加)
  • reference/verify-inline.cjs — デプロイ前にインライン <script> ブロックのコンパイルチェックを行うツール
  • reference/headers-example — スターター用の _headers

関連スキル