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
supabaseとSvelteKitで作るバックエンドレスなサーバーレスWebサイト / Cr...
Search
shiro seike
PRO
November 18, 2023
Programming
3
4.2k
supabaseとSvelteKitで作るバックエンドレスなサーバーレスWebサイト / Creating with supabase and SvelteKit Backend-less serverless websites
フロントエンドカンファレンス沖縄2023
https://frontend-conf.okinawa.jp
shiro seike
PRO
November 18, 2023
Tweet
Share
More Decks by shiro seike
See All by shiro seike
OpenTelemetryを活用したObservability入門 / Introduction to Observability with OpenTelemetry
seike460
PRO
1
460
Amazon Q Developer Proで効率化するAPI開発入門
seike460
PRO
0
180
(再)ひとり技術広報からの脱却 / Re:Breaking away from one-man technical public relations
seike460
PRO
1
190
PHPで作るWebSocketサーバー ~リアクティブなアプリケーションを知るために~ / WebSocket Server in PHP - To know reactive applications
seike460
PRO
2
1k
CQRS+ES の力を使って効果を感じる / Feel the effects of using the power of CQRS+ES
seike460
PRO
0
280
AWS reInvent 2024サービスアップデートデモ / AWS reInvent 2024 Service Update Demo
seike460
PRO
0
56
AWS Lambdaから始まった Serverlessの「熱」とキャリアパス / It started with AWS Lambda Serverless “fever” and career path
seike460
PRO
1
660
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
1.3k
実践サーバーレスパフォーマンスチューニング ~その実力に迫る~ / Practical Serverless Performance Tuning ~A Close Look at its Power~
seike460
PRO
2
420
Other Decks in Programming
See All in Programming
大LLM時代にこの先生きのこるには-ITエンジニア編
fumiyakume
7
3k
タイムゾーンの奥地は思ったよりも闇深いかもしれない
suguruooki
1
640
The Efficiency Paradox and How to Save Yourself and the World
hollycummins
0
110
Rollupのビルド時間高速化によるプレビュー表示速度改善とバンドラとASTを駆使したプロダクト開発の難しさ
plaidtech
PRO
1
170
「”誤った使い方をすることが困難”な設計」で良いコードの基礎を固めよう / phpcon-odawara-2025
taniguhey
0
140
サービスクラスのありがたみを発見したときの思い出 #phpcon_odawara
77web
4
640
Preact、HooksとSignalsの両立 / Preact: Harmonizing Hooks and Signals
ssssota
1
1.5k
SEAL - Dive into the sea of search engines - Symfony Live Berlin 2025
alexanderschranz
1
130
自分のために作ったアプリが、グローバルに使われるまで / Indie App Development Lunch LT
pixyzehn
1
160
Java 24まとめ / Java 24 summary
kishida
3
500
生成AIを使ったQAアプリケーションの作成 - ハンズオン補足資料
oracle4engineer
PRO
3
220
AHC045_解説
shun_pi
0
530
Featured
See All Featured
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
9
750
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.1k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.1k
How GitHub (no longer) Works
holman
314
140k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.9k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Agile that works and the tools we love
rasmusluckow
328
21k
Practical Orchestrator
shlominoach
186
10k
Optimizing for Happiness
mojombo
377
70k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
Transcript
supabase SvelteKit Web 2023 2 0 23 . 11 .
18 @seike 4 60 1
自己 @seike 46 0 - - @seike 46 0 -
AWS Community Builder Serverless - Fusic - / 門 - / - - PHP - JAWS Days AWS Devday - Serverless Days Tokyo - - 大 工 子工 - PHP - 2
Agenda 1 .Svelte 2 .SvelteKit 3 . 4 .supabase 5
.supabase x SvelteKit 6 . 3
01 Svelte
Svelte JavaScript Svelte Svelte 言 Write less code No virtual
DOM DOM Truly reactive 自 Hooks 5
Write less code - Svelte 6 <script> let a =
1 ; let b = 2 ; </script> <input type="number" bind:value={a}> <input type="number" bind:value={b}> <p>{a} + {b} = {a + b}</p> let State bind 行 方 築 行 [a] input p [a]
Write less code + Truly reactive 7 <script> let a
= 1 ; let b = 2 ; </script> <input type="number" bind:value={a}> <input type="number" bind:value={b}> <p>{a} + {b} = {a + b}</p> Svelte ⾒
TEMPLATE SYNTAX 8 {#if porridge.temperature > 1 00 } <p>too
hot!</p> {:else if 8 0 > porridge.temperature} <p>too cold!</p> {:else} <p>just right!</p> {/if} {#each items as item} <li>{item.name} x {item.qty}</li> {/each} {#await promise} <p>waiting for the promise to resolve...</p> {:then value} <p>The value is {value}</p> {:catch error} <p>Something went wrong: {error.message}</p> {/await} {#key value} <div transition:fade>{value}</div> {/key} {#if }... {:else if } {/if} {#each as name, index} ... {/each} {#await }... {:then name}... {:catch name} … {/await} {#key }... {/key}
Props Props export 用 Props 用 生 9 Counter.svelte App.svelte
Store 10
Store writable 用 Store 用 subscribe 火 用 update set
用 Store 11
Component Hooks onMount DOM beforeUpdate state afterUpdate onDestroy 12
No virtual DOM Virtual DOM Dom 行 Virtual DOM 用
生 Svelte DOM 用 行 行 13
krausest React Vue 比 Svelte 14 https://krausest.github.io/js-framework-benchmark/current.html
02 SvelteKit
SvelteKit Svelte Vite Rollup 用 っ URL っ (SSR)
生 (SSG) 高 SEO っ っ 16
▪ϧʔςΟϯάʢRoutingʣ URLͱͦΕʹରԠ͢Δίϯςϯπͷؔ࿈͚ ▪σʔλͷಡΈࠐΈʢLoading Dataʣ ϖʔδίϯϙʔωϯτ͕ϩʔυ͞ΕΔࡍʹඞཁͳσʔλΛऔಘ ▪ϑΥʔϜΞΫγϣϯʢForm Actionsʣ ϑΥʔϜͷૹ৴࣌ʹαʔόʔଆͰߦ͏ॲཧ ▪ϖʔδΦϓγϣϯʢPage Optionsʣ
ݸʑͷϖʔδʹؔ࿈͢Δઃఆಈ࡞Λࢦఆ͢Δ ▪εςʔτཧʢState Managementʣ ΞϓϦέʔγϣϯͷঢ়ଶΛҰݩతʹཧ 17
Routing 18 src/routes/+page.svelte -> / <h 1 >Hello and welcome
to my site!</h 1 > <a href="/about">About my site</a> src/routes/about/+page.svelte -> /about <h 1 >About this site</h 1 > <p>TODO...</p> <a href= /">Home</a> src/routes/blog/[slug]/+page.svelte -> blog/hoge <script> /** @type {import('./$types').PageData} */ export let data; </script> <h 1 >{data.title}</h 1 > <div>{@html data.content}</div> SvelteKit 用 src/routes URL +error.svelte +layout.svelte API +server.js URL
Loading data 19 src/routes/blog/[slug]/+page.js /** @type {import('./$types').PageLoad} */ export function
load({ params }) { return { post: { title: `Title for ${params.slug} goes here`, content: `Content for ${params.slug} goes here` } }; } src/routes/blog/[slug]/+page.svelte <script> /** @type {import('./$types').PageData} */ export let data; </script> <h 1 >{data.post.title}</h 1 > <div>{@html data.post.content}</div> +page.svelte load +page.js load page data 用 Layout data +page.server.js cookies headers
Form actions 20 src/routes/login/+page.server.js /** @type {import('./$types').Actions} */ export const
actions = { default: async (event) => { // TODO log the user in } }; src/routes/login/+page.svelte <form method="POST"> <label> Email <input name="email" type="email"> </label> <label> Password <input name="password" type="password"> </label> <button>Log in</button> </form> +page.server.js actions <form> 用 POST 築 築 ⾒ / 築 login -> ?/login register -> ?/register
Page options 21 +page.js/+page.server.js/+server.js export const prerender = true; +page.js
export const ssr = true; っ 生 HTML 生 生 っ 生 SSR 生 示
State management 22 +page.server.js let user; /** @type {import('./$types').Actions} */
export const actions = { default: async ({ request }) => { const data = await request.formData(); // NEVER DO THIS! user = { name: data.get( ‘ name'), embarrassingSecret: data.get( ‘ secret') }; } } っ state user っload 用 っcontext store
03
- API - - API 用 - - DB 用
sqlite - - - - っ 欠 -> 身 築 or 24
非 一 一夕 身
Point BaaS
04 Supabase
supabase っPostgreSQL supabase PostgreSQL っ っ Google GitHub Facebook っ
自 API SQL RESTful API 自 PostgREST 用 っ 行 っ 一 自 行 っ GitHub 用 -> EC 2 28
Client 生 supabase Client URL KEY anonkey KEY anonkey CRUD
29 PUBLIC_SUPABASE_URL PUBLIC_SUPABASE_KEY
Anonkey Key anon Table CRUD 一方 人 人 30
Row Level Security PostgreSQL 用 row SQL 人 見
Row Level Security DB 31 supabase Row Level Security Firebase 比 @dshukertjr https://qiita.com/dshukertjr/items/ 0 5 372 4 367 fda 267 8 f 2 41
SQL 行 行 SQL Editor 用 32
SQL Editor SQL 行 行 SQL Editor 用 33
34 API from 行 select insert update delete 用 行
match like in 稿 行 order limit 用 ORM 用
Google GitHub Kakao Spotify 日 35
Storage API Amazon S 3 Storage 用 用 36
Edge Functions 用 Deno TypeScript WASM 37
金 Free 2 用 人目 $25 用 用 38
05 supabase X SvelteKit
SvelteKit supabase ⾒ SQL ⾒ Model Model 用 SQL SQL
行 手 SvelteKit supabase 自 API 生 40
UI supabase SvelteKit ⾒ UI UI subscribe
⾒ Web 41
SvelteKit 用 Vercel supabase 用 supabase SvelteKit
42
⾒ Supabase SvelteKit 用 用 Supabase
用 RowLevel RDBMS 一 43
文 っFree Free 人 用 PoC 用 用
2 ⾒ 用 ⾒ PRO 用 用 PRO っ 一方 手 自 Amazon RDS 用 44
方 https://github.com/supabase-community/svelte-kanban .env.example .env Rename 自 supabase URL anon_key SvelteKit
supabase ⾒ 方 45
Adapter svelte.config.js 用 @sveltejs/adapter-auto 自 Adapter 46
47
48
Sveltekit x Supabase x Skelton 49 SvelteKit supabase ⾒ Svelte
UI Skelton 用 ⾒ 自
方 SQL 人 力 SQL 人 GUI API 身 supabase
50
07
52 SvelteKit Point 1 supabase Point 2 SvelteKit X supabase
Point 3 SvelteKit X supabase Point 4
Thank You We are Hiring ! https://recruit.fusic.co.jp/