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
Viteはサーバーとクライアントを判定していない
Search
赤神青空
PRO
August 31, 2026
Video
Programming
46
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 赤神青空
【AWS資格のニュース】SAP が SAP-C03 に変わります
akagami
PRO
0
2
【力学 #5】単振り子と小角近似
akagami
PRO
0
5
【AIニュース】Genie 4 とは何か
akagami
PRO
0
15
【基本情報対策】IPアドレスとサブネットマスク
akagami
PRO
0
15
GPT-6 Cyber とは何か
akagami
PRO
0
15
【AWSの新サービス】Amazon ECS Gateway とは何か
akagami
PRO
0
20
【力学 #4】単振動:ばねの運動方程式を解く
akagami
PRO
0
9
【力学 #4】単振動:ばねの運動方程式を解く
akagami
PRO
0
10
Cloudflare の AI で他人の会話が混ざった?
akagami
PRO
0
27
Other Decks in Programming
See All in Programming
Enforcing Your Architecture with Unit Tests in the AI Era (Swift Connection X)
steliosf
PRO
1
170
Crash Auto Pipelines
veronikapj
1
410
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
330
graphql-ruby を Spinel で速くしようとした話
mtsmfm
0
140
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
4
1.5k
クラウドゲーミングのパフォーマンス最適化に挑む / Cloud Gaming Performance Tuning
vivion
0
330
ActionController meets Protocol Buffers
sorah
1
800
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
220
Spec-driven Development with AI
simas
PRO
0
2.3k
baseline으로 마이그레이션, 리팩토링 안전하게 맡기기
fornewid
1
970
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
420
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
420
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.9k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.3k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
600
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Cult of Friendly URLs
andyhume
79
7.1k
So, you think you're a good person
axbom
PRO
2
2.3k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
43k
Fireside Chat
paigeccino
43
4.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.7k
Tell your own story through comics
letsgokoyo
1
1.1k
Marketing to machines
jonoalderson
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