0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[React/ Supabase/ Firebase]AIを使わずなるべく自力でシンプルな学習記録アプリを作って得た気づきやらメモ

0
Posted at

はじめに

JISOUスクールの課題として、AI使わずほぼ自力でReactを使ってアプリを作成しました。
めちゃくちゃシンプルな学習記録アプリです。

課題を通して改めて自走しながら得られた気づきや学びを残していきます。
※毎度毎度、Viteを使った環境構築方法を忘れるのでメモの意味もこめて。

@ktdatascience さんのこちらの記事を参考にさせていただきました。

▼気づき・学び

  • AIをなるべく使用せず開発することで、現在主流のAIバイブコーディングではできない、いろいろ遠回りしながらいろんなエラーに出会うことができた
  • そのため、公式ドキュメントをしっかり読んだり、エラー内容を理解して解決策を考える経験ができた
  • 趣味で開発するくらいなら、正直AI使って作りたいものをさっと作ってもらうのもありかも知れないけど、仕事としてやっていくなら、「なぜこう動いているか?」みたいな根拠まで理解していた方が、技術選定や提案の幅も広がるんじゃないかと感じた(※個人的な考え)

1. 開発環境構築

VSCodeで空の作業ディレクトリを用意して、以下を実行します。

事前にnode, npmがインストールされている前提です。

よく忘れる魔法のコマンド

npm create vite@latest study-log-react

以下、Vite + React開発のための選択

? Select a framework:
> React

※今回はJavaScriptで開発(いずれTypeScriptで開発したい)

? Select a variant:
> JavaScript

linter は伝統のESLintで(OxLintの方が速いらしいのでそっち使ってもよかったかも)

? Which linter to use?
> ESLint

インストール実行

? Install with npm and start now?
> Yes

これで開発準備はできました。
以前StackBlitzで実装した以下の簡易な学習記録アプリのソースコードをVSCode側にコピペしてから本番です。

2. データ永続化のためにSupabaseを導入

簡単にDB用意できるSupabaseを使用します。

  • サインインしてStart your projectをクリック

スクリーンショット 2026-07-02 12.51.22.png

  • New ProjectからSupabase プロジェクトを作成

スクリーンショット 2026-07-02 12.52.42.png

  • プロジェクトができたら、左側メニューの「Table Editer」→「Create a table」をクリック
  • Name はstudy-recordColumns は以下のような感じで用意する

スクリーンショット 2026-07-05 14.23.18.png

  • とりあえず適当にぽちぽちして何個かデータを作成

スクリーンショット 2026-07-05 14.26.02.png

  • Supabaseで登録したデータを取得して画面に表示するために、Supabaseクライアントまわりを設定していく

  • 公式ライブラリをインストール
npm install @supabase/supabase-js
  • supabaseライブラリを使って、もろもろ実装
src/lib/clients/supabase.js
import { createClient } from "@supabase/supabase-js"

// 初期設定
export const supabase = createClient(
  import.meta.env.VITE_SUPABASE_URL,
  import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY,
)

// 登録されてるデータを全て取得して返す
// ※エラーの場合はいったんログだけ出して空データを返しておく
export const getAllTodos = async () => {
  const { data, error } = await supabase.from("study-record").select("*")
  if (error) {
    console.log("getAllTodos error: ", error)
    return []
  }
  return data
}

// 受け取った1件のデータを永続化する
export const insertTodo = async (title, time) => {
  const { data, error } = await supabase
    .from("study-record")
    .insert({ title: title, time: time })
    .select()
  if (error) {
    console.log(error)
  }
  return data
}

// 受け取った1件のデータを削除する
export const deleteTodo = async (id) => {
  const { data, error } = await supabase
    .from("study-record")
    .delete()
    .eq("id", id)
    .select()
  return data
}
  • .env.localを用意して、Supabaseのキーを環境変数を設定

記事の投稿日によっては、画面が古かったり設定値まで変わってたりでここも苦労しました。
一番は公式Docを見るのが早かったのですが、現時点(2026.8.11)設定方法を残しておきます。

VITE_SUPABASE_URL

Project Settings -> General -> Project IDの内容を、https://xxxx.supabase.coxxxxに置き換えて設定する。

image.png

VITE_SUPABASE_PUBLISHABLE_KEY

Project Settings -> API Keys -> Publishable keyの欄を入力

image.png

これでSupabaseの取得処理や永続化処理が使えるようになる。

3. Firebaseへのデプロイ

デプロイ方法をいろんな記事探してたけど、やり方が古かったり、うまくいかないことが多かったです。

現時点(2026.8.11)では、firebase init hosting:githubを使用してfirebaseコマンドでGithub認証するのが一番楽なやり方だと思います。

※参考記事

4. 自動テスト(CI)作成

意外にここでめちゃくちゃ苦労しました。
react-testing-libraryを使って画面をレンダリングしてテキスト入力だったりボタンクリック動作を検証できるんだけど、非同期処理で要素が現れなかったり、複数ある同じボタン(各記録の削除ボタンとか)をどうやって特定するか?とか、かなり苦戦しました。

※CI作成の苦戦の記録:

※参考記事:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?