Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
「+page.server.tsって結局なにを置けばいいんだ……?」
Search
Hitoshiro
October 24, 2025
1
46
「+page.server.tsって結局なにを置けばいいんだ……?」
Svelte Japan Offline Meetup #5
Hitoshiro
October 24, 2025
Tweet
Share
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
463
34k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
350
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Bash Introduction
62gerente
615
210k
Music & Morning Musume
bryan
46
7k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
Typedesign – Prime Four
hannesfritz
42
2.9k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
680
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でスクラップしています。 まだ勉強したてですが、よければ覗いていってください お気軽コメント歓迎です!
ありがとうございました