🎻

【① サイト作成】SvelteKit on Cloudflareでお問い合わせフォームをつくる

2024/11/13に公開

私たちは都内を中心に活動しているアマチュアオーケストラの Orchestra Canvas Tokyo です。

今回、弊団のホームページ、ブログをリファクタリングし、パブリックリポジトリとして公開しました 🎉
homepage / blog

この中で、お問い合わせフォームを SvelteKit と Cloudflare 系のサービスで構築しました。

今回は、実際にお問い合わせフォームをつくっていきながら、ここで得た知見を共有していきます!


このシリーズの記事一覧

  1. ① サイト作成:SvelteKit x Cloudflare Pages ← 今回の記事
  2. ② フォーム作成:SvelteKit x Zod x Google reCAPTCHA v3
  3. ③ セッション:SvelteKit x Cloudflare KV
  4. ④ データベース:SvelteKit x Cloudflare D1
  5. ⑤ メール送信:SvelteKit x Resend

このシリーズの完成物
https://github.com/horn553/zenn-contact-form


はじめに

お問い合わせ窓口

しばしばお問い合わせは来るものです。
弊団のようなアマチュアオーケストラでは、演奏会に関する質問、参加希望、チラシの掲載依頼などなど……

このようなお問い合わせを受け付ける窓口をどのように掲載するか。悩みどころです。
大きく選択肢は 2 つでしょうか。

  1. メールアドレスを掲載する
  2. フォームを用意する

1. メールアドレスを掲載する

シンプルな方法に見えますが、やや考慮事項が多いです。

直接メールアドレスを掲載するのは避けたほうがよいです。
Web 上を回遊しているアドレス収集 bot に捕まってしまい、スパムの標的とされてしまうからです。

対策として、メールアドレスの難読化があげられます。
古典的にメールアドレスの @ などの代替文字に置換したり、メールアドレスの一部や全部を画像に置換したり、はたまた JavaScript を用いて難読化処理をかけます。

最近、Cloudflare による難読化サービスの紹介記事も話題になりましたね!
https://zenn.dev/kameoncloud/articles/a3e762f94b069f

Cloudflare による難読化サービスを用いれば、非 bot に対してはコピー可能な文字列を描画するため、ユーザビリティをそこまで損ねません。
しかし、それ以外の方法では、ユーザビリティを損ねかねません。

2. フォームを設置する

お問い合わせフォーム・メールフォームを掲載する方法です。

実装の工数はかかってしまいますが、きちんと設計・実装すればユーザービリティをかえって高めることが可能です。
必要な情報を別入力欄として切り出したり、カテゴリーに応じて動的に入力欄を調整したり……

問い合わせる側、問い合わせを受ける側双方が便利な内容にできます。

今回採用した技術構成

お気に入りの SvelteKit を用います。
Cloudflare Pages が開発に際し大変便利ですので、それを軸に構成していきます。
詳しくはこの記事で述べていきます!

種類 仕様技術 備考
フレームワーク SvelteKit Svelte4(TypeScript, HTML, CSS)
リポジトリ GitHub
ホスティング Cloudflare Pages GitHub と連携
セッション管理 Cloudflare KV パッケージとしてsvelte-kit-sessionsを使用
データベース Cloudflare D1 ORM としてDrizzleを使用
CAPTCHA Google reCAPTCHA v3

価格

ここでは、今回セットアップする Cloudflare Pages についてまとめます。
次々回以降で触れる Pages Functions、KV、D1 などについては、都度提示します。

無料プランでは次のような仕様となっています。
参考: Cloudflare Pages

  • 同時ビルド数: 1 件
  • ビルド上限: 500 件/月
  • カスタムドメイン数上限: 250 個/プロジェクト
  • サイト数、静的アセット容量、帯域幅: 無制限

なんと太っ腹な!
大抵のサイトに十分耐えうる水準ではないでしょうか。

環境構築

SvelteKit プロジェクトの作成

まずは SvelteKit のプロジェクト作成します。
参考:Creating a project • Docs • Svelte

