はじめに
自作ツールの配布を行なうためのダウンローダサイトを React と Firebase を用いて作りました。元々利用していた GoogleDrive では個人的に不都合な点があり、他の手段を探していましたが、他ダウンローダサイトを見ていくうちに作れそうだと思い作りました。
※趣味領域に自分の個人情報が紐づけられたり、悪意のあるファイルをサイトに仕込まれるのを避けるため、GitHub レポジトリは Private 下にあります。またサイトが特定される様な情報は今投稿においては公開しません。
また以降はアップロードを UL、ダウンロードを DL と書きます。
サイトについて
機能要件
- アカウント登録・ログインができる
- ※悪意のあるファイルが UL されるのを防ぐため、自分しか登録・ログインできない様に
- ログイン時のみ、
.zip
ファイルをアップロードできる
- 登録・ログイン無しでファイルをダウンロードできる
使用したもの
- React, Typescript
- Firebase
- Hosting, Firestore, Storage
まとめ
以降はコードが多いので最初にまとめ。
firestore, storage を使った公開サイトは初めてでしたが、そこそこ使われている様で嬉しかったです。元々自分が楽する様に作ったツールなので良かったです。
コードを見返すと、ロジックとビューがごちゃ混ぜになっていて汚い箇所があるので修正していきたいです。
作成
firebase
プロジェクトはまず firebase init で作りました。.zip
の UL 先に FirebaseStorage、そのファイルの内容・DL 数のデータ情報・論理削除フラグなどのデータ保存先に Firestore を利用しました。
通常であれば、match /files/{user's UUID}/{fileID}
の様にするのが良かったのかもしれませんが、垢登録・UL を自分だけに制限するつもりでしたので、さぼりました。
また、storage へのアクセスで cors エラーが発生するので、ドキュメントを参照して対応しました。
react app
firebase setting
firebase v9 を使用しました。
フォームへの .zip
ファイルや各種データの入力等に react-hook-form
と zod
を、ファイルインプット領域には react-dropzone
を利用しました。
自分だけが登録できるようにするためパスワード認証を利用し、.env
に登録された Email 以外は弾くようにしました。signup 認証は殆ど同じなので割愛します。
required auth
ログイン・非ログインでアクセスできるまたは表示するページを出しわけるためのコンポーネントを作り利用しました。
自分以外は admin ページにアクセスしないので、パフォーマンスのためにも lazy import しました。
さいごに
アナリティクスによると MAU2000 弱の様です。値としては小さいですが、ニッチな領域でのツールの為のサイトなのでこんなものかと思います。