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
赤神青空
PRO
August 31, 2026
Video
Programming
32
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Viteはサーバーとクライアントを判定していない
赤神青空
PRO
August 31, 2026
Video
More Decks by 赤神青空
See All by 赤神青空
【Vitest5.0大解剖】Vitest5.0で消えた記法とAPI
akagami
PRO
0
12
【Vitest5.0大解剖】Vitest5.0で増えた書き方
akagami
PRO
0
18
【Vitest5.0大解剖】Vitest5.0で静かに変わる挙動
akagami
PRO
0
17
【Vitest5.0大解剖】Vitest5.0のTrace View
akagami
PRO
0
20
【Vitest5.0大解剖】Vitest5.0は何が速くなったのか
akagami
PRO
0
23
1MBの壁にぶつかった話
akagami
PRO
0
25
Zod4.5を10分で
akagami
PRO
0
27
S3ライフサイクル入門
akagami
PRO
0
24
【AWS RDS解説】待機系は読めるのか
akagami
PRO
0
26
Other Decks in Programming
See All in Programming
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
130
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.9k
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
140
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
2
1.5k
AI駆動開発にグラフDBを重ねてみた
satoshi256kbyte
2
710
初めての模倣学習とVLA
natsutan
0
450
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
660
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
650
What We Talk About When We Talk About XP
m_seki
2
310
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
200
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
810
이 함수, 실패하면 어떻게 되나요? null부터 Rich Errors까지, Kotlin 에러 처리 15년
haeti2
0
120
Featured
See All Featured
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
570
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
260
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
390
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
The Cost Of JavaScript in 2023
addyosmani
55
10k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Faster Mobile Websites
deanohume
310
32k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
490
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
310
Google's AI Overviews - The New Search
badams
0
1.6k
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