Quickstarters
Solid.js フロントエンドを構築し、バックエンドに接続する方法
31 分
このガイドでは、solid jsを使用してto doリストアプリケーションを構築し、back4appによって強力なバックエンドに接続します。 このチュートリアルは、基本的なcrud(作成、読み取り、更新、削除)操作をカバーし、明確で機能的なユーザーインターフェースの設計をガイドするため、理想的な出発点として設計されています。 最後には、solid jsを活用して応答性のあるフロントエンドを持ちながら、管理されたバックエンドサービスを統合する方法を示す完全に機能するアプリが完成します。 フルスタックアプリケーションの開発は、バックエンドの設定、データベースの管理、認証の処理、インフラの展開の複雑さから、困難になることがあります。 このプロセスを簡素化するために、back4appを使用します。これは、スケーラブルな バックエンド・アズ・ア・サービス(baas)ソリューション を提供し、ホスティング、データベース、apiの管理を行いながら、フロントエンドの作成に集中できるようにします。 back4appは、すぐに使用できるデータベース、認証、サーバーサイドロジックのためのcloud code、スムーズな統合のためのsdkを含む包括的なバックエンドサービスを提供します。また、コンテナ化されたデプロイメントをサポートしており、フルスタックアプリケーションのホスティングに柔軟な選択肢となります。 これらのツールを使用することで、サーバーのメンテナンスを心配することなく、アプリケーションを迅速に開発および展開できます。 重要なポイント このチュートリアルに従うことで、以下のことを学びます viteを使用して、最新のsolid jsプロジェクトを初期化します。 アプリケーションのデータを処理するバックエンドサービスをシームレスに統合します。 動的でインタラクティブなユーザーインターフェースのための基本的なcrud操作を実装します。 コンテナ化されたワークフローを使用して、完全に機能する to do list アプリケーションをback4appにデプロイします。 前提条件 始める前に、これらのツールとスキルを持っていることを確認してください node jsとnpm nodejs org https //nodejs org/ からnode js(lts推奨)をインストールし、ターミナルで node v と npm v を実行して確認します。 基本的なsolid jsの知識 コンポーネント、リアクティブシグナル( createsignal を使用)、およびjsx構文に慣れている必要があります。solid jsが初めての場合は、まずその基本を確認してください。 back4appアカウント back4app https //www back4app com/ にサインアップして、バックエンドサービスを設定および管理します。 これらの前提条件が整ったら、プロジェクトを設定して構築を開始する準備が整いました。 プロジェクトのセットアップ まず、ローカル開発環境を設定し、迅速な開発体験のためにviteを使用してsolid jsプロジェクトを初期化します。 次のことを確認してください node js (ltsバージョン) がマシンにインストールされています。必要に応じて、次のリンクからダウンロードしてインストールしてください nodejs org https //nodejs org/ インストールを確認します node v npm v 次のコマンドをターミナルで実行して、solid jsプロジェクトを初期化します。( todo app を希望のプロジェクト名に置き換えてください) npm create vite\@latest todo app template solid プロジェクトディレクトリに移動します cd todo app 必要な依存関係をすべてインストールします npm install 開発サーバーを起動して、セットアップを確認します npm run dev あなたのsolid jsアプリケーションは現在ローカルで実行されているはずです。ブラウザで表示されたurlを開いて確認してください。次に、データストレージとapiインタラクションを管理するためにback4appでバックエンドを設定します。 todoバックエンドの作成 back4appは、完全に管理されたバックエンドサービスを提供しており、 parse , nosqlデータベース、認証、cloud code、および自動生成されたapiをすぐに利用できる形で提供します。 このセクションでは、あなたのタスクを保存するための task データモデルを作成し、それをあなたのsolid jsフロントエンドにリンクする方法を案内します。 バックエンドアプリケーションの設定 ログイン あなたの back4appダッシュボード https //www back4app com/ を開き、「 新しいアプリを作成する。 アプリケーションに名前を付ける (例: todosolidapp )そして、バックエンドタイプとして nodejs/parse を選択します。 アプリが作成されたら、「 データベース > 「 ブラウザ 」に移動します。 「 クラスを作成 をクリックし、「 カスタム 」を選択します。 クラスに名前を付けます task とし、 クラスレベルの権限 を設定して、公開の読み取りと書き込みを許可します(これらの設定は後で厳しくすることができます)。 「 task 」クラスに、次のフィールドを追加します: タイトル (文字列)– タスクのタイトル。 説明 (文字列)– タスクの詳細。 完了 (ブール値)– タスクが完了しているかどうかを示すステータス。 期限日 (日付)– タスクの締切。 「 保存 」をクリックして、スキーマを確定します。 solid jsとback4appの統合 あなたのsolid jsプロジェクトにback4appを統合するには、 parse javascript sdk を使用してバックエンドと通信します。sdkをnpm経由でインストールします npm install parse sdkを設定するには、次のように初期化します。 アプリケーションid と javascriptキー を使用します。これらは、back4appダッシュボードの アプリ設定 > セキュリティとキー から取得できます。 あなたの src/index jsx (または同等のエントリファイル) で、次のようにparseをインポートして設定します import { render } from "solid js/web"; import ' /index css' import app from " /app"; import parse from "parse/dist/parse min js"; 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 serverurl = parse server url; render(() => \<app />, document getelementbyid("root")); バックエンドが設定されたので、solid jsでto doリストuiを構築し、crud操作を実装する準備が整いました。 solid jsを使ったフロントエンドの開発 バックエンドが接続されたので、solid jsを使用してto doリストアプリケーションのユーザーインターフェースを構築します。タスクを追加、表示、更新、削除するためのコンポーネントを作成し、リアクティブシグナルで状態を管理します。 コンポーネントの整理 あなたのアプリケーションは、これらの主要なコンポーネントで構成されます taskform jsx – 新しいタスクの追加を管理します。 tasklist jsx – すべてのタスクを表示し、完了または削除するためのコントロールを提供します。 taskitem jsx – 完了または削除するためのアクションを持つ個々のタスクを表します。 components フォルダーを src 内に作成し、これらのファイルを追加します mkdir src/components touch src/components/taskform jsx src/components/tasklist jsx src/components/taskitem jsx solid jsを使用した状態管理 solid jsの createsignal と createeffect を利用して、状態管理と副作用を行います。まず、 app jsx で状態を設定します import { createsignal, onmount } from "solid js"; import taskform from " /components/taskform"; import tasklist from " /components/tasklist"; import parse from "parse/dist/parse min js"; function app() { const \[tasks, settasks] = createsignal(\[]); const fetchtasks = async () => { try { const task = parse object extend("task"); const query = new parse query(task); const results = await query find(); settasks(results map(task => ({ id task id, task tojson() }))); } catch (error) { console error("error fetching tasks ", error); } }; onmount(fetchtasks); return ( \<div class="container"> \<h1>to do list\</h1> \<taskform fetchtasks={fetchtasks} /> \<tasklist tasks={tasks()} fetchtasks={fetchtasks} /> \</div> ); } export default app; タスクフォームコンポーネントの構築 「 taskform jsx 」で、タスクを追加するための制御されたフォームを作成します。 createsignal を使用して入力値を管理し、データをback4appに送信します import { createsignal } from "solid js"; import parse from "parse/dist/parse min js"; function taskform(props) { const \[title, settitle] = createsignal(""); const \[description, setdescription] = createsignal(""); const handlesubmit = async (e) => { e preventdefault(); try { const task = parse object extend("task"); const task = new task(); task set("title", title()); task set("description", description()); task set("completed", false); await task save(); props fetchtasks(); settitle(""); setdescription(""); } catch (error) { console error("error adding task ", error); } }; return ( \<form onsubmit={handlesubmit}> \<input type="text" placeholder="task title" value={title()} oninput={(e) => settitle(e target value)} required /> \<input type="text" placeholder="description" value={description()} oninput={(e) => setdescription(e target value)} required /> \<button type="submit">add task\</button> \</form> ); } export default taskform; タスクリストの表示 「 tasklist jsx 」で、各エントリに対して taskitem コンポーネントを使用してタスクのリストをレンダリングします import taskitem from " /taskitem"; function tasklist(props) { return ( \<div> {props tasks length === 0 ? ( \<p>no tasks available\</p> ) ( props tasks map(task => ( \<taskitem key={task id} task={task} fetchtasks={props fetchtasks} /> )) )} \</div> ); } export default tasklist; タスクアイテムコンポーネントの作成 「 taskitem jsx 」で、タスクを完了としてマークするか削除するアクションを設定します import parse from "parse/dist/parse min js"; function taskitem(props) { const handlecomplete = async () => { try { const query = new parse query("task"); const tasktoupdate = await query get(props task id); tasktoupdate set("completed", !props task completed); await tasktoupdate save(); props fetchtasks(); } catch (error) { console error("error updating task ", error); } }; const handledelete = async () => { try { const query = new parse query("task"); const tasktodelete = await query get(props task id); await tasktodelete destroy(); props fetchtasks(); } catch (error) { console error("error deleting task ", error); } }; return ( \<div class={`task item ${props task completed ? "completed" ""}`}> \<h3>{props task title}\</h3> \<p>{props task description}\</p> \<button onclick={handlecomplete}> {props task completed ? "undo" "complete"} \</button> \<button onclick={handledelete}>delete\</button> \</div> ); } export default taskitem; アプリケーションのスタイリング 「 index css 」ファイルに次のスタイルを追加します。「 src 」フォルダー / center the content and add spacing / 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; box sizing border box; 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; } container p { font size 1rem; } task item { display flex; flex direction column; align items center; justify content 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; } } cssファイルを「 src/index jsx 」にインポートします import " /index css"; uiの最終調整 あなたのsolid js to doリストアプリケーションは、back4appとカスタムスタイリングを統合した動的なフロントエンドを備えています。このアプリでは、タスクを追加、表示、更新、削除しながら、効率的なフロントエンドとバックエンドの通信を維持できます。 次に、back4appのwebデプロイメントプラットフォームを使用して、solid jsアプリをデプロイします。 back4app webデプロイメントでのフロントエンドのデプロイ back4app webデプロイメントは、アプリケーションをデプロイするための完全に管理されたコンテナ化環境を提供します。dockerベースのデプロイメントを使用することで、solid jsフロントエンドをパッケージ化し、簡単にデプロイできます。 本番用のviteの設定 viteで構築されたsolid jsアプリケーションは、デフォルトで開発モードで実行されます。本番用には、静的バージョンをビルドし、nginxのような軽量のwebサーバーで提供します。 適切なベースパスを設定するために、あなたの vite config js を更新してください import { defineconfig } from 'vite'; import solidplugin from 'vite plugin solid'; export default defineconfig({ plugins \[solidplugin()], base ' /', // ensures correct asset paths in containerized environments }); 本番用のファイルを生成します npm run build アプリ用のdockerfileを作成する プロジェクトのルートに dockerfile を作成して、アプリがどのようにコンテナ化されるかを定義します \# use an official lightweight node js image to build the app from node 18 alpine as build workdir /app copy package json package lock json / run npm install copy run npm run build \# use nginx to serve the static files from nginx\ alpine \# copy custom nginx config for spa routing copy nginx conf /etc/nginx/conf d/default conf \# copy built app from build stage copy from=build /app/dist /usr/share/nginx/html expose 80 cmd \["nginx", " g", "daemon off;"] dockerfileを作成した後、nginxを構成して、ルートindex htmlファイルにリクエストを正しくルーティングします。これを行うには、プロジェクトのルートディレクトリに nginx conf ファイルを作成し、以下のコードブロックを貼り付けます。 server { listen 80; server name localhost; root /usr/share/nginx/html; index index html; \# gzip settings for better performance gzip on; gzip vary on; gzip min length 10240; gzip proxied expired no cache no store private auth; gzip types text/plain text/css text/xml text/javascript application/x javascript application/xml application/javascript; gzip disable "msie \[1 6]\\ "; \# handle static file requests location \\ (?\ jpg|jpeg|gif|png|ico|svg|woff2|woff|eot|ttf|css|js)$ { expires 30d; add header cache control "public, max age=2592000"; try files $uri =404; } \# redirect all requests to index html for spa routing location / { try files $uri $uri/ /index html; } \# error pages error page 404 /index html; error page 500 502 503 504 /50x html; location = /50x html { root /usr/share/nginx/html; } } コンテナのローカルテスト デプロイ前に、dockerコンテナをビルドしてテストします docker build t todo solid frontend コンテナを実行します docker run p 8080 80 todo solid frontend ブラウザで http //localhost 8080 にアクセスして、アプリが正しく提供されていることを確認してください。 githubにプッシュし、back4app経由でデプロイする プロジェクトを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を使用してデプロイします にログインします back4app web deployment https //www back4app com/containers "新しいアプリを作成"をクリックし、名前を入力し、 githubリポジトリ を選択します back4appにリポジトリへのアクセスを許可し、 todo solid リポジトリを選択します "dockerfileデプロイメント"を選択し、ビルド設定を確認します "デプロイ"をクリックしてビルドプロセスを開始します デプロイメントの監視と管理 デプロイ後、back4appダッシュボードを使用して デバッグ用のログを表示します コンテナのパフォーマンスとリソース使用状況を監視します 新しいコミットで再デプロイをトリガーします 必要に応じてカスタムドメインを設定します アプリケーションのテストとデバッグ デプロイ後、solid jsアプリを徹底的にテストしてください api接続の確認 ブラウザの開発者コンソール(f12 → ネットワーク)を開いて、タスク操作中のapiコールを確認します。 タスクの追加と取得 uiを使用してタスクを追加し、リフレッシュしてback4appのデータベースブラウザでデータの永続性を確認します。 crud操作 タスクを完了としてマークし、削除をテストして、更新がバックエンドに反映されることを確認します。 エッジケースの処理 フォーム入力を検証し、ブラウザの開発者ツールを使用して遅いネットワーク条件をシミュレートします。 問題が発生した場合は、back4appのログを確認するか、api設定を見直してください。 back4appサービスを使用するためのベストプラクティス アプリケーションのパフォーマンスとセキュリティを向上させるために apiコールの最適化 複数の操作に対してバッチリクエストを使用し、クエリで必要なフィールドのみを選択します。 環境変数のセキュリティ 機密情報を環境変数に保存します。viteを使用して、 env ファイルを作成します vite parse app id=your app id vite parse js key=your js key オートスケーリングの実装: 高トラフィックシナリオのためにback4app web deploymentでオートスケーリングを有効にします。 セキュリティの強化: データの変更を制限するためにクラスレベルの権限(clp)を使用し、必要に応じてaclを設定します。 クラウドコードの活用: パフォーマンスを向上させ、apiの露出を減らすために複雑なロジックをクラウドコードにオフロードします。 結論 あなたは今、フロントエンドにsolid jsを使用し、back4appの堅牢なバックエンドサービスを利用したフルスタックのto doリストアプリケーションを構築しました。 このチュートリアルでは、solid jsプロジェクトの初期化からparse sdkの統合、back4appでのコンテナ化されたワークフローを介したアプリのデプロイまでの旅をカバーしました。 進むにつれて、高度なユーザー認証、リアルタイム更新、サードパーティ統合などの機能を追加して、アプリケーションをさらに強化することを検討してください。 詳細やサポートについては、 back4appのドキュメント https //www back4app com/docs を探ってください。