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
Viteはサーバーとクライアントを判定していない
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
赤神青空
August 31, 2026
Programming
24
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Viteはサーバーとクライアントを判定していない
赤神青空
August 31, 2026
More Decks by 赤神青空
See All by 赤神青空
Vitest5.0は何が速くなったのか
akagami
0
10
1MBの壁にぶつかった話
akagami
0
20
Zod4.5を10分で
akagami
0
18
S3ライフサイクル入門
akagami
0
17
【AWS RDS解説】待機系は読めるのか
akagami
0
24
OpenAI と Cursor、決裂までの3年
akagami
0
43
「まずはAI」の前に、分けて考える
akagami
0
28
【AWS Dogwood入門】使い分けと、採用するときの注意
akagami
0
17
【AWS Dogwood入門】認可はどこに置かれているか
akagami
0
31
Other Decks in Programming
See All in Programming
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
2
1.4k
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
400
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
2
910
T3DD26: From RAGs to Riches
martinhelmich
0
130
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
600
Go 1.27 における memory allocation の高速化
andpad
0
360
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
150
プロポーザルを書いてもらう
pvcresin
0
590
「つくるAI」だけではバグは見つからない ~テストに必要な「見つけるAI」を分離させる戦略~
mfunaki
0
220
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
120
高専キャリア LT 発表内容
crysta1221
6
5.4k
My Marp Sample
sinoue0108
0
140
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
6.3k
The Limits of Empathy - UXLibs8
cassininazir
1
620
Raft: Consensus for Rubyists
vanstee
141
7.7k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
440
My Coaching Mixtape
mlcsv
0
300
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.6k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
640
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
320
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
290
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
680
Accessibility Awareness
sabderemane
1
190
Transcript
2026年8月 Viteはサーバーとクライアントを 判定していない ビルドがやっているのは、入口からimportを辿ることだけ 赤神 青空
▪作っていたものと、ビルドで出てくるもの まず前提をそろえる TanStack Start で作ったアプリを Cloudflare Workers に載せる、という学習をしていました。 ビルドすると、成果物が2つ出てくる dist/client/
— ブラウザに送られる dist/server/ — Cloudflareで動く DBに触るコードも、画面のコードも、同じ src/ の中にある この2つが、どこで分かれているのかを知りたかった 今ココ 誤解 2/14
▪サーバー専用のはずのものを、クライアントから触る わざと壊してみた 何が境界を守っているのかを知りたくて、コンポーネントから直接DBを呼びました。 typescript // src/routes/index.tsx — ブラウザで動くコンポーネント useEffect(() =>
{ db.select().from(items).all().then(setData) }, []) 今ココ 誤解 3/14
▪3つのうち、どれか どこで止まると思いますか 型で怒られるのか。ビルドで止まるのか。 それとも、ブラウザで落ちるのか。 1. 型 エディタに赤線が出る。 2. ビルド ビルドが通らない。
3. 実行時 ブラウザで落ちる。 私は1番だと思っていました。 今ココ 誤解 4/14
01 仕組み 実際に出たログ 今ココ 仕組み 5/14
▪最終行を見てください 出たのはこれ bash [plugin:vite:import-analysis] Failed to resolve import "cloudflare:workers" from
"src/db/index.ts" 23:04:39 [vite] (client) Pre-transform error どちらのグラフで壊れたか、ログに書いてある 今ココ 仕組み 6/14
▪拍子抜けするほど素朴です 答え Viteは、判定していない。 入口からimportを辿っているだけ。 止めたもの モジュール解決。client側に cloudflare:workers は 無い。 止めなかったもの
型。TypeScriptは「サーバー専用」を知らない。 入口の数だけグラフができる。この構成では client と ssr の2つ。 今ココ 仕組み 7/14
▪同じソースに、違う入口から入る ビルドは2回走る 走るバンドラは同じです。Vite 6以降は環境を増やせますが、既定はこの2つになります。 bash building client environment → dist/client/
→ ブラウザへ building ssr environment → dist/server/ → Cloudflareへ 今ココ 仕組み 8/14
▪どちらに属するかは、繋がっているかどうかで決まる 辿った結果、グラフが2本できる クライアントのグラフ index.tsx → db/index.ts → cloudflare:workers 解決できずに停止 サーバーのグラフ
server-entry → db/index.ts → cloudflare:workers Workers上にあるので解決できる 同じ db/index.ts でも、どちらのグラフに入るかで結末が変わります。 今ココ 仕組み 9/14
02 規約 繋がりを見えるようにする仕掛け 今ココ 規約 10/14
▪ファイルを分けずに、関数の単位で切る createServerFn は分割線のマーカー 関数を包むと、そのハンドラの中身は ssr のグラフに置かれます。 typescript const listItems =
createServerFn().handler(async () => { return db.select().from(items).all() }) 今ココ 規約 11/14
▪切り方が違うだけ 規約はどれも同じ問題を解いている TanStack createServerFn Start SvelteKit +page.server.ts React .server モジュール
Router v7 今ココ 規約 関数の単位で分割線を引く 置き場所でサーバー専用を宣言する ファイル名でサーバー専用を宣言する 12/14
▪私はこの2つを混同していました 守るのはビルド、繋ぐのは型 「境界を型で切る」と思っていたのですが、型は境界を切っていませんでした。 境界を守っているもの = ビルドの分離 client と ssr で別々に辿られる
型は関与しない。だから赤線は出なかった 境界を越えて繋がっているもの = 型 listItems() の戻り値は Item[] のまま届く レスポンスの型を手書きしなくていい 今ココ 規約 13/14
▪今日話したこと まとめ 01 仕組み 判定ではなく、入口からimportを辿った結果が境界になっている。 02 確かめ方 どちらのグラフで壊れたかは、ログや成果物にそのまま出る。 03 規約
createServerFn も .server も、その繋がりを見せるための発明。 この原則が分かれば "use client" も「入口を増やす指示」と読める 今ココ まとめ 14/14