2025-06-08
dubというURLを短縮し、トラッキングできるサービスがオープンソースで開発されており、Next.jsのApp routerを使って実装されているので、実装例を知りたいと思い、ソースコードを読んでみました。 https://github.com/dubinc/dub
https://dub.co/docs/local-development
時系列のクリックイベントのデータを保存するために使用している https://www.tinybird.co/
tinybirdのバージョンが最近上がってドキュメントの通りにやってもclassicだから動かない tinybirdのclassicのdocker https://www.tinybird.co/docs/changelog/2025-03-14-march-week-two?utm_source=chatgpt.com
実装方法が豊富なため、Providerパターンを使って共通の関数を使えるようにしているのだと思う。 useActionを使ってログインしている。
@upstash/ratelimit
を使って、ログインのリクエストを制限している。
seconds
の型がユニオン型の指定方法良いね
rest apiは用意してなくて、actionsでPrismaを使っている
サーバーでページを表示しても良いかのバリデーションを書けて、クライアントのページにはpage-client.tsx
という名前を付けている
swr
のmutate
を使ってリフェッチしている。
キャッシュのキーもrouteのパスもべた書きしているのが気になる。
middleware
で認証していないユーザーがログインページにアクセスした場合に弾いている
next-safe-action
とは?エラーハンドリングや認可処理の共通化を型安全に行えるようになるライブラリ
ローディングとスケルトンどちらも用意している。 スケルトンは普通にスタイリングして作っていた。
next-axiom
とは?サーバーレス時代のログ関数、パフォーマンス機能、web vitals、そしてプロダクトインサイト
一時データを保存するために使用されている。 キャッシュとしては特に使われてなさそう。
イベントトラッキングと分析のために使用されている。
describe.sequential
を使ってテストが直列で実行されるようにしている。
直列で実行されるようにすることで、postで作成したデータをgetで使用するようにしている。
IntegrationHarness
で初期データを用意してそう。
HttpClient
を使ってAPIのテストをしている。
返り値もテストしているけど、面白いのがランダムな値はexpect.any(String)
のようにしている。
next-axiom
というライブラリを使ってログを計測していそう。
middleware
でログを登録している。
ok: boolean
が返ってきている
エラーと、ok
がfalseの場合の違いって何なんだ?
ok
がfalseの場合は基本的なエラーハンドリングをして、
catch
のエラーになるのはネットワークレベルのエラーや予期せぬ例外をキャッチするために使っている
fetch
使うとokが返ってくるんだ
errors.ts
で実装している。
一つエラークラスを定義して、そこにcode
を指定することでエラーを分類している。
タスクスケジューラとレート制限ができるライブラリ。 過負荷を防ぐために使用されている。
pnpm
のworkspaceを使っている。
tsup
を使って、各パッケージをビルドしている。
nodemailer
を使っている。textは普通に引数で渡している。
CI/CDでテストは実行しているが、APIのインテグレーションテストのみでフロントはテスト書かれていなそう。
バックエンドはなく、サーバーレスで全部next.jsで実装されているのが面白い構成だなと感じた。 サーバーアクションの実装例を見ることができて参考になった。 ローディングが全てちゃんと実装されていたり、アニメーションがあったりとフロントエンドはとても作りこまれていると思った。 pnpmのworkspaceを使って、パッケージを分割しているのも良いなと思ったが、どうやって分けるかが結構経験がものをいうなと感じた。 ログや、クリックイベントをしっかりトラッキングしていた。 コンポーネントは基本的にProviderパターンを使って、共通の関数を使えるようにしているのが特徴的だなと思った。 今回初めてオープンソースのプロダクトを読んでみたのですが、知らないライブラリを知れたり、自分の実装の手数が増える感じがしてとても楽しかったです。