今回は次のような設定としました。

  • SvelteKit demo テンプレート
  • TypeScript を使用
  • Prettier、ESLint を使用
npx sv create my-app
cd my-app
npm install
npm run dev

この後、画面の指示にしたがって Git へのコミットまで済ませます。

adapter-cloudflare の導入

Cloudflare Pages 向けにビルドするための adapter が用意されています。
ありがたく使わせていただきます。

npm i @sveltejs/adapter-cloudflare

SvelteKit のコンフィグファイルも更新します。
参考:Cloudflare Pages • Docs • Svelte

/svelte.config.js
import adapter from '@sveltejs/adapter-cloudflare';

export default {
  kit: {
    adapter: adapter({
      // See below for an explanation of these options
      routes: {
        include: ['/*'],
        exclude: ['<all>']
      },
      platformProxy: {
        configPath: 'wrangler.toml',
        environment: undefined,
        experimentalJsonConfig: false,
        persist: false
      }
    })
  }
};

GitHub リポジトリとの作成

GitHub でリポジトリを作成します。
表示されたガイドに従い、ローカルの Git に origin として設定します。

git remote add origin git@github.com:horn553/zenn-contact-form.git
git branch -M main
git push -u origin main

Cloudflare Pages アプリケーションの作成

Cloudflare ダッシュボードにログインし、Pages アプリケーションを作成します。

GitHub との連携を選択し、認可を進めていくと、先ほど作成したリポジトリを使用したアプリケーションを作成できます。

「ビルドとデプロイのセットアップ」でビルドの設定をする必要があります。
フレームワーク プリセットに SvelteKit が用意されているので、それを選択します。
(他の項目は自動的に埋められます)

ビルドとデプロイのセットアップ画面のスクリーンショット

「保存してデプロイ」を行うことで、プロジェクトの作成と最初のビルド・デプロイが行われます。

デプロイ成功後にデプロイ先の URL へアクセスすると、元気に動く SvelteKit の姿を見ることができます!

デプロイの仕様

管理画面で確認できるように、GitHub と連携して各プッシュに対し、ビルド・デプロイが自動実行されます。
本番環境として設定したブランチに対するプッシュは本番環境に、それ以外はプレビュー環境にデプロイされます。
本番環境、プレビュー環境、ブランチエイリアスの他、各プッシュごとの URL も発行され、大変便利です。

デプロイの詳細画面のスクリーンショット
デプロイ完了メール(デフォルトでは送られない)

プレビュー環境として一部のブランチのみを(allow list / deny list で)指定したい場合など、詳細な設定も用意されています。

デプロイの設定画面のスクリーンショット

カスタムドメインを使用

Pages プロジェクト作成時は、*.pages.devドメインが設定されています。
これにカスタムドメインをあてることが可能です。

アプリケーションのページの「カスタムドメイン」タブから管理できます。

デプロイの詳細画面のスクリーンショット

画面の指示に従うことで、セットアップは簡単に終了します。作業自体は 10 分もあれば終わります。
他社のネームサーバーを使用しているドメインの場合も、CNAME レコードを設定することで簡単にセットアップができます!

CNAMEセットアップ画面のスクリーンショット


おわりに

今回は、SvelteKit プロジェクトを Cloudflare Pages にデプロイする方法についてまとめました。

セットアップの簡便さ、プレビュー環境の自動生成、カスタムドメインの適応……
開発に便利ながら本番仕様にも耐えうる、ありがたいプロダクトではないでしょうか!

次回からは本格的にフォームの作成を進めていきます!


  1. ① サイト作成:SvelteKit x Cloudflare Pages
  2. ② フォーム作成:SvelteKit x Zod x Google reCAPTCHA v3 ← 次の記事
  3. ③ セッション:SvelteKit x Cloudflare KV
  4. ④ データベース:SvelteKit x Cloudflare D1
  5. ⑤ メール送信:SvelteKit x Resend
GitHubで編集を提案
OCTテックブログ

Discussion