å人ããã°ã®é床æ¹åèš
by reu · 2026/5/15
Next.js 16 å人ããã°ãçéåãã話 â èšäºè©³çްã 3.8s â 73ms ã«çž®ãããŸã§ TL;DR - é
ããŠè©°ãŸã£ãŠããã€ã³ãã人éãåå ç¹å®ããã®ããŸã æ©ãæ°ããã
- Next.js 16 + Vercel + Prisma ã§åãããŠããã®ããã°ïŒèªåèªèº«ïŒã倿®µã§é床æ¹åãã
- äž»ç¯ã¯ ãISR ã宣èšããã®ã«å¹ããŠãªãã£ãã ããš â ã§åŸ©æŽ»
- èšäºè©³çް: 3.8s â 73msïŒã40åïŒ / weather API: 427ms â 49msïŒã9åïŒ ãªã©ã®å¹æ
- Next.js 16 ã§ ã®ã·ã°ããã£ãå€ãã£ãŠãå°å³ãªèœãšã穎ã ç°å¢ - Next.js 16.2.3ïŒTurbopackïŒ
- Vercel ãã¹ãã£ã³ã°
- Prisma + SupabaseïŒDB + Auth + StorageïŒ
- TypeScript / Tailwind CSS ãã£ãããšç·èЧ | | æã¡æ | 广 |
|---|---|---|
| 1 | PostList ã®ã¯ãšãªã ã§ãã£ãã·ã¥ | ãããã§æ¯ãªã¯ãšã¹ã DB ãå©ããªããªã£ã |
| 2 | ã ã§ dedupe | ãªã¯ãšã¹ãå
ã® DB åŸåŸ© 2 å â 1 å |
| 3 | ã ã§æ°žç¶ãã£ãã·ã¥ | ã® HTTP åŸåŸ©ã¹ããã |
| 4 | æçš¿ç³» API ã§ / | ãã£ãã·ã¥ç¡å¹åãæç€ºå |
| 5 | EditButton ã® â åãæ¿ã | ã® 812ms ãæ¶æ»
|
| 6 | å€©æ° fetch ã ã§é
å»¶ | æç»ãããã¯è§£æ¶ïŒè£
食ãªã®ã§åŸã§ååïŒ |
| 7 | 㫠远å | ãæ»ããæŒäžæã® RSC åååŸ 1.9s ãæ¶æ»
|
| 8 | Yusei Magic ã | woff2 preload 37 å â 7 å |
| 9 | ã§å
šèšäº SSG | èšäºè©³çް 3.8s â 73ms |
| 10 | ã Edge Runtime + | 427ms â 49ms | 以äžãç¹ã«åŠã³ã倧ããã£ããã®ãããã¯ã¢ããããŠæžãã --- â ããŒã¿ååŸããã£ãã·ã¥ããïŒ + ïŒ ãããããŒãžã®ãæè¿ã®æ¯èšãã»ã¯ã·ã§ã³ãã¢ã¯ã»ã¹ããšã« Prisma ãå©ããŠããã ã§ 1 æ¥ãã£ãã·ã¥ + tag ã§æç€ºç Žæ£ã§ããæ§æã«ããã æŽæ°æã¯ POST/PUT ã®ãšã³ããã€ã³ãã§ ãåŒãã§æç€ºç Žæ£ããã > â ïž Next.js 16 ãã 㮠第äºåŒæ°ãå¿
é ã«ãªã£ãŠããã 㯠cacheLife ãããã¡ã€ã«åã§ãæ°žç¶ãã£ãã·ã¥çžåœã®æåãããã«æ°ä»ãããã«ããèœã¡ãã
>
> ãŸã ã® ãš ã®æ¬äœã§åã slug ã® ã 2 åå©ããŠããã®ã§ã ã§ dedupe ããã 㯠åäžãªã¯ãšã¹ãå
ã§åãåŒæ°ãªãçµæãåå©çšããä»çµã¿ãISR ãå¹ããŠããã°ãããã DB ã¯è§Šããªããããã£ãã·ã¥åçææã«ã ãå¹ãä¿éºãšããŠå
¥ããã --- â¡ Markdown ã¬ã³ããªã³ã°çµæãæ°žç¶ãã£ãã·ã¥ ã¯å
éšã§ ã䜿ããèšäºå
ç»åã®å®ãµã€ãºããªã¢ãŒããã HTTP ã§ååŸããŠããããããç»åææ°åèµ°ãã®ã§çµæ§éãã ã§ ãããŒã«æ°žç¶ãã£ãã·ã¥åããã ãããŒã«å«ãŸããã®ã§ãèšäºæŽæ°æã¯èªåã§å¥ããŒã«ãªãåèšç®ããããå€ãããŒã®ãã£ãã·ã¥ã¯ Next.js åŽã§æŸçœ®ãããã --- ⢠EditButton ã® 812ms åæž ãã©ãŠã¶ã® DevTools ã§ Network ãèŠãŠããããèšäºããŒãžã«é£ã¶ãã³ã« ãžã® fetch ã 812ms ããã£ãŠãããç¯äººã¯ããã 㯠Supabase ã®èªèšŒãµãŒããŒã«æ¯ååãåãããã®ã§é
ããäžæ¹ 㯠localStorage / Cookie ããæ¢åã»ãã·ã§ã³ãèªãã ãã§ã»ãŒ 0msã ãã®ãã¿ã³ã®çšéã¯ããã°ã€ã³äžãªãç·šéãã¿ã³ã衚瀺ãããã ããå®éã«ç·šéãå®è¡ãã API ã«ãŒãã§ã¯å¥é ã§æ€èšŒãããã®ã§ãUI 衚瀺å€å®ãšããŠã¯ ã§ååã ãããã¯ãŒã¯ã¿ããã ã®ãªã¯ãšã¹ãããšæ¶ããã --- ⣠è£
é£Ÿçš API ã¯æç»åŸã§ããïŒïŒ èæ¯ã®ç©ºã®è²ã倩æ°ã§å€ããè£
食ãããã ã峿 fetch ããŠããããã ããã¯è£
食ãªã®ã§ãã¡ã€ã³æç»åŸã§ååã ã§ãã©ãŠã¶ã®ã¢ã€ãã«æéã«é
å»¶ããã 㯠Safari ã®å€ãããŒãžã§ã³ã§æªå¯Ÿå¿ãªã®ã§ã ã§ãã©ãŒã«ããã¯ããŠããã --- â€ ãæ»ãããã¿ã³ã§ 1.9 ç§ â ã®èœãšã穎 èšäºè©³çްãããæ»ãããæŒããšããããã«æ»ãã®ã«æ¯å 1.9 ç§ããã£ãŠãããDevTools ã§èŠããš ãšãã URL ã« GET ãé£ãã§ããã ãã㯠React Server Components ã® payload ãååŸãã Next.js ã®æåãæ¬æ¥ã¯ Router Cache ããå³åŸ©å
ãã¹ããšãããæ¯ååååŸããŠããã åå 㯠Next.js 16 ã® Router Cache ã®ããã©ã«ãèšå®ã | ããŒãžçš®å¥ | ããã©ã«ãã® staleTimes |
|---|---|
| Static | 5 å |
| Dynamic | 0 ç§ â å³ expire | ãã®ãµã€ãã®ããã㯠AboutMe ã ã䜿ã£ãŠãé¢ä¿ã§ Dynamic æ±ãã«ãªã£ãŠãããRouter Cache ã®ä¿ææéã 0 ç§ã ã£ãã ã§æç€ºçã«æ¡åŒµããã ããã§æ»ããã¿ã³æŒäžæã« Router Cache ããå³åŸ©å
ãããããã«ãªãã ã®åååŸãæ¶ããã --- ⥠ãã©ã³ãã® preload ã 37 åããã£ã ãããã¯ãŒã¯ã¿ãã§ ãèŠããš 37 å ã® preload ãèµ°ã£ãŠããã ã ã§äœ¿ã£ãŠããããæ¥æ¬èªãã©ã³ãã® Google Fonts CSS 㯠ã§å€§éã® segment ã«åå²ãããŠãããNext.js ãããããå
šãŠèªå preload ããŠããã ã«ããããšã§ãrevalidate = 86400curl -I
cache-control: private, no-cache, no-store, max-age=0, must-revalidate
x-vercel-cache: MISS
cf-cache-status: DYNAMIC
MISSage: 0await paramsforce-staticts
// ãã£ãŠããŸã£ã
export const dynamic = "force-static";
export const revalidate = 86400;
[slug]generateStaticParamsforce-staticforce-staticgenerateStaticParamsgenerateStaticParamsforce-staticgenerateStaticParamsts
// app/posts/[slug]/page.tsx
import { getAllPublishedSlugs } from "@/lib/queries"; export const revalidate = 86400; export async function generateStaticParams() {
const slugs = await getAllPublishedSlugs();
return slugs.map((slug) => ({ slug }));
}
ts
// lib/queries.ts
export async function getAllPublishedSlugs(): Promise {
const posts = await prisma.post.findMany({
where: { published: true },
select: { slug: true },
});
return posts.map(({ slug }) => slug);
}
generateStaticParamsdynamicParams = truecurl -I
[1] TTFB=1.071s x-vercel-cache: HIT age: 0
[2] TTFB=0.341s x-vercel-cache: HIT age: 2
[3] TTFB=0.056s x-vercel-cache: HIT age: 3
x-vercel-cache/api/weatheripapi.co/json//api/weather?lat=...&lon=...x-vercel-ip-latitudex-vercel-ip-longitudets
// app/api/weather/route.ts
export const runtime = "edge"; export async function GET(request: NextRequest) {
const headerLat = request.headers.get("x-vercel-ip-latitude");
const headerLon = request.headers.get("x-vercel-ip-longitude");
const lat = parseFloat(headerLat ?? "");
const lon = parseFloat(headerLon ?? ""); // 0.1床ïŒçŽ 11kmïŒã«äžžã㊠CDN ãã£ãã·ã¥ããŒãå
±æãããããã
const finalLat = Number.isFinite(lat) ? Math.round(lat 10) / 10 : 35.6812;
const finalLon = Number.isFinite(lon) ? Math.round(lon 10) / 10 : 139.7671; const res = await fetch(
,
{ next: { revalidate: 600 } }
);
// ... return NextResponse.json(data, {
headers: {
"Cache-Control":
"public, max-age=600, s-maxage=600, stale-while-revalidate=3600",
},
});
}
runtime = "edge"/api/weatheripapi.co
[1] TTFB=1.061s age: 0 (Edge cold start)
[2] TTFB=0.219s age: 0
[3] TTFB=0.049s age: 1 â 49ms!
/api/weatherrevalidatex-vercel-cache: MISSforce-staticgenerateStaticParamsrevalidateTag"max"getSessiongetUserrequestIdleCallbackunstable_cache'use cache'probe-image-size` ã®çµæã DB ã«æ°žç¶åããïŒæçš¿æã®ã¿å®è¡ããèšèšïŒ åèãªã³ã¯ - Next.js: generateStaticParams
- Next.js: staleTimes
- Next.js: revalidateTag
- Vercel: Edge Functions geolocation headers
- Supabase: getSession vs getUser
è²éžã³ãèŠæã ããæ©æ¢°çã«éžã¹ãªãã詊ãããããŒã«ãäœã£ã
by reu · 2026/5/15
è²ã銎æãŸãã Web ããŒã«ãreuniãäœã£ã çµµæããšãè²éžã³ã§è©°ãŸããã¡ã ã£ããããã«ã©ãŒãã¬ãããæ©æ¢°çã«éŠŽæãŸãã Web ããŒã«äœã£ãŠã¿ãããã£ãŠè©± - ðž ãµã€ã: https://reuni.ryu-reu.me
- ðŸ ãœãŒã¹: https://github.com/ryu1-1uyr/reuni reuni ã£ãŠäœ èµ€ã»é»ã»ç·ã¿ããã«è²çžãé¢ããè²ãçµã¿åããããšã圩床ãæåºŠããã©ã€ããŠã±ã³ã«ããŠèŠããã¡ãããªãïŒ ããããã®ã OKLCH è²ç©ºé ã§æ©æ¢°çã«æããŠããŸãšãŸã£ããã¬ããã«æŽããããŒã«ã å
¥åããè²ãããã§ãŒã³ãã£ãŠããã¹ãããã®çµã¿åããã§å å·¥ããŠãBefore / After ã䞊ã¹ãŠç¢ºèªã§ããæãã "reuni"(on) ããåã£ãé èªãããš ReU ãäœã£ãŠããããã®ååã äœ¿ãæ¹ãã£ãã 1. å
¥åãã¬ããã«è²ãå
¥ãã å
¥ãæ¹ã¯ 5 éãïŒ - HEX æå
¥åïŒïŒ
- ãã€ãã£ãã®ã«ã©ãŒããã«ãŒ
- ðš ã¹ãã€ãïŒEyeDropper APIã察å¿ãã©ãŠã¶ã®ã¿ïŒ
- ð² ã©ã³ãã 1ïŒããã£ãœãè²ã1å远å ïŒ
- ð² å
šã©ã³ãã 眮ãæãïŒ5è²ãŸãããšå·®ãæ¿ãïŒ ã©ã³ãã ç³»ã¯é»éè§ïŒ137.5°ïŒã§è²çžãããã㊠L=0.55ã0.80 / C=0.10ã0.16 ã®ã¬ã³ãžã«åããŠããå®å
šã©ã³ãã ã ãšå²ãšæ±ãè²åºãããããããã£ãŠã¬ã³ãžçžãæãã éã«æ¿ã£ãè²ã¯åºã«ããã£ãŠãã匱ç¹ããããã©ãã 2. ãã§ãŒã³ãçµã ã銎æãŸããã§ãŒã³ãã»ã¯ã·ã§ã³ã§ã¹ããããç©ã¿éããŠãããäžã«ãããã¿ã³ãã远å ã§ãããïŒ -
-
- ïŒLïŒC åæïŒ
-
- é çªãæå³ãã£ãŠãäžããé ã«é©çšããããäžŠã¹æ¿ã㯠ââ ãã¿ã³ã§ã 3.ããªããããæãã«ãããã¿ã³ã èªåã§ã¹ãããçµãã®é¢åãªãšãã¯ãããæŒããã³ã« 5 çš®é¡ã®ããªã»ãããããŒããŒã·ã§ã³ããïŒ 1. ããŒãžã¥éŠŽæãŸã: äžå€®å€ L/C ã§ããŒã³çµ±äž + ããŒãžã¥ 15% ãã¬ã³ã
2. ãã¹ãã«å: é«æåºŠã»äœåœ©åºŠããŒã³ + æçœ 4.5% ãã¬ã³ã
3. ã·ãã¯: äœæåºŠã»äœåœ©åºŠããŒã³ + é» 8% ãã¬ã³ã
4. ãããã: äžæåºŠã»é«åœ©åºŠããŒã³
5. ãªããæããããã€: åœ©åºŠãæ¥µç«¯ã«èœãšããŠéã¿ãæ··ããŠæããŒã³å æŒããã³ã«éããã€ãåœãããããã¬ãã£ãæèŠã§åããã
ãã¡ãã¯ãã®ãããããã 4. Before / After ã§ç¢ºèª å
¥åé / æåºŠé ã§ãœãŒãåæ¿ã§ãããæåºŠé ã«ãããšå·®ãèŠãããã ã¢ãã€ã«è¡šç€ºã ãšãã§ãŒã³ç·šéäžã« Before/After ãç»é¢å€ã«è¿œãããããåé¡ãã£ããããAfter è²ã ãã®ã³ã³ãã¯ãããŒãç»é¢äžéšã« sticky ã§è²Œãä»ãããã«ããã ã§ touch ããã€ã¹å€å®ããŠãPC ã§ã¯åºãªãã 5. ãšã¯ã¹ããŒã ãã¬ãŒã³ HEX / JSON / CSS 倿° / Tailwind v4 圢åŒã§ã¯ã³ã¯ãªãã¯ã³ããŒãTailwind v4 ã ãš ã¿ããã«ãã®ãŸãŸ config ã«è²Œãã圢åŒã§åºåããã 6. URL ã§å
±æ ã§ãã¬ããïŒãã§ãŒã³ã URL hash ã«è©°ããŠå
±æã§ããã hash éšå㯠state ã URL-safe base64 ã«ãšã³ã³ãŒããããã€ããµãŒããŒã«éä¿¡ãããªããããã°ã«ãæ®ããªãããããŒãžãªããŒããçºçããªãããã·ã³ãã«ã 仿§ã¡ã¢ OKLCH ãæ¡çšããçç± è²èšç®ã OKLCH è²ç©ºéã§ããã®ãããœã人éã®ç¥èŠãšç·åœ¢ã«è¿ããããL ã C ãæ©æ¢°çã«æããŠãèŠãç®ã§éåæåºã«ãããããã HSL ã§ãããšãäŸãã°æåºŠïŒHSL ã® LïŒã 0.7 ã«æããŠããé»è²ã¯ç©ããèŠããŠéã¯æãèŠãããããŠãèŠèŠçã«ã¯ãã©ã€ããŠæãããOKLCH ã® L ã¯ããããç¥èŠãã©ãããæ£èŠåããå€ã ãããæãããšèŠãç®ãã¡ãããšæã£ãŠæããã ãœãŒã¹ïŒåèã«ãããã€ïŒ - OKLCH vs HSL: Why Perceptual Uniformity Matters - ColorBox â ããããããæ¯èŒ
- OKLCH Color Space - Atmos Style â æ°å€ã®æå³ãäžå¯§ã«è§£èª¬
- What are OKLCH colors? - Jakub â HSL ã® hue driftïŒè²çžã®ãºã¬ïŒãææããŠã
- oklch() CSS-Tricks | â CSS ã®æèã§ã®è§£èª¬ 5 ã€ã®éŠŽæãŸãã¢ãŒã | ã¢ãŒã | å
éšåŠç |
|---|---|
| åœ©åºŠçµ±äž (chroma) | å
šè²ã® C ã target å€ã§çœ®æ |
| æåºŠçµ±äž (lightness) | å
šè²ã® L ã target å€ã§çœ®æ |
| ããŒã³çµ±äž (tone) | L ãš C ãåæã«çœ®æïŒH ã¯ç¶æïŒ |
| å
±éè²ãã¬ã³ã (mix) | å
šè²ãå
±éè²ãš OKLab 空éã§ç·åœ¢è£é |
| å
¥åè²ã«ãããã (anchor) | åºæºè²ã® L/C ã«ä»è²ãå¯ããïŒstrength å¯å€ïŒ | è²ãµãžã§ã¹ãæ©èœ ããããªè²ãåããããã»ã¯ã·ã§ã³ã§ãæ¢åãã¬ããã® hue ã®ã£ãããèšç®ããŠåãŸã£ãŠãªãè²çžã 3 ã€ææ¡ãããè²çžç°ã 0ã360° ã§èŠãŠã飿¥ããè²çžéã®ã®ã£ããã倧ããé ã«äžäœ 3 ã€ã®äžç¹ã hue ãšããŠãL/C ã¯æ¢åãã¬ããã®äžå€®å€ã䜿ãã ãã§ãŒã³æ©èœã®å®è£
åå®çŸ©ïŒdiscriminated unionïŒ åã¢ãŒãã ã§èå¥ãã discriminated unionãTypeScript ã® switch æã§ã¡ãããšç¶²çŸ
æ§ãã§ãã¯å¹ãããå®å¿ã åã¢ãŒããçŽç²é¢æ°ã§å®è£
UI ã«äŸåããªãçŽç²é¢æ°ãšã㊠ã«åãåºããŠããåŸã§ CLI åããããªã£ãŠãåå©çšã§ãããããã¹ããããããã applyStep / applyChain ã§é çªã«é©çšããã ããã·ã³ãã«ã Mix ã¢ãŒã㯠OKLab ã§è£é ãã¬ã³ã㯠OKLCH ãããªã㊠OKLab ã§ãããOKLCH ã ãš hïŒè²çžïŒãååšäžã®è§åºŠã ãããè£éæ¹åã«ææ§ããåºãïŒæèšåãïŒåæèšåãïŒïŒãOKLab 㯠a/b 軞ã®çŽäº€åº§æšã ãããç·åœ¢è£éã§çŽ çŽã«è£éã§ããã Gamut clipping OKLCH ã§èšç®ããçµæã sRGB ã®è¡šç€ºç¯å²å€ã«åºãããšããããããHEX åããçŽåã« culori ã® ã§ã¯ãªããããïŒ ããããªããšãäŸãã°çŽç²ãª OKLCH(0.7, 0.3, 30) ã¿ãããªæå®ã gamut å€ã§ ãåºãããå€ãªè²ã«ãªã£ããããã anchor ã¢ãŒãã®èœãšã穎 æå ã®ãšãã«ãå€åãªããã«ãªãã¯ããªã®ã«ã埮åŠã«è²ãå€ããåé¡ããã£ããåå 㯠OKLCH â HEX ã®åŸåŸ©å€æã§ gamut å€ã®è²ã埮åŠã«äžžããããããšã ã®ãšãã¯æ©æãªã¿ãŒã³ã§å®å
šã«ã¹ããããå°å³ã ãã©å€§äºã æè¡ã¹ã¿ã㯠| å±€ | æ¡çš |
|---|---|
| ãã«ã | Vite 8ïŒrolldown ããŒã¹ïŒ|
| èšèª | TypeScript |
| UI | React 19 |
| è²èšç® | ïŒOKLCH â sRGBãgamut clipïŒ|
| ã¹ã¿ã€ã« | Tailwind CSS v4ïŒïŒ|
| ãã¹ã | Vitest 4ïŒhappy-domïŒ|
| Lint / Format | Biome |
| ããã〠| GitHub Pages + GitHub Actions + Cloudflare DNS | Tailwind v4 ã§æ¥æ¬èªãã©ã³ãïŒZen Maru GothicïŒãåœãŠããšãã ãæžããšããšïŒ v3 ãŸã§ã® ãããªããŠãCSS ã® ãããã¯ã§æå®ãã圢ã«ãªã£ããæ
£ãããš CSS ã ãã§å®çµããããè¯ãã ãããã« çµµæããšãã®è²éžã³ããæ©æ¢°çã«æãããã ãã§ãããã¡ããã¡ã楜ã«ãªãå Žé¢ãããããã®ã«ã©ãªã¹ãã®ä»£ããã«ã¯ãªããªããã©ãéã«ãã¬ããçµãã§ããªããããæãã«ãããã¿ã³ã飿ããã ãã§å®çšã«èãããã¬ããã«ãªãã®ã¯äœã£ãŠãŠã¡ãã£ãšé¢çœãã£ã
俺ããã£ã±OGPãåºããããã ãã
by reu · 2026/4/9
OGP 衚瀺ãããªãåé¡ãšæŠã£ãèšé² Next.js ã® App Router ã§ OGP ãèšå®ããŠãX ã§ã«ãŒã衚瀺ããããŸã§ã«çµæ§èŠæŠããæã®åå¿é²ãæªå®è£
ã ã£ãæããã®æç³»åé ã --- 1. äžæŠæ®éã®ã¢ãããŒãã§ OGP ãåºããæ§ã«ããŠã¿ã ãµã€ãã«ã¯ ã« title ãš description ãããã ãã§ãOpenGraph ã¿ã°ã Twitter Card ã¿ã°ãäžåãªãç¶æ
ããã¹ã¿ãŒãã ãã£ãããš - ã« ïŒïŒãèšå®ããããã©ã«ã OGP ãš Twitter CardïŒïŒã远å
- ã«éçã¡ã¿ããŒã¿ã远å
- ãæ°èšããã ã Disallow
- ãæ°èšãPrisma ããå
¬éèšäºãå
šä»¶ååŸããŠåççæ èµ·ããããš èšäºè©³çްããŒãžïŒïŒã¯ ã ã£ãã®ã§ ã䜿ããªãã£ãã 解決ç: ã Server Component ãšããŠæ°èšããããã« ãæžãããããŒãžæ¬äœã¯ã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ãã®ãŸãŸã§ OKãNext.js ã® App Router ã§ã¯ãlayout ãš page ã¯ç¬ç«ããŠãµãŒããŒ/ã¯ã©ã€ã¢ã³ããéžã¹ãã®ããã€ã³ãã layout åŽã§ã¯ Prisma ãã DB ãååŸããæ¬æãã Markdown èšæ³ã HTML ã¿ã°ãé€å»ããŠå
é 120 æåã description ãšããŠäœ¿ãããã«ãããæãããŠããã¯æ¬åœã« description ãªãã§ããããã£ãŠè³å
ã©ã€ã³ã¹ã話ããããŠããã --- 2. OGP ç»åã®åççæ èšäºãã·ã§ã¢ããæã«ã¿ã€ãã«å
¥ãã®ããæãã®ç»åãåºããããªã£ãããããããã€ã ãæ°èŠäœæ Next.js ã® ïŒnext/ogãå
éšã¯ SatoriïŒã䜿ã£ãŠåçã«ç»åãçæãã API ãäœã£ãã - ã¯ãšãªãã©ã¡ãŒã¿ã§èšäºã DB ååŸ
- æ¬æããæåã®ç»å URLïŒïŒãæœåºããŠãµã ãã€ã«ã«
- èæ¯è² ãã¿ã€ãã«çœããµã€ãåãã³ã¯ïŒïŒ
- ç»åãµã€ãº: 1200x630ïŒTwitter æšå¥šïŒ
- ãµã€ãåã®æšªã«ã¢ãã¿ãŒç»å ãã©ã³ãæå® ããã©ã«ãã®ãã©ã³ãã ãšå³æ°ãªãã£ãã®ã§ãGoogle Fonts ãã Yusei Magic ã® ttf ã fetch ããŠã®ãªãã·ã§ã³ã«æž¡ãããïŒããã®ããã§åŸã§ã¡ãã£ãšçãç®ãèŠãïŒ layout.tsx åŽã§ã¯ãTwitter Card ã ã«å€æŽããOGP ç»å URL ã ã«åããã --- 3. X ã§ã«ãŒãç»åã衚瀺ãããªã: ãã®ïŒ ãããã€ããŠå®éã« X ã§ã·ã§ã¢ãããã«ãŒãç»åãåºãªãã èª¿æ» ã¡ã¿ã¿ã°ãçŽæ¥ fetch ããŠç¢ºèªãããããã¹ãŠæ£ããåºåãããŠããã åé¡ãªãããã«èŠãã⊠Twitter Card Validator ã®èŠå Twitter Card Validator ã§æ€èšŒããããããªèŠåãåºãŠããã åå : robots.txt ã§ ãå
šé¢ Disallow ããŠããã®ãåå ã ã£ãã Twitterbot 㯠robots.txt ãå°éããããã ã®ç»å URL ãååŸãã«æ¥ãæç¹ã§ãããã¯ãããŠãããOGP ã®ç»å URL ã é
äžã«ããã®ã«ããã®ãã¹ã robots.txt ã§æåŠããŠãããããããã¯ããŒã©ãŒã¯ç»åãåããªãã æèš: robots.txt ã§ ãäžæ¬ Disallow ãããšãOGP ç»åã®ãããªã¯ããŒã©ãŒã«ååŸããŠã»ãããšã³ããã€ã³ãããããã¯ãããã ä¿®æ£ robots.txt ã®èšå®ãèŠçŽã㊠ãèš±å¯ããããã«å€æŽããã --- 3. X ã§ã«ãŒãç»åã衚瀺ãããªã: ãã® 2 robots.txt çŽããŠãå
šç¶ OGP 衚瀺ãããªããŠæ³£ããŠãã
ç¶æ³ãšããŠã¯ã"ãã©ãŠã¶ã§çŽæ¥å©ããŠç»åã¯åºãããopengraph.xyz ãªã©ã§èŠããš unreachable" Gemini ã«èããŠã¿ãããã®ã±ãŒã¹ã¯ã¯ããŒã©ãŒã®ã¿ã€ã ã¢ãŠããåå ãªãã ã£ãŠãå®éããã§ã4.51 ç§ãã²ã©ãæã¯ 9.62 ç§ãããããã£ãŠããŠèã ã£ãã 詊ããããš 1. DB æ¥ç¶ã®æé€
2. ãã©ã³ãã®ããŒã«ã«å
3. Cache-Control ããããŒ
4. Edge Runtime å
5. ã¢ãã¿ãŒ base64 ã€ã³ã©ã€ã³å DB æ¥ç¶ã®æé€ ããšããš API route å
ã§ slug ãã DB ãåŒããŠããããlayout ã® ã§æ¢ã«ããŒã¿ãæã£ãŠããã®ã§ãããã API åŽã§åååŸããå¿
èŠããªãã£ãã 倿Ž: ã¯ãšãªãã©ã¡ãŒã¿ã ãã ã«å€æŽããAPI route åŽã¯ DB ã«äžåè§Šããªãããã«ã ãã©ã³ãã®ããŒã«ã«å Google Fonts ããæ¯ãªã¯ãšã¹ã ttf ã fetch ããŠããã®ããããŠãïŒçŽ 3MBïŒãããŒã«ã«ã«é
眮ã ã® ã§èªã¿èŸŒã¿ãã¡ã¢ãªã«ãã£ãã·ã¥ãã圢ã«ããã Cache-Control ããã㌠çæããç»åã®ã¬ã¹ãã³ã¹ã«ä»¥äžã远å ã ãã©ãŠã¶ 1 æ¥ãã£ãã·ã¥ + 7 æ¥éã® stale-while-revalidateãèšäºã¿ã€ãã«ãé »ç¹ã«å€ãããã®ã§ã¯ãªãã®ã§ãããã§ååã 以äžã®äºã€ã¯ Claude ã«ææ¡ããŠããã£ãŠããã®ãŸãŸå®è£
ããŠããã£ã Edge Runtime å - runtime = "nodejs" â "edge" ã«å€æŽ
- fs/promises + path ãå
šéšæ¶ããŠãimport.meta.url ãã¿ãŒã³ã«åãæ¿ãã
- ãã©ã³ãèªã¿èŸŒã¿ãã¢ãžã¥ãŒã«ã¹ã³ãŒãã® fetch ã«ãªã£ãŠãããããã«ãæã«ãã³ãã©ãŒã解決ããŠããããå®è¡æã¯å³ ArrayBuffer è¿ãã ã ã¢ãã¿ãŒ base64 ã€ã³ã©ã€ã³å - me.png ãåãã import.meta.url ã§èªãã§ btoa ã§ base64 倿
- data:image/png;base64,... ã OgCard ã«çŽæ¥æž¡ããããSatori ãç»ååãã«è¡ããããã¯ãŒã¯åŸåŸ©ããŒãã«ãªã£ã 4. ã€ãã§ã«ãã£ãã㚠念ã®ãã以äžã远å ããã - ãš ã«èªåã® X ã¢ã«ãŠã³ã
- ã«ããããã®å®éšå Žã ã¿ã°ã®å±æ§ãçŽæ¥å¶åŸ¡ã§ããªãããã ãã¢ãã³ãªã¯ããŒã©ãŒã¯ 屿§ãªãã§ãæ£åžžã« OGP ãèªã¿åãããããå®å®³ã¯ãªãã£ãã --- OgCard ã³ã³ããŒãã³ãã®åãåºã route.tsx å
ã® JSX ãè¥å€§åããŠããã®ã§ã ãšããŠåãåºãããStorybook ããã確èªã§ããããã«ãªãããã¶ã€ã³èª¿æŽãããããããªã£ãã --- 5. vercel ç¡ææ æ
> The Edge Function "api/og" size is 2.37 MB and your plan size limit is 1 MB. ãéãããŠãªããŠããããããã¯ãã©ã³ãã®ããã Edge Runtime -> Node.js ã«æ»ã㊠GET äºç¡ã ãŸãšã - robots.txt ãèŠçŽããã ïŒïŒïŒïŒ
- OPG çæã«ããã£ãŠãæéãã¡ãããšãã§ãã¯ããããªïŒïŒïŒïŒ æçµçã« OGP ã®çæã¯ 9.62s â 623ms ã«ãªã£ããå
ãé
ãã®ããããã© 15 åã§æµç³ã«å€§èåã
ãµã€ãã®èæ¯ã®ã空
by reu · 2026/4/9
Canvas ã§æãåçãªç©º â æå»Ã倩æ°é£åã®èæ¯ã¢ãã¡ãŒã·ã§ã³ 俺ã®ããã°ã®èæ¯ã«ãçŸåšæå»ãšå®éã®å€©æ°ã«é£åããŠå€åãã空ã HTML Canvas ã§æããŠãã話ã å€ã¯æãç¬ããŠæãæµ®ãã³ãæã«ãªããšç©ºããªã¬ã³ãžã«æãŸã£ãŠå€ªéœãæããéšã®æ¥ã¯éšç²ãéããé·éšãªã皲劻ãèµ°ããå
šéš canvas 2D API ã®ææãã ãããã¯ã·ã§ãŒããŒãšãã§ãæžããŠã¿ãããã ã©ããªæ©èœïŒ - æå»ã«å¿ããŠç©ºã®ã°ã©ããŒã·ã§ã³ãå€ããïŒå€ â æçŒã â æŒ â å€çŒã â å€ïŒ
- ãã§ãŒãºã®åãæ¿ããã¯æ»ããã«ãã¬ã³ãããã
- OpenWeatherMap API ããå®éã®å€©æ°ãååŸããŠãéšã»éªã»é²ã»é·ããªã¢ã«ã¿ã€ã 衚瀺
- äœçœ®æ
å ±ã¯ IP ããŒã¹ïŒèš±å¯ãã€ã¢ãã°ãªãïŒã§èªåååŸ
- 倩æ°ã®æåãªãŒããŒã©ã€ã UIïŒyaogoromo.exeïŒã§ãã€ã§ã倩æ°ãå€ãããã
- 察å¿ãã¢ãã€ã«ã§ã¯ããŒãã£ã¯ã«æ°ãåæž
- ã¿ãé衚瀺æã¯ã¢ãã¡ãŒã·ã§ã³äžæåæ¢ ã¢ãŒããã¯ã㣠SkyBackground ã hooks ãšã³ã³ããã¹ããæããŠãèšç®æžã¿ã® props ã SkyCanvas ã«æž¡ãã ããSkyCanvas ã¯çŽç²ãªæç»ãã·ã³ã åã¬ã€ã€ãŒã®è§£èª¬ 1. å€©æ° API ãããã· Next.js ã® Route Handler ã§ãµãŒããŒåŽããå©ããAPI ããŒãã¯ã©ã€ã¢ã³ãã«é²åºãããªã(ããã¯ãã)
ã¬ã¹ãã³ã¹ã¯ ã§ã ã® 10 åãã£ãã·ã¥ä»ãã
äžå¿APIå©ããªãã£ãæã¯æŽãã倧æµã®å Žåã¯æŽããŠãæ¹ãå¬ãããããã 2. åå®çŸ© 空ã®ãã§ãŒãºãšå€©æ°ã®çš®é¡ãåã§çžãããšã§ãæç»é¢æ°ã®ãã¿ãŒã³ããããå®å
šã«ãªãã 3. æå»ãã㯠â useSkyPhase 60 ç§ééã§ æŽæ°ã空ã®å€åã¯ãã£ãããªã®ã§ããã§ååã
ããã¢ã§ãäŸãã°æçŒãã® ãªãããŸã å€ã£ãœã空ã«ãªã¬ã³ãžãæ··ããå§ãããã ãªããã»ãŒæŒã®ç©ºãã«ãªãã ãã®æ©èœãããªãæ°ã«å
¥ã£ãŠããŠã倿¹ãšãã®è³ªæãçµæ§ããæããçŸå³ããããããªãïŒ 4. 倩æ°ããŒã¿ãã㯠â useWeatherData Geolocation APIïŒãã©ãŠã¶ã®äœçœ®æ
å ±èš±å¯ïŒã¯äœ¿ããªããèš±å¯ãã€ã¢ãã°ã¿ããªå«ãã£ããïŒ 5. 倩æ°ãªãŒããŒã©ã€ã â WeatherOverride Context ã·ã³ãã«ãª Context + useStateãnull ãªãAPI ã®å€©æ°ããã®ãŸãŸäœ¿ããå€ãããã°ãã£ã¡ãåªå
ã
ãã£ã±ãå€©æ°æžãæãæ©èœã®ããã®ãã€ã
UI 㯠ãŠã£ã³ããŠã« 5 ã€ã®çµµæåãã¿ã³ïŒâïž âïž âïž âïž â¡ïžïŒã䞊ã¹ãŠãã°ã«åŒã§åãæ¿ããã 6. SkyBackground â ãªãŒã±ã¹ãã¬ãŒã·ã§ã³å±€ hooks ãæããŠãä»ã®ç©ºã¯ã©ããªç¶æ
ããã1ã€ã«è§£æ±ºã㊠SkyCanvas ã«æž¡ãã ãã®èãå±€ã
ã§ã³ã³ãã³ããžã®ã¯ãªãã¯ãé»å®³ããªãã ã§èæ¯ã«æ²ãã layout.tsx ãã㯠+ ã§ã©ããããã çµç±ã§èªã¿èŸŒããcanvas 㯠SSR ã§æå³ãªãã®ã§åå HTML ã軜ãããããã 7. SkyCanvas â æç»ã®æ žå¿ ãããæ¬äœãå
šéš canvas 2D API ã§ææãã ã¡ãªã¿ã«ãã£ã¡ãè¥å€§åããŠããããã°ããããªãããã æç»ã¬ã€ã€ãŒã®éãé 空ã°ã©ããŒã·ã§ã³ ãµã€ãã®ã«ã©ãŒãã¬ããïŒ, , , ïŒã«åãããè²èšèšãå€ã®ç©ºããµã€ãã®èæ¯è² ãšäžèŽããã®ã§ã空ãèªã¿èŸŒãŸããåã§ãéåæããªãã ãã§ãŒãºã®åãæ¿ãã㯠canvas ã¯ãµãŒããŒã§æå³ãªãã®ã§ + ã§ã¯ã©ã€ã¢ã³ãã®ã¿ããŒãã
ã body ã«ä»ããŠãã®ã§ãèªã¿èŸŒã¿å®äºãŸã§ã¯ãµã€ãã®éåžžèæ¯è²ã衚瀺ãããã ãã¡ã€ã«æ§æ | ãã¡ã€ã« | åœ¹å² |
|---------|------|
| | SkyPhase, WeatherCondition, WeatherData ã®åå®çŸ© |
| | OpenWeatherMap ãããã· API |
| | æå» â ãã§ãŒãº + é²è¡åºŠã®ç®åº |
| | IP äœçœ®æšå® + 倩æ°ååŸ + ãã£ãã·ã¥ |
| | 倩æ°ã®æåãªãŒããŒã©ã€ã Context |
| | canvas æç»ã®æ¬äœ |
| | hooks ãæãããªãŒã±ã¹ãã¬ãŒã·ã§ã³ |
| | dynamic import ã©ãã㌠|
| | barrel export |
| | Storybook (13+ ããªãšãŒã·ã§ã³) |
| | 倩æ°åãæ¿ã UI (yaogoromo.exe) | èšèšã§æèããããš é¢å¿ã®åé¢
ããŒã¿ååŸïŒhooksïŒâ ç¶æ
解決ïŒSkyBackgroundïŒâ æç»ïŒSkyCanvasïŒãæç¢ºã«åãããSkyCanvas 㯠/ / ã® 3 ã€ã® props ã ãã§å®å
šã«åãçŽç²ãªæç»ã³ã³ããŒãã³ããStorybook ã§ä»»æã®çµã¿åãããããããããã«ãã®åœ¢ã«ãªã£ãŠããšèšã£ãŠãéèšã§ã¯ãªãã IP ããŒã¹ã®äœçœ®æšå®
Geolocation API ã¯èš±å¯ãã€ã¢ãã°ãåºãããã®ããã°ãåããŠèšªãã人ã«ãäœçœ®æ
å ±ãå
±æããŸããïŒãã¯äœéšãå£ããipapi.co ãªãç¡æã»ããŒäžèŠã»ãã€ã¢ãã°ãªãã§ãã£ããã®ç·¯åºŠçµåºŠãåããã®ã§ã倩æ°ãåºãã«ã¯ååãååŸå€±æããŠãæå»ããŒã¹ã®ç©ºã«ãã©ãŒã«ããã¯ããã®ã§äœãå£ããªãã ãã£ãã·ã¥ã®äºéæ§é
倩æ°ããŒã¿ã¯ 2 ç®æã§ãã£ãã·ã¥ããŠã:
- ã¯ã©ã€ã¢ã³ã: sessionStorage ã« 10 åïŒSPA å
é·ç§»ã§ãªãã§ããããªãïŒ
- ãµãŒããŒ: ïŒAPI Route ã¬ãã«ïŒ 倩æ°ããããªã«é »ç¹ã«å€ãããããªãã®ã§ã10 åãã£ãã·ã¥ã§ API åŒã³åºããæå°éã«ãOpenWeatherMap ç¡ææ ã® 1000 å/æ¥ãããŸããšãäœè£ã ã¢ã¯ã»ã·ããªãã£
ãæå¹ãªããã°ã©ããŒã·ã§ã³ 1 åæãã ãã§ã¢ãã¡ãŒã·ã§ã³ã«ãŒãã«å
¥ããªããèŠèŠçãªè£
食ãèŠæãªäººã«ãã¡ãããšé
æ
®ã ã§èæ¯å
šäœãã¹ã¯ãªãŒã³ãªãŒããŒããé ããŠãã ããã·ãŒãžã£ã«çæ
é²ã®ãã¯ã¹ãã£ç»åãçšæãã代ããã«ãæ¥åã®éãåããã§åçã«çæããŠããã¢ã»ãã管çäžèŠãã©ã³ãã æ§ã§æ¯åéãé²ãã§ããããµã€ãºãèªç±èªåšããã ã blob æ°ãå€ãïŒé²1ã€ã«ã€ã 50ã100 åã®æ¥åïŒã®ã§ãã¢ãã€ã«ã§ã¯é²ã®æ°èªäœãçµã£ãŠãã æžããŠãæäžã«æãã€ããã®ã§ãã®å€æŽå
¥ãã: https://github.com/ryu1-1uyr/ryu-reu.me/pull/119 é²ããªãã¹ã¯ãªãŒã³Canvasã«äžåºŠãã£ãã·ã¥ããŠãæç»æã¯drawImageäžçºã§è¡šç€ºãããããããã°æ¯åèšç®ããã§ãããããããªãããšèšããã€ã
ã¬ããã£ãœãèŠãããã€
by reu · 2026/4/9
ã¬ãããã¹ã¯ããã颚 UI ã®å®è£
ã¡ã¢ èªåã®ããã°ã®ãããããŒãžã Windows 颚ã®ãã¹ã¯ããã UI ã«ãã話ã ãã©ãã°ã§åããããŠã£ã³ããŠãâãã¿ã³ã§éãããã¹ã¿ãŒãã¡ãã¥ãŒããåèµ·åããŠã£ã³ããŠã®ã¯ãªãã¯ã§åé¢ã«æ¥ããã¿ã¹ã¯ããŒã«æèšã å
šéš React + Tailwind ã§ãŒãããçµãã ã ã©ããªæ©èœïŒ - ããŒãžå
šäœããã¹ã¯ããããåã³ã³ãã³ãïŒèªå·±ç޹ä»ãèšäºäžèЧãå€©æ°æäœ etc.ïŒãåå¥ã®ãŠã£ã³ããŠã§è¡šç€ºããã
- ãŠã£ã³ããŠã¯ã¿ã€ãã«ããŒããã©ãã°ããŠèªç±ã«ç§»åã§ããïŒã¢ãã€ã«ã¯å¡ãã§ãïŒ
- â ãã¿ã³ã§éãã â ã¹ã¿ãŒãã¡ãã¥ãŒããå床éãã
- ãŠã£ã³ããŠãã¯ãªãã¯ãããš z-index ãäžãã£ãŠåé¢ã«æ¥ã
- ç»é¢äžéšã«ã¿ã¹ã¯ããŒãStart ãã¿ã³ + æèš
- ã¢ãã€ã«ã§ã¯çžŠç©ã¿ã¬ã€ã¢ãŠãã«èªååãæ¿ãïŒãã©ãã°ç¡å¹ãå
šå¹
衚瀺ïŒ
- ãŠã£ã³ããŠã®è¿œå ã¯èšå®ãã¡ã€ã«1ç®æ + ã³ã³ãã³ã1è¡ã§å®äº ã¢ãŒããã¯ã㣠Q: ãªãã§äžèº«ã¯å€ããæ³šå
¥ãã圢ã«ããã®ïŒ A: æ¢åã®ã³ã³ããŒãã³ããäœãçŽãã®é¢åã ã£ããã wapperã¿ãããªåœ¢ãåãã°ãã¬ãŒã ã ãå€ä»ãã§ããããããã£ãŠæ°ãã€ããŠããããã äŸã®åŠããŸãContextå¢ããã¡ãã£ããç¶æ
ãé ãäœçœ®ã®ã³ã³ããŒãã³ãã«æã£ãŠè¡ãããæã«æ¯å䜿ã£ãŠããŸãã åã¬ã€ã€ãŒã®è§£èª¬ 1. ãŠã£ã³ããŠå®çŸ© â windowRegistry.ts å
šãŠã£ã³ããŠã®èšå®ã1ç®æã«ãŸãšããèšå®ãã¡ã€ã«ãæ°ãããŠã£ã³ããŠã远å ãããšãã¯ããã ãè§Šãã°ããã ãŠãŒãã£ãªãã£é¢æ°ãããã«: åæç¶æ
ã® zIndex 㯠ãªãŠã£ã³ããŠã«é çªã«æ¯ã£ãŠããã ããéããŠããŠã£ã³ããŠã¯ ã 2. ãŠã£ã³ããŠç¶æ
管ç â WindowManager Context 3ã€ã®æäœã ã: closeWindow â ã«ããã ããzIndex ã¯ãã®ãŸãŸã openWindow â ã«ãã€ã€ ãæ¯ã£ãŠæåé¢ã«ã focusWindow â æ¢ã«éããŠããŠã£ã³ããŠãã¯ãªãã¯ããæãzIndex ã ãæŽæ°ã ã¯ãä»ãŸã§ã«æ¯ã£ãæå€§ã® zIndexãã ã§æã£ãŠãŠãæäœã®ãã³ã« +1 ããŠãããèŠã¯ãæåŸã«è§Šã£ããŠã£ã³ããŠãäžçªåãã«ãªããOS ã®ãŠã£ã³ããŠãããŒãžã£ãŒãšåãèãæ¹ã 3. RetroWindow â ãŠã£ã³ããŠã®èŠãç® ç¶æ
管çãäžåç¥ããªããçŽç²ãªè¡šç€ºã³ã³ããŒãã³ãã ã¿ã€ãã«ããŒã®è²ããŒã 4è²ã®ã°ã©ããŒã·ã§ã³èšå®ãçšæ: ã®æšªã°ã©ããŒã·ã§ã³ã§ã¿ã€ãã«ããŒãå¡ãã 㯠â ãã¿ã³ã®ãããŒè²ã ãªããåœåããã¡ãã£ãšããã®ãªãããªãã®èŸº ãã©ãã°ã®ä»çµã¿ Pointer Events ã§å®è£
ãã¿ã€ãã«ããŒã® ã§ãã©ãã°éå§: ãããœãããããªããšããŠã¹ããŠã£ã³ããŠå€ã«åºãç¬éã«ãã©ãã°ãéåããããã£ããã£ããããšã§ããã€ã³ã¿ãŒãã©ãã«ããŠã move ã€ãã³ããã¿ã€ãã«ããŒã«å±ãã ã ïŒã¢ãã€ã«æïŒãªãå
šéšã¹ãããã ãŠã£ã³ããŠã®è£
食 ã®ããŒãã·ã£ããŠã§ã¬ããæãåºããŠããè§äžž + 2px ããŒã㌠+ ããããã·ã£ããŠã®çµã¿åããã è§äžžã®ããã§è¥å¹²èŠåããŠããæ°ãããŠããããäžæŠãšã·ïŒïŒïŒ â ãã¿ã³ã®æšªã«ãã â ãš â¡ ã¯é£Ÿããæå°åã»æå€§åã¯å®è£
ããŠãªãïŒ~é¢åãããã®ã§~èŠããªãããããªããïŒ ã³ã³ãã³ãéšåã¯èæ¯ã®ç©ºãéããŠèŠããããã«åéæ: 4. Desktop â ã³ã³ãã³ããšãŠã£ã³ããŠã®æ¥ç¶ ãŠã£ã³ããŠå®çŸ©ãšã³ã³ãã³ããçµã³ã€ããå Žæã ã§ã¬ãžã¹ããªãåããŠãéããŠããŠã£ã³ããŠã ãæç»ãããã¬ãžã¹ããªã®é åº = ããã©ã«ãã®æç»é ãzIndex ã§ããããååŸãå€ããã ã³ã³ãã³ã㯠page.tsx ããæ³šå
¥: ãŠã£ã³ããŠã·ã¹ãã ã¯äžã«äœãå
¥ããäžåç¥ããªããComposition ãã¿ãŒã³ã 5. Taskbar + StartMenu ã¿ã¹ã¯ã㌠ç»é¢äžéšã«åºå®ãé«ã 40pxãåéæ + ãã©ãŒã Start ãã¿ã³ãæŒããã³ã«ã©ã³ãã çµµæåãå€ããç¡é§ãªæ©èœ: å³ç«¯ã«ã¯ãããã«ãªæèšã10 ç§ããšã«æŽæ°: ã¹ã¿ãŒãã¡ãã¥ãŒ ããã®ãŸãŸåãã®ã§ããŠã£ã³ããŠã远å ããã°ã¹ã¿ãŒãã¡ãã¥ãŒã«ãèªåã§åºãã
éããŠããŠã£ã³ããŠã¯ããã¹ããèããªããéããŠããŠã£ã³ããŠã¯ãèµ·åãã©ãã«ãåºãã ã¡ãã¥ãŒå€ã¯ãªãã¯ã§éããåŠç㯠ã€ãã³ãã§ ãã§ãã¯: 6. ã¬ã¹ãã³ã·ã â useIsMobile ã§ ãç£èŠãSSR æã¯ ãè¿ãã ã¢ãã€ã«æã®æå:
- ãŠã£ã³ããŠã¯ ã§çžŠç©ã¿ïŒãã©ãã°ãªããzIndex ãªãïŒ
- ãé©çšãããŠå
šå¹
衚瀺
- ã¿ã¹ã¯ããŒã¯åãã ããŠã£ã³ããŠã®ã¯ãªãã¯åé¢åã¯ç¡å¹ ãã¡ã€ã«æ§æ | ãã¡ã€ã« | åœ¹å² |
|---------|------|
| | ãŠã£ã³ããŠå®çŸ©ã®åäžãœãŒã¹ïŒå + èšå®é
å + ãŠãŒãã£ãªãã£ïŒ |
| | ééã»zIndex ã®ç¶æ
管ç Context |
| | ãŠã£ã³ããŠã®èŠãç® + ãã©ãã° |
| | ã¬ãžã¹ããªãšã³ã³ãã³ãã®æ¥ç¶ + ã¬ã¹ãã³ã·ãåãæ¿ã |
| | ç»é¢äžéšã®ã¿ã¹ã¯ã㌠+ æèš |
| | ã¹ã¿ãŒãã¡ãã¥ãŒïŒãŠã£ã³ããŠäžèЧ + èµ·åïŒ |
| | ã¢ãã€ã«å€å®ãã㯠|
| | SSR/ã¯ã©ã€ã¢ã³ãå€å®ãã㯠|
| | Desktop ã« contents ãæž¡ã | èšèšã§æèããããš åäžãœãŒã¹ã®å®çŸ©ãã¡ã€ã«
ãŠã£ã³ããŠã®è¿œå ã«å¿
èŠãªå€æŽã¯ 2 ç®æã ã: ã«å®çŸ©ã远å + ã§ã³ã³ãã³ããæž¡ããã¹ã¿ãŒãã¡ãã¥ãŒã®é
ç®ãåæç¶æ
ãzIndex èšç®ãã¬ã¹ãã³ã·ãã¯ã©ã¹ã¯å
šéšã¬ãžã¹ããªããèªåçæãããããããã ãè§Šãã°OKãã培åºããã èŠãç®ãšç¶æ
ã®åé¢
RetroWindow ã¯ ã®æŠå¿µãç¥ããªããæž¡ããã propsïŒtitle, color, zIndex, onCloseïŒã§æç»ããã ããDesktop ããéããŠãªããã° render ããªããã倿ããŠãã®ã§ãRetroWindow ã¯æ±çšçãªãŠã£ã³ããŠæ ãšããŠä»ã®å Žæã§ã䜿ãåããã zIndex ã®ã€ã³ã¯ãªã¡ã³ãæ¹åŒ
ãŠã£ã³ããŠã®ååŸé¢ä¿ã ã®ã«ãŠã³ã¿1ã€ã§ç®¡çãã¿ãã/ã¯ãªãã¯ã®ãã³ã« +1 ããŠãè§Šã£ããŠã£ã³ããŠãå¿
ãæåé¢ã«æ¥ããOS ã®ãŠã£ã³ããŠãããŒãžã£ãŒãšåãã¢ã«ãŽãªãºã ã§ãäœåãŠã£ã³ããŠããã£ãŠãç Žç¶»ããªããçè«äžã¯æŽæ°ããªãŒããŒãããŒãããŸã§å€§äžå€«ïŒçŸå®çã«ã¯åé¡ã«ãªããªãïŒã Pointer Events ã®æ¡çš
ããªãããã: https://developer.mozilla.org/ja/docs/Web/CSS/Reference/Properties/pointer-events ããŠã¹ãšã¿ãããçµ±äžçã«æ±ãã Pointer Events API ã䜿ã£ãŠãã ã§ãã©ãã°äžã®ãã€ã³ã¿ãŒãããã¯ããããšã§ãé«éã«ããŠã¹ãåãããŠãŠã£ã³ããŠå€ã«åºãŠããã©ãã°ãéåããªããTouch Events ãš Mouse Events ãå¥ã
ã«ãã³ãã«ããå¿
èŠããªããªã£ãã ã¢ãã€ã«ã§ã®å²ãåã
ã¢ãã€ã«ã§ã¯ããã¹ã¯ãããã£ãœãããæšãŠãŠå®çšæ§ã«æ¯ã£ããããããããªãã Composition ãã¿ãŒã³
Desktop ã³ã³ããŒãã³ãã¯ãŠã£ã³ããŠã®äžèº«ãäžåç¥ããªãã ã§å€ããæ³šå
¥ããããã€ãŸããŠã£ã³ããŠã·ã¹ãã ãšã³ã³ãã³ããå®å
šã«ç¬ç«ããŠãŠã ã§ã©ããããããä»»æã® React ã³ã³ããŒãã³ããè©°ã蟌ããããã¬ãŒã ã¯ãŒã¯ãšã³ã³ãã³ãã®é¢å¿åé¢ã