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
79
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 Think Like a Performance Engineer
csswizardry
28
2.8k
How to make the Groovebox
asonas
2
2.4k
Site-Speed That Sticks
csswizardry
13
1.5k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Marketing to machines
jonoalderson
1
5.8k
Color Theory Basics | Prateek | Gurzu
gurzu
1
470
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
610
From π to Pie charts
rasagy
1
380
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
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でスクラップしています。 まだ勉強したてですが、よければ覗いていってください お気軽コメント歓迎です!
ありがとうございました