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
Hitoshiro
October 24, 2025
84
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
Code Review Best Practice
trishagee
74
20k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
320
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
760
Intergalactic Javascript Robots from Outer Space
tanoku
273
28k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1.1k
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
How to make the Groovebox
asonas
2
2.5k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
510
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
320
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
560
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でスクラップしています。 まだ勉強したてですが、よければ覗いていってください お気軽コメント歓迎です!
ありがとうございました