Quickstarters
リミックスフロントエンドを構築し、それをバックエンドに接続する方法?
19 分
このチュートリアルでは、remixを使用してto doリストアプリケーションを構築し、back4appの管理されたバックエンドサービスに接続します。 このステップバイステップガイドは、基本的なcrud操作を習得し、remixを使用して動的なユーザーインターフェースを設計するのに役立つように設計されています。 フルスタックアプリケーションを構築するには、フロントエンドとバックエンドの両方を設定する必要があります。back4appを使用することで、スケーラブルなバックエンドサービス(baas)を活用できるため、サーバーの設定に煩わされることなく、魅力的なユーザーエクスペリエンスの創造に集中できます。 back4appは、シームレスな統合のための使い勝手の良いデータベース、認証、クラウド機能、sdkを提供します。これらの機能を活用することで、remixアプリケーションを迅速にプロトタイプ、構築、展開できます。 主なポイント このチュートリアルに従うことで、あなたは 業界標準のツールを使用して、最新のremixプロジェクトを初期化します。 parse sdkを使用して、remixフロントエンドをback4appバックエンドに接続します。 crud操作を実装して、あなたの to doリスト を管理します。 remixアプリをコンテナ化し、back4app web deploymentを介して展開します。 前提条件 始める前に、次のものを用意してください node jsとnpm がシステムにインストールされていること。ターミナルで node v と npm v を実行して確認してください。 基本的なremixの知識 , ルーティング、ローダー、アクションを含む。remixはreactに基づいているため、reactの概念に慣れていると役立ちます。 back4appアカウント を持っていること。バックエンドサービスを構成および管理するために必要です。まだ登録していない場合は、 back4app https //www back4app com/ にサインアップしてください。 これらのツールを手に入れたら、remixアプリケーションを作成し、堅牢なバックエンドと統合する準備が整いました。 プロジェクトのセットアップ まず、ローカル開発環境をセットアップし、remixプロジェクトを初期化します。これにより、アプリケーションのためのクリーンで効率的な基盤が確保されます。 次に、以下のコマンドを使用してremixプロジェクトをインストールします。 todo app を希望のプロジェクト名に置き換えてください npx create remix\@latest todo app 新しいプロジェクトディレクトリに移動します cd todo app すべてが正常に動作していることを確認するために、開発サーバーを実行します npm run dev ターミナルに表示されたurlを開いて、remixアプリが正常に実行されていることを確認します。 back4appでのtodoバックエンドの設定 back4appは、parseによって提供される強力な管理されたバックエンドを提供します。あなたは、to doリストアプリケーションの基盤となるタスクのデータモデルを作成します。 バックエンドアプリケーションの作成 あなたの back4appダッシュボード https //www back4app com/ にログインし、 "新しいアプリを作成" アプリケーションに名前を付けます(例えば、 todoremixapp ) そして nodejs/parse をバックエンドタイプとして選択します。 「 データベース 」 > 「 ブラウザ 」セクションで、 "クラスを作成" をクリックし、「 カスタム 」を選択します。クラスに タスク という名前を付け、クラスレベルの権限を設定して、公開の読み取りと書き込みを許可します(これらの設定は後で調整できます)。 次のフィールドを タスク クラスに追加します タイトル (文字列)– タスクの名前。 説明 (文字列)– タスクの詳細。 完了 (ブール値)– タスクが完了しているかどうかを示します。 期限日 (日付)– タスクの締切。 スキーマを確定するには、 "保存" をクリックします。 remixとback4appの統合 remixアプリをback4appに接続するために、parse javascript sdkを使用します。sdkをインストールするには、次のコマンドを実行します npm install parse 次に、remixアプリケーション内でparseを設定します。ファイルを開いて、 app/root tsx の先頭に次の初期化コードを追加します。 'your application id' と 'your javascript key' をback4appダッシュボードからの資格情報に置き換えます( アプリ設定 > セキュリティとキー ) // app/root tsx import parse from "parse"; import react from "react"; const parse app id = 'your application id'; const parse js key = 'your javascript key'; const parse server url = 'https //parseapi back4app com/'; parse initialize(parse app id, parse js key); (parse as any) serverurl = parse server url; 特にサーバー側でローダー関数が実行されるときに、parseが完全に初期化されていることを確認します。 このコードをあなたの layout 関数に追加してください root tsx ファイルに。 // app/root tsx export function layout({ children } { children react reactnode }) { react useeffect(() => { if (typeof window !== 'undefined') { parse initialize(parse app id, parse js key); (parse as any) serverurl = "https //parseapi back4app com/"; } }, \[]); // rest of the layout function } この設定により、あなたのremixルートとアクションがback4appバックエンドとシームレスに相互作用できるようになります。 remixを使ったフロントエンドの構築 バックエンドが設定されたので、remixを使用してto doリストインターフェースを構築します。これには、データの取得と変更を処理するためのルート、ローダー、およびアクションの作成が含まれます。 ルートの構造化 remixでは、すべてのルートは app/routes ディレクトリ内のファイルに対応しています。 app/routes/ index tsx を開いて、ページの構造とデータ操作を定義するために次のコードを追加します // app/routes/ index tsx import { json, redirect } from "@remix run/node"; import { useloaderdata, form } from "@remix run/react"; import as parse from "parse"; export const loader = async () => { if (typeof window === "undefined") { try { const response = await fetch( "https //parseapi back4app com/classes/task", { headers { "x parse application id" "your application id", "x parse javascript key" "your javascript key", }, } ); const data = await response json(); return json({ tasks data results map((task) => ({ id task objectid, task })), }); } catch (error) { console error("error fetching tasks ", error); return json({ tasks \[] }); } } else { try { const task = parse object extend("task"); const query = new parse query(task); const results = await query find(); const tasks = results map((task) => ({ id task id, task tojson() })); return json({ tasks }); } catch (error) { console error("error fetching tasks ", error); return json({ tasks \[] }); } } }; export const action = async ({ request }) => { const formdata = await request formdata(); const actiontype = formdata get("actiontype"); // parse server details const parseserverurl = "https //parseapi back4app com"; const headers = { "x parse application id" "your application id", "x parse javascript key" "your javascript key", "content type" "application/json", }; try { if (actiontype === "add") { const title = formdata get("title"); const description = formdata get("description"); // create task using rest api const response = await fetch(`${parseserverurl}/classes/task`, { method "post", headers, body json stringify({ title, description, completed false, }), }); if (!response ok) { throw new error(`failed to add task ${response status}`); } } else if (actiontype === "toggle") { const id = formdata get("id"); // first get the current task to check its completed status const getresponse = await fetch(`${parseserverurl}/classes/task/${id}`, { headers, }); if (!getresponse ok) { throw new error(`failed to get task ${getresponse status}`); } const task = await getresponse json(); const updateresponse = await fetch( `${parseserverurl}/classes/task/${id}`, { method "put", headers, body json stringify({ completed !task completed, }), } ); if (!updateresponse ok) { throw new error(`failed to update task ${updateresponse status}`); } } else if (actiontype === "delete") { const id = formdata get("id"); const deleteresponse = await fetch( `${parseserverurl}/classes/task/${id}`, { method "delete", headers, } ); if (!deleteresponse ok) { throw new error(`failed to delete task ${deleteresponse status}`); } } return redirect("/"); } catch (error) { console error("error processing action ", error); return json({ error error message }, { status 400 }); } }; export default function todoroute() { const { tasks } = useloaderdata(); return ( \<div classname="container"> \<h1>to do list\</h1> \<form method="post" classname="form"> \<input type="hidden" name="actiontype" value="add" /> \<input type="text" name="title" placeholder="task title" required /> \<input type="text" name="description" placeholder="description" required /> \<button type="submit">add task\</button> \</form> \<div classname="tasks"> {tasks length === 0 ? ( \<p>no tasks available\</p> ) ( tasks map(task => ( \<div key={task id} classname={`task item ${task completed ? "completed" ""}`}> \<h3>{task title}\</h3> \<p>{task description}\</p> \<form method="post"> \<input type="hidden" name="actiontype" value="toggle" /> \<input type="hidden" name="id" value={task id} /> \<button type="submit">{task completed ? "undo" "complete"}\</button> \</form> \<form method="post"> \<input type="hidden" name="actiontype" value="delete" /> \<input type="hidden" name="id" value={task id} /> \<button type="submit">delete\</button> \</form> \</div> )) )} \</div> \</div> ); } このルートは、remixのローダーとアクションを使用してback4appからタスクを取得し、タスクの追加、切り替え、削除などのユーザーインタラクションを処理します。 リミックスアプリのスタイリング アプリケーションの基本的な外観と感触を定義するために、 app/global css にcssファイルを作成します / app/global css / container { max width 600px; margin 40px auto; padding 0 20px; text align center; font family sans serif; } container h1 { margin bottom 20px; } form { display flex; flex direction column; align items center; gap 10px; margin bottom 20px; } form input\[type="text"] { width 80%; max width 400px; padding 8px; font size 1rem; } form button { padding 8px 16px; cursor pointer; font size 1rem; border none; background color #eaeaea; transition background color 0 2s ease; } form button\ hover { background color #ccc; } tasks p { font size 1rem; } task item { display flex; flex direction column; align items center; gap 12px; border 1px solid #ccc; border radius 6px; padding 15px; margin 10px 0; background color #fafafa; text align center; transition background color 0 2s ease; } task item completed h3, task item completed p { text decoration line through; color #888; } task item h3 { margin 0; font size 1 1rem; } task item p { margin 0; font size 1rem; } task item button { padding 6px 12px; border none; background color #eaeaea; cursor pointer; font size 0 9rem; } task item button\ hover { background color #ccc; } @media (min width 600px) { task item { flex direction row; } } 次に、 app/root tsx にcssファイルをインポートします // app/root tsx import " /global css"; あなたのリミックスアプリは、back4appのバックエンドと連携する機能的なto doリストインターフェースを持っています。 back4appでのリミックスアプリのコンテナ化とデプロイ back4appのwebデプロイメントは、アプリケーションのためのコンテナ化された環境を提供します。リミックスアプリをdockerコンテナにパッケージしてデプロイします。 本番用にリミックスを設定する コンテナ化する前に、リミックスアプリを本番用のバンドルにビルドします npm run build dockerfileの作成 プロジェクトのルートに次の内容で dockerfile を作成します \# stage 1 build the remix app from node 18 alpine as builder workdir /app copy package json package lock json / run npm install copy run npm run build \# stage 2 serve the app using a lightweight node server from node 18 alpine workdir /app copy from=builder /app/build /build copy from=builder /app/package json / run npm install production expose 3000 cmd \["npm", "run", "start"] このdockerfileは、あなたのremixプロジェクトをビルドし、最小限のnode jsランタイムを使用して本番環境用に準備します。 dockerコンテナのビルドとテスト ローカルでdockerイメージをビルドします docker build t todo remix frontend デプロイメントをテストするためにコンテナを実行します docker run p 8080 3000 todo remix frontend ブラウザで http //localhost 8080 を訪れて、remixアプリが正しく動作していることを確認してください。 back4app web deploymentによるデプロイ プロジェクトをgithubにプッシュします git init git add git commit m "initial commit for back4app deployment" git branch m main git remote add origin \<your github repository url> git push u origin main 次に、 back4app web deployment https //www back4app com/containers にログインし、次の手順に従ってください "新しいアプリを作成"をクリックし、プロジェクトに名前を付けます。 "githubリポジトリ"を選択し、back4appを認証します。 あなたの todo remix リポジトリを選択します。 "dockerfileデプロイ"を選択し、ビルド設定を確認します。 "デプロイ"をクリックして、ビルドを開始します。 デプロイ後は、back4appダッシュボードを通じてコンテナを監視します。ログを表示したり、ビルドを管理したり、カスタムドメインを設定したりできます。 アプリケーションのテストとデバッグ デプロイ後、アプリケーションが期待通りに機能することを確認してください。フロントエンドとバックエンドの統合を確認する方法は次のとおりです api 接続: ブラウザの開発者コンソール (f12) を開き、タスクを追加、切り替え、または削除する際のネットワークリクエストを確認します。 データの永続性: ui を通じてタスクを追加し、ページをリフレッシュして保存されていることを確認します。 back4app データベースブラウザでの変更を確認します。 クラスの下で。 crud 操作: 完了ステータスの切り替えとタスクの削除をテストします。問題が発生した場合は、コンソールと api ログを確認します。 エッジケースの処理: 空の入力を送信して、バリデーションが効果的であることを確認します。 ベストプラクティスと最適化のヒント セキュリティ、パフォーマンス、スケーラビリティを向上させるために、これらの推奨事項に従ってください: api コールの最適化: バッチリクエストを使用し、クエリで必要なフィールドのみを選択します。 環境変数: 機密キー (アプリケーション id と javascript キー) を env ファイルに保存し、安全に参照します。 アクセス制御: 認証されたユーザーにデータの変更を制限する動的 acl を実装します。 クラウドコード: パフォーマンスとセキュリティを向上させるために、複雑なロジックを back4app クラウドコードにオフロードします。 結論 remix を使用してフルスタックの to do リストアプリケーションを正常に構築し、back4app バックエンドに接続しました。 このチュートリアルでは、remix プロジェクトの初期化、バックエンドとのインタラクションのための管理サービスの統合、およびデプロイメントのためのアプリケーションのコンテナ化を案内しました。 アプリが稼働しているので、ユーザー管理の高度な機能、リアルタイム更新、またはサードパーティ統合を追加することを検討してください。 さらなるガイダンスについては、 back4app ドキュメント https //www back4app com/docs と remix リソースを探ってください。