Next.js、Vercel AI、Tolgee を使用してカンバン ボードを構築する

Patricia Arquette
リリース: 2024-11-17 22:17:02
オリジナル
535 人が閲覧しました

TL;DR

この記事では、WebSocket を使用し、データベース サポート、Vercel AI SDK による AI サポート、Tolgee によるローカリゼーションを備えた Next.js でリアルタイム カンバン ボードを構築します。

学ぶ内容: ✨

  • Express を使用せずに Next.js で WebSocket サーバーをセットアップします。
  • NextAuth を使用して Next.js に資格情報ベースの認証を実装します。
  • Docker またはクラウド プロバイダーを使用して PostgreSQL データベースを構成します。
  • タスク説明の AI サポートを Vercel AI SDK と統合します。
  • Tolgee を使用してリアルタイム翻訳とローカリゼーションを追加します。

Tolgee リポジトリにスターを付ける ⭐

AI とローカリゼーション サポートを備えた独自のかんばんボードを構築する準備はできていますか? ?

Building a Kanban Board with Next.js,Vercel AI and Tolgee


プロジェクトのセットアップ ?️

Next.js アプリケーションの初期化

次のコマンドを使用して、新しい Next.js アプリケーションを初期化します。

ℹ️ 任意のパッケージ マネージャーを使用できます。このプロジェクトでは、npm を使用します。

npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次に、新しく作成した Next.js プロジェクトに移動します。

cd kanban-ai-realtime-localization

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

依存関係のインストール

いくつかの依存関係が必要になります。次のコマンドを実行して、プロジェクトに必要なすべての依存関係をインストールします:

npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

UIコンポーネントのセットアップ

UI コンポーネントの場合は、shadcn/ui を使用します。次のコマンドを使用してデフォルト設定で初期化します:

npx shadcn@latest init -d

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここで、後でアプリケーションで使用する UI コンポーネントを追加しましょう。再利用可能なコンポーネントを shadcn/ui から追加するには、次のコマンドを実行します:

npx shadcn@latest add button card input label select textarea toast

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

app/components/ui ディレクトリ内に、これらのコンポーネント用にいくつかの追加ファイルが追加されます。これらのファイルは、アプリケーションの UI を構築するときに使用します。


データベースモデルをセットアップしますか?

Prismaの初期化中

次のコマンドを使用して Prisma を初期化します:

npx prisma init

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このコマンドを実行すると、プロジェクトのルートにある prisma ディレクトリに新しい schema.prisma ファイルが作成されます。

Prisma スキーマの定義

新しく作成した schema.prisma ファイルを変更して、データベースとして PostgreSQL を使用し、ユーザー モデルとタスク モデルを含めます。

// ? prisma/schema.prisma

// This is your Prisma schema file,
// learn more about it in the docs: <https://pris.ly/d/prisma-schema>

// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: <https://pris.ly/cli/accelerate-init>

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id       String @id @default(cuid())
  email    String @unique
  password String

  tasks Task[] @relation("UserTasks")

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Task {
  id          String  @id @default(cuid())
  title       String
  description String?
  userId      String

  column Int
  order  Int

  createdBy User @relation("UserTasks", fields: [userId], references: [id])

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

モデルは単純です。各ユーザーは複数のタスクを持つことができ、各タスクは特定のユーザーにリンクされています。タスクには、そのステータスを表す整数列値があります (進行中は 0、保留中は 1、完了は 2)。順序の値によって、割り当てられた列内での各タスクの位置が決まります。

モデルの準備ができたので、それをデータベースにプッシュする必要があります。このためには、接続 URL が必要です。

Neon または別のサービスを使用してデータベースにすでにアクセスできる場合は、それが最適です。 .env ファイルに接続 URL を入力します。 docker を使用してデータベースをローカルにセットアップする必要はありません。


Docker を使用してデータベースをローカルにセットアップしますか?

手順に従って、Docker を使用してローカル PostgreSQL データベースでプロジェクトを試してみたい場合は、この接続文字列値を含む DATABASE_URL という名前の新しい変数を .env ファイルに追加します。

npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

データベースをローカルで実行するには、Docker がインストールされていることを確認してください。プロジェクトのルートに script という名前の新しいディレクトリを作成し、次のコード行を含む start-local-db-docker.sh というファイルを追加します。

cd kanban-ai-realtime-localization

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このスクリプトは基本的に、DATABASE_URL 変数の .env ファイルを読み取り、ユーザー名、パスワード、データベース名などの関連データをすべて抽出し、コンテナーが存在しない場合はコンテナーを作成します。すでに実行されている場合は、単に既存のコンテナを起動します。

このスクリプトを実行して、アプリケーションのすべてのユーザー データをホストする PostgreSQL コンテナを作成して実行します。

npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これで、PostgreSQL を使用したコンテナが実行されるはずです。これに該当するかどうかは、次のコマンドを実行して確認できます:

npx shadcn@latest init -d

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次に、データベースと対話するために Prisma クライアントをインスタンス化する方法が必要です。

src/db ディレクトリ内に新しいファイル index.ts を作成し、次のコード行を追加します。

npx shadcn@latest add button card input label select textarea toast

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

PrismaClient のシングルトン インスタンスをセットアップして、インスタンスが 1 つだけ作成され、アプリケーション全体で再利用されるようにします。これは特に開発モードで役立ちます。

エクスポートした定数 db を使用して、アプリケーション内のデータベースと対話できるようになりました。

次のコマンドを実行して、スキーマの変更をデータベースにプッシュします。

npx prisma init

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここで、更新された型を IDE で機能させるには、次のコマンドを実行して、更新されたスキーマに基づいて新しい型を生成します。

// ? prisma/schema.prisma

// This is your Prisma schema file,
// learn more about it in the docs: <https://pris.ly/d/prisma-schema>

// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: <https://pris.ly/cli/accelerate-init>

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id       String @id @default(cuid())
  email    String @unique
  password String

  tasks Task[] @relation("UserTasks")

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Task {
  id          String  @id @default(cuid())
  title       String
  description String?
  userId      String

  column Int
  order  Int

  createdBy User @relation("UserTasks", fields: [userId], references: [id])

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

アプリケーション データベースをセットアップするために必要なのはこれだけです。 ?


ローカリゼーションのために Tolgee をセットアップする ?️

Tolgee を使用して Next.js アプリケーションでローカリゼーションを有効にするには、次の手順に従います。

  1. language.ts を作成する

このファイルは言語検出と Cookie 管理を処理します。

// ? .env

# If you are using local DB with docker
DATABASE_URL=postgresql://postgres:password@localhost:5432/kanban-board

ログイン後にコピー

setLanguage 関数は、選択した言語 (ロケール) を 1 年間の有効期限を持つ Cookie として保存し、アプリがセッション間でユーザーの言語設定を記憶できるようにします。

getLanguage 関数は、Cookie に保存されている言語を確認します。有効な言語が見つかった場合は、それを返します。それ以外の場合、ブラウザで実行されている場合は、ブラウザのヘッダーから言語を検出しようとします。検出が失敗した場合、または環境がブラウザではない場合、デフォルトは DEFAULT_LANGUAGE になります。

  1. shared.ts の作成

このファイルには、翻訳用の静的データの取得など、ローカリゼーションを処理するための共有定数と関数が含まれています

npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

getStaticData 関数は、特定の言語と名前空間の翻訳をロードして、ローカライズされたコンテンツをプリフェッチする役割を果たします。言語と名前空間ごとにメッセージ ディレクトリから JSON ファイルを取得し、すべてを 1 つのオブジェクトにバンドルして返します。

アプリケーションでの言語選択では、4 つの異なる言語の選択肢 (英語、チェコ語、フランス語、ドイツ語) がユーザーに提供されます。必要に応じて、他の言語のサポートを追加できます。

プロジェクトのルートにあるメッセージ ディレクトリ内に、さまざまな単語や文の異なる静的データを保存します。

ℹ️ これらの静的翻訳ファイルへのリンクは私のリポジトリにあります。このファイルは他の言語の翻訳文の束であるため、説明することは何もありません。

TolgeeBase 関数は、翻訳を処理するツールを使用して Tolgee をセットアップします。 ICU メッセージ形式 (FormatIcu) のサポートが追加され、デバッグ用の DevTools が含まれています。この関数は、環境変数の API キーと URL を使用し、フォールバック言語として英語 (en) を設定します。

  1. 環境変数を更新します

2 つの異なる環境変数を使用し、.env ファイルにこれらの API キーを設定します。 Tolgee でアカウントにサインアップして TOLGEE_API_KEYS にアクセスしますが、このアプリケーションの場合、その API キーを持っている必要はありません。

cd kanban-ai-realtime-localization

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  1. server.ts の作成

このファイルは、サーバー側レンダリング用に Tolgee インスタンスを構成し、翻訳処理を設定します。

npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このコードは、サーバー側の翻訳処理用の Tolgee インスタンスを作成します。まず、ユーザーの優先言語を取得する getLanguage 関数を使用するように getLocale を設定します。次に、createTolgee で、getStaticData を通じて、サポートされているすべての言語の翻訳データを使用して Tolgee を初期化します。

また、(getLanguage から) 提供された言語を使用するように Tolgee を設定し、revalidate: 0 を設定して常に新しいデータをロードするようにカスタム フェッチ関数を構成し、翻訳リクエストのキャッシュを防ぎます。

  1. client.ts を作成します

これにより、クライアント側レンダリング用の Tolgee プロバイダーが設定されます。

npx shadcn@latest init -d

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このコードは、翻訳用にクライアント側の Tolgee プロバイダーを設定します。 TolgeeProviderClient は、言語、staticData、および子を小道具として受け取り、指定された言語とデータで Tolgee を初期化します。 useEffect 内では、permanentChange で言語の変更をリッスンし、言語が更新されるたびに router.refresh() を通じてページを更新します。

最後に、TolgeeProvider は子をレンダリングします。ssr オプションを使用して翻訳をプリロードし、翻訳がすぐに準備できない場合は「読み込み中...」を表示します。

  1. layout.tsx で TolgeeProviderClient を使用してアプリケーションをラップします

最後に、アプリケーションを でラップします。すべての翻訳にアクセスできるようにするためのコンポーネントです。

npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここではまず、ヘッダーまたは関数から設定した Cookie に基づいてユーザーのロケールにアクセスします。次に、そのロケールを に提供します。タグ。

Next.js アプリケーションで Tolgee を設定するために必要なのはこれだけです。 ✨これは、Next.js アプリケーションで Tolgee を使用して位置情報を実装するために実行する必要がある標準プロセスになります。


認証を設定しています ?️

アプリケーションでは認証に NextAuth を使用します。まず、ユーザーが渡したデータを検証するために使用する新しい Zod スキーマを定義することから始めましょう。

検証用の Zod スキーマ

ログインおよび登録時に電子メールとパスワードのユーザー入力を検証するための Zod スキーマ (AuthSchema) を定義します。これにより、電子メールの形式が正しく、パスワードが指定された長さの要件を満たしていることが保証されます。

cd kanban-ai-realtime-localization

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

電子メールフィールドには他の文字列ではなく正確な電子メールを指定する必要があり、パスワードフィールドは最小長 8 文字、最大長 20 文字にする必要があります。この検証スキーマを複数の場所で使用して、ログイン/登録フォームでユーザーが渡したデータを検証し、基準を満たしているかどうかを確認します。

NextAuth 構成

認証に CredentialsProvider を使用して、route.ts の src/app/api/auth/[...nextauth] に NextAuth を設定します。承認関数は、資格情報を検証し、ユーザーの存在を確認し、パスワードを検証します。

npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

承認関数ロジックは、ユーザーがログインするかどうかを決定します。このセットアップの関数は、指定された電子メールとパスワードがデータベース内の既存のユーザーと一致するかどうかを確認します。

資格情報ベースの認証のみを使用しています。まず、フィールド検証に AuthSchema を使用して資格情報を検証します。検証が成功すると、データベース内のユーザーを電子メールで検索します。ユーザーが見つかると、データベース内のハッシュされたパスワードと入力されたパスワードが比較されます。両方のチェックに合格すると、ユーザーのデータ (パスワードを除く) が返されます。

ご想像のとおり、ここでは .env ファイル内で NEXTAUTH_SECRET 変数を定義する必要があります。 .env ファイルに次の 2 つの変数を入力します:

npx shadcn@latest init -d

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ユーザー登録API

src/app/api/auth/register/route.ts で、パスワードをハッシュしてユーザー データをデータベースに保存するユーザー登録用のエンドポイントを作成します。その後、検証の成功に基づいて適切な応答を返します。

npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここでは、クライアントから受信したデータを解析し、前に作成した AuthSchema を使用して検証します。次に、ローテーション値 12 のハッシュを作成します。これにより、データベースに保存する暗号化テキストが生成され、最後にユーザーが返されます。

次に、アプリケーションをより堅牢なものにするために、ユーザーが特定のルートを訪問するたびに userSession をチェックするミドルウェアを追加しましょう。ユーザーが認証されていない場合、そのルートへの訪問は許可されません。

経路保護用ミドルウェア

認証されていないユーザーの /kanban ルートへのアクセスを制限するミドルウェアを追加します。

cd kanban-ai-realtime-localization

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここでは、ユーザーが認証されていない場合、「/kanban」ルートにアクセスできないようにする必要があると言っています。

認証を処理するためのバックエンド ロジックが完了しました。クライアント側のロジックに取り組んでみましょう。


ナビゲーションバーコンポーネントの構築

Navbar コンポーネントは、いくつかの小さなコンポーネントでも構成されます。ログイン、登録、ログアウトするためのボタンと、ユーザーが言語を切り替えられるようにするための選択タグがあります。

これらのコンポーネントの作業を始めましょう!

LangSelector コンポーネント

src/app/components ディレクトリ内に、次のコード行を含む新しいファイル lang-selector.tsx を作成します。

npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

コンポーネントは一目瞭然です。