Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
「+page.server.tsって結局なにを置けばいいんだ……?」
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Hitoshiro
October 24, 2025
81
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
「+page.server.tsって結局なにを置けばいいんだ……?」
Svelte Japan Offline Meetup #5
Hitoshiro
October 24, 2025
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.2k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
400
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
410
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
43k
4 Signs Your Business is Dying
shpigford
187
23k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
520
Unsuck your backbone
ammeep
672
58k
How to build a perfect <img>
jonoalderson
1
6.1k
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でスクラップしています。 まだ勉強したてですが、よければ覗いていってください お気軽コメント歓迎です!
ありがとうございました