Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
「+page.server.tsって結局なにを置けばいいんだ……?」
Search
Hitoshiro
October 24, 2025
1
40
「+page.server.tsって結局なにを置けばいいんだ……?」
Svelte Japan Offline Meetup #5
Hitoshiro
October 24, 2025
Tweet
Share
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
BBQ
matthewcrist
89
9.9k
How to Think Like a Performance Engineer
csswizardry
27
2.1k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
930
Code Review Best Practice
trishagee
72
19k
YesSQL, Process and Tooling at Scale
rocio
173
15k
Automating Front-end Workflow
addyosmani
1371
200k
It's Worth the Effort
3n
187
28k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.2k
Docker and Python
trallard
46
3.6k
Building a Scalable Design System with Sketch
lauravandoore
463
33k
The Language of Interfaces
destraynor
162
25k
Transcript
「+page.server.tsって結局な にを置けばいいんだ……?」 ひとしろ
自己紹介 ひとしろ • QAエンジニア • 愛知のはじっこ在住 • 人生で初めての技術イベント登壇
SvelteKitをぽちぽちしてて思った
Routing(ルーティング) • +page.svelte : アプリのページ定義だね • +page.ts : クライアント側でAPIとかあらかじめ叩くときに使うんだろうね •
+error.svelte : エラーページ定義 • +layout(以下略) : 特定のパス以下に共通の定義したいときに使うんだね • +server.ts : エンドポイントが作れるんだね
「+page.server.tsって結局なに を置けばいいんだ……?」
ネタバレ: コントローラー
+page.server.ts load 関数をサーバー上でのみ実行できるようにしたい場合 — 例えば、データベー スからデータを取得したり、API キーのようなプライベートな環境変数にアクセスし たりする必要がある場合 — +page.js
を +page.server.js にリネームし、 PageLoad 型を PageServerLoad に変更します。 「モノリスだし大抵のことは +page.server.tsに書くことになりそう~」
この+page.server.tsデカくね?
巨大+page.server.ts問題 export const actions: Actions = { login: async({ request
}) => { // たくさんの処理... } logout: async({ request }) => { // たくさんの処理... } follow: async({ request }) => { // たくさんの処理... } }
巨大+page.server.ts問題 export const actions: Actions = { login: async({ request
}) => { // たくさんの処理... } logout: async({ request }) => { // たくさんの処理... } follow: async({ request }) => { // たくさんの処理... } } ファイルを分けたい (安直な発想)
名前つきActionってページと異なるパスに置けないかな? 答え: 無理 +page.server.tsのActionsは、 Actionsが定義されているパスの +page.svelteを返そうとする
名前つきActionってページと異なるパスに置けないかな? <form method="POST" action="/api/login?/login" > <label> Email <input name="email" type="email">
</label> <label> Password <input name="password" type="password"> </label> <button>Log in</button> </form> 📁api └ 📄+page.server.ts 📁login └ 📄+page.svelte /loginからSubmitして処理したあと、 /api/login/+page.svelteを探す → 404 Not Found
名前つきActionってページと異なるパスに置けないかな? 📁api └ 📄+page.server.ts export const actions: Actions = {
login : async () => { // 処理してから // リダイレクトしちゃおう redirect(303, '/login'); } } こうすれば/loginに戻ってはこれるが、 SvelteKitの良いやり方ではない
Remote functionsで解決しないかな? 答え: 部分的に解決するが、完全には解決しない 巨大+page.server.tsが巨大hogehoge.remote.tsになるだけ……たぶん • hogehoge.remote.ts, fugafuga.remote.ts…とファイルは分けられる • 次は「hogehoge.remote.tsって結局なにを置けばいいんだ ……?」に問題がス
ライド
Remote functionsで解決しないかな? 公式ドキュメントでは DBクエリまで直書きしてるけど、 そのまま真似するのは危険すぎる (さすがにわかる)
落ち着いてアーキテクチャから考えよう 「響きがカッコイイから」って理由だけで 関数型言語でもないのに読んだコレ→ 任意のアーキテクチャに置き換えて楽しんでください
+page.server.ts(と、*.remote.ts)って何層なんだ? 引用: 関数型ドメインモデリング p.52
+page.server.ts(と、*.remote.ts)って何層なんだ? 引用: 関数型ドメインモデリング p.52
+page.server.ts(と、*.remote.ts)って何層なんだ? 引用: 関数型ドメインモデリング p.52
ワークフローの境界に責務がありそう リ ク エ ス ト D T O コ
マ ン ド ス テ ッ プ イ ベ ン ト D T O レ ス ポ ン ス
ワークフローの境界に責務がありそう リ ク エ ス ト D T O コ
マ ン ド ス テ ッ プ イ ベ ン ト D T O レ ス ポ ン ス
つまり何をする 1. 渡された各種パラメータからドメインを生成して 2. ワークフローを呼んで 3. ワークフローの戻り値をシリアライズして 4. 返す → いわゆるコントローラー
スッキリ
なぜここまで迷走したのか • アーキテクチャのことよく知らなかった • REST APIの例が多く、うまく結びついてなかった • コードの単なる見た目やファイル名ではなく、 「ここは何の役割を担っているのか?」という本質を見よう
余談: Remote functions検証を通過した オブジェクトはドメインになりうる?
個人的な答え: ならない • 検証は検証であってドメインを生成し たことにはならない • スキーマをRemote functionsの引数 に渡せば、 ドメイン生成するときの検証はできる
が…… ◦ form関数なら独自の検証関数を そのまま入れられる
Remote Functionsの検証に何を期待しようか? • Remote Functionsの検証にガッツリ期待して、スキーマに必要な検証をぜんぶ書 いておく ◦ Remote Functionsの検証を全面的に信頼 ◦
小規模なアプリケーションなら正直これで全然よさそう • ドメインとしてはあくまで未検証として扱う ◦ 「これは何者なのか?」の見通しは良くなる ◦ ちゃんとDDDするならこれかな?
最後に • 「+page.server.tsって結局なにを置けばいいんだ……?」 ◦ コントローラーに置くべきものを置こう! ▪ コントローラー以外のものを置いちゃうとFatになるよ! ◦ Remote functionsの動向にも注目しよう!
もっと最後に 「TypeScriptで関数型ドメインモデリングつまみ食いメモ」 Zennでスクラップしています。 まだ勉強したてですが、よければ覗いていってください お気軽コメント歓迎です!
ありがとうございました