Next.js App Routerã«ãããè¨è¨ããã¹ããã©ã¯ãã£ã¹ããçè ãªãã«ã¾ã¨ãã¾ããã

Next.js App Routerã«ãããè¨è¨ããã¹ããã©ã¯ãã£ã¹ããçè ãªãã«ã¾ã¨ãã¾ããã
Next.jsÃTypeScriptÃmicroCMSÃMantineUIÃNetlifyã§ããã°ãä½æããã®ã§ã¾ã¨ãã¨ææ³ ã¯ããã« ãã®è¨äºã¯ãã¿ã¤ãã«ã«è¨è¼ã®éãã®æè¡ã¹ã¿ãã¯ã§è¶£å³ã®èç管çç¨ã®ããã°ãä½æããã®ã§ãç°¡åã«ã¾ã¨ãã¨ææ³ãæ¸ãã¦ãããã¨æãã¾ãã å®éã®ããã°ã¯ãã¡ã GitHubãªãã¸ããªã¯ãã¡ãï¼åèã«ãªã£ãæ¹ã¯ðããããã¨ðï¼ ããã°ä½æã®åæ© æ®æ®µæ¥åã§Nextjs(React)ã触ã£ã¦ãããSSRããå¿ è¦ããªãã¢ããªã±ã¼ã·ã§ã³ã¨ãããã¨ãããããã¡ã¤ã«ã«ã¼ãã£ã³ã°ã®æ©è½ããããã触ã£ã¦ããªãã£ããããSSGãSSRã®æ©è½ãã¡ãã£ã¨è§¦ã£ã¦ããããã£ãã®ã¨ãæè¿æµè¡ãã®JAMStackæ§æãmicroCMSãç¨ãã¦çµé¨ãã¦ããããã£ãã¨ãã2ç¹ã主ãªåæ©ã§ãã ãã¨ãå¤ãã¦ããä¼ç¤¾ã§ãã¼ã ãã¼ã¸ãä½ãç´ã話ãããã£ã¦ããã®ã§ãJAMStackæ§æãææ¡ããã
æè¿ã®æµããè¦ã¦ãã¦ã®ææ³æãªã®ã§ãideaã¨ãã¦æ稿ãã¾ããçè ã®ããã¯ã°ã©ã¦ã³ãã¨ãã¦ã¯ãRemixã®åæ¥è¨äºãæ¸ããããApp Routerã®åæ¥è¨äºãæ¸ããããã¦ãã人ã§ãã ãã¦ãçè ã¯2022å¹´ã®ç§ããã社å ã·ã¹ãã ã§ã¯ããã¾ããRemixããããã¯ã·ã§ã³éç¨ãã¦ãã¾ããã¾ããNext.jsã®App Routerã«ã¤ãã¦ãããã©ãã¤ã ã¨ãã¦ã¯Remixã«ã¤ã³ã¹ãã¤ã¢ãããé¨åãå¤ã[1]ãããã§ãé 調ã«ãã£ããã¢ããã§ãã¦ãã¾ãã Remixã¨App Routerã¯ãã«ã¼ãã£ã³ã°ã¨ãã¼ã¿ãã§ãããé«åº¦ã«çµ±åãã¦ãããProgressively Enhanced SPAï¼PESPAï¼ã¨å¼ã°ãããã¨ãããããã§ããPESPAã«ã¤ãã¦ã¯ã次ã®è¨äºã話é¡ã«ãªãã¾ãããã ãã®PESPAã§ããRemixãå®éç¨ããä¸ã§ããã¬ã¼ã ã¯ã¼ã¯ã®æ触ããè¿å¹´è§¦ã£ã¦ãããã®ã¨å¤§ããéã£ã¦ããç¹ããã£
next.config.jsã«output: "export"ã追å ããã°ããã¿ããã (appDir: trueã¯ããã¥ã¡ã³ãããæ¶ãã¦ãããã©ãä¸è¦ã«ãªã£ãã®ããª) åè¨æ¤åãç¡ãã¨ã¨æããã Error: > The `app` directory is experimental. To enable, add `appDir: true` to your `next.config.js` configuration under `experimental`. See https://nextjs.org/docs/messages/experimental-app-dir-config
import { NextRequest, NextResponse } from 'next/server'; export const config = { matcher: ['/:path*'], }; export function middleware(req: NextRequest) { // éçºæã§ã¯èªè¨¼ãã¹ããã if (process.env.NODE_ENV === 'development') { return NextResponse.next(); } // ç°å¢å¤æ°ãè¨å®ããã¦ããªãå ´åã¯èªè¨¼ãã¹ããã if (!process.env.BASIC_AUTH_PASSWORD) { return NextResponse.next(); } const basicAuth = req.headers.get('authorization'); const
ããã«ã¡ã¯ãããã (@yoshio__25) ã§ãã Webããã³ãã¨ã³ã¸ãã¢ã¯çãããä¸ã®ã¨ã©ã¼ãä¸åº¦ã¯ç®ã«ãããã¨ãããã®ã§ã¯ãªãã§ããããã CORSã¨ã¯ MDN ã«ä»¥ä¸ã®ããã«è¨è¿°ããã¦ãã¾ãã ãªãªã¸ã³éãªã½ã¼ã¹å ±æ (Cross-Origin Resource Sharing, CORS) ã¯ã追å ã® HTTP ãããã¼ã使ç¨ãã¦ããããªãªã¸ã³ã§åä½ãã¦ããã¦ã§ãã¢ããªã±ã¼ã·ã§ã³ã«ãç°ãªããªãªã¸ã³ã«ããé¸æããããªã½ã¼ã¹ã¸ã®ã¢ã¯ã»ã¹æ¨©ãä¸ãããããã©ã¦ã¶ã¼ã«æ示ããããã®ä»çµã¿ã§ãã ã¤ã¾ãä¸ã®ã¨ã©ã¼ã¡ãã»ã¼ã¸ã¯ãç°ãªããªãªã¸ã³ã¸ã®ã¢ã¯ã»ã¹ããããã¨ããã¨ãã«ãã»ãã¥ãªãã£ä¸ã®çç±ãããã®ããªã·ã¼ã«åãã¦ããããããªã¯ã¨ã¹ãããããã¯ããæ¨ãä¼ãã¦ãã¾ãã ãã®ããªã·ã¼ã¯ãã¡ãã製åã®éçºæã«ãé©ç¨ããã¾ãã ã¤ã¾ãéçºç¨ã® localhost ãµã¼ãã¼ãç«ã¦ã¦ãããããéçº
sumirenã§ãã 2023å¹´5æ5æ¥ãã¤ãã«Next.js App Routerãstableã«ãªãã¾ãããï¼ ããã§ã¨ããããã¾ãï¼ï¼ãããã¨ããããã¾ãï¼ï¼ï¼ ä»ããæ¬çªã§ä½¿ãã®ã楽ãã¿ã§å¾ ã¡ããã¾ããã 13.4ã®ãªãªã¼ã¹ã§ã¯stableã®å®£è¨ã¨ã¨ãã«ãç®çæ©è½ã¨ãã¦Server Actionsãæ¥ã¦ãã¾ããData Fetchï¼ã¨ãããããã¯ãData Handlingçãªãã®ï¼ã®æ©è½ã®ä¸é¨ã¨ãã¦ãã¨ã¦ãèå³æ·±ãã§ãã ãã¦ãServer Actionsèªä½ã®è§£èª¬ã¯ä»ã®æ¹ã«ä»»ããã¨ãã¦ããªãªã¼ã¹ãã¼ãã«ã¯ä»¥ä¸ã®ãããªä¸æãããã¾ãã Server Actions in Next.js have been designed for deep integration with the rest of the data lifecycle, including the Next.js
ã¢ããã¼ã·ã§ã³ Next.js v13åºã¾ãããã RFCã§åºã¦ããå 容ãå¤ãã®ã§ãã¢ãããã¼ãå 容ãäºæ¸¬ãã¦ããæ¹ãããã£ãããã¨æãã¾ãããåèªèº«ã¯è©³ããã³ã¼ãããªããããã¨ã¯ãªãã£ãã®ã§ã¿ã¦ãããã¨æãã¾ã ããã㨠Turbopack New Next.js Router ãããªãã㨠next/image @next/font next/link Turbopackï¼Î±ï¼ Turbopackã¨ã¯ï¼ Rustã§ä½ãããJavaScript/TypeScriptã®ãã³ãã©ã¼ å§åçãªãã«ãã¹ãã¼ãã¨ãã£ãã·ã¥æ©æ§ã売ã
ä»äºã§Next.jsã«CSSãã¬ã¼ã ã¯ã¼ã¯ã®Tailwindãå°å ¥ããã®ã§ãããã®ããæ¹ãã¾ã¨ãã¦ãã¾ãã ããã±ã¼ã¸ã®ã¤ã³ã¹ãã¼ã« ã¾ãã¯Tailwind CSSãå°å ¥ããããã以ä¸3ã¤ã®ããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ãã¾ãã tailwindcss postcss autoprefixer # npm ã®å ´å $ npm install -D tailwindcss@latest postcss@latest autoprefixer@latest # yarn ã®å ´å $ yarn add -D tailwindcss postcss autoprefixer postcss-nested
import Footer from '@/components/Footer'; import Header from '@/components/Header'; import { ReactNode } from 'react'; import '@/styles/globals.css'; export default async function Layout({ children }: { children: ReactNode }) { return ( <> <Header /> <div className="container">{children}</div> <Footer /> </> ); } ãã㯠app/layout.tsx ãªã®ã§ãä½ãããªããã°å ¨ãã¼ã¸ã§ä½¿ãããã¬ã¤ã¢ã¦ãã§ããã v13.4.4ç¾å¨ããã¼ã«ã«ã§ã¯è¡¨ç¤ºã§ãããããã«ããéã£ã¦ãã¾ãã ã
Next.js v13 ã¸ã®ç§»è¡ã§ãã£ããã¨ã¾ã¨ã æºå åºç¤ã¨ãªãè¨äºã«ç®ãéãã -> https://zenn.dev/link/comments/eefa4975aaedaf ãã¤ã°ã¬ã¼ã·ã§ã³ã¬ã¤ããè¦ã¦ä¸ã¤ãã¤å¯¾å¿ãããããªã¨æã£ããã©ãè¨äºãé·ãã®ã§next devã§åããã¦åºã¦ããã¨ã©ã¼ãæ½°ãã¦ããæ¹æ³ã«ãããã¨ãããããã«ãã§ããããã«ãªã£ãããè¦è½ã¨ããããè¯ãããæ¹ãããã確èªããããã«èªãã ãã¼ã¸ã³ã³ãã¼ãã³ãã«å¯¾ã㦠pages ã«ãããã¡ã¤ã«ã app ãã£ã¬ã¯ããªã«ç§»åããã è¦ç´ éãã« page 㨠layout ã«ã³ã³ãã¼ãã³ããåå²ãã getServerSideProps ã®å¦çãasync function getData() ã«å¤æ´ãã ã³ã³ãã¼ãã³ãã async é¢æ°ã«ãã props ã§ã¯ãªãã³ã³ãã¼ãã³ãã®ä¸ã§getData()ã®è¿ãå¤ã
Server Componentã¨useãã㯠Next.js 13ã«ããã¦ãã³ã³ãã¼ãã³ãã¯ãµã¼ãã¼å´ã§ã¬ã³ããªã³ã°ããããµã¼ãã¼ã³ã³ãã¼ãã³ããããã¡ã¯ãã«ãªãã¾ããã ä¸æ¹ã å æ¥Reactã«è¿½å ãããuseããã¯ã¯ãåã¬ã³ããªã³ã°ãèµ°ããªããµã¼ãã¼ã³ã³ãã¼ãã³ãã§ã¯ç¹ã«æèããã«å©ç¨ããäºãåºæ¥ã¾ãã import { use } from 'react' async function getTodoList() { // https://jsonplaceholder.typicode.com/ const response = await fetch('https://jsonplaceholder.typicode.com/todos'); const result = await response.json(); return result; } export defaul
Next.js 13 App Router ã® cache å¨ããç解ãããè¨äºã·ãªã¼ãºã§ãã Automatic fetch() Request Deduping revalidate â ãã®è¨äº fetchCache (å¾æ¥å ¬é) Incremental Static Regeneration / ISR Next.js ã§ã¯ããã¨ãã¨ã¬ã³ããªã³ã°æ¹æ³ã®ã²ã¨ã¤ã¨ãã¦ãIncremental Static Regeneration = ISR ãå©ç¨å¯è½ã§ããã éçãªãã¼ã¸çæãåæã¨ããªããããä¸å®ééãè¶ ããæç¹ã§ãã¼ã¸ãåçæãã¦ãããä»çµã¿ã§ãééã¯ãgetStaticProps ã® revalidate ãªãã·ã§ã³ã§æå®å¯è½ã§ããã export async function getStaticProps() { const res = await fetch("https
ãã®è¨äºã«ã¤ã㦠ãã®è¨äºã¯ãAdvanced Features/Debuggingã®è¨äºãå訳ãããã®ã§ãã è¨äºå ã§ä½¿ç¨ããç»åã¯ãå ¬å¼ããã¥ã¡ã³ãå ã®ç»åãå¼ç¨ãã¦ä½¿ç¨ããã¦ããã ãã¦ããã¾ãã ãããã° ãã®ããã¥ã¡ã³ãã§ã¯ãChrome DevToolsã¾ãã¯VSCode debuggerã使ç¨ãã¦ãã½ã¼ã¹ããããå®å ¨ã«ãµãã¼ãããªãã Next.js ã®ããã³ãã¨ã³ãã¨ããã¯ã¨ã³ãã®ã³ã¼ãããããã°ããæ¹æ³ã«ã¤ãã¦èª¬æãã¾ãã ãã®æ¹æ³ã§ã¯ãã¾ãã¿ã¼ããã«ã§ Next.js ã®ã¢ããªã±ã¼ã·ã§ã³ããããã°ã¢ã¼ãã§èµ·åããããã«ã¤ã³ã¹ãã¯ã¿ï¼Chrome DevTools ã¾ã㯠VS Codeï¼ãæ¥ç¶ããå¿ è¦ãããã¾ãã Next.js ã¢ããªã±ã¼ã·ã§ã³ã®ãããã°ã«å¿ è¦ãªã®ã¯ãNode.js ãããã¬ãå ¬éããã¤ã³ã¹ãã¯ã¿ã¼ã¯ã©ã¤ã¢ã³ããèµ·åãããã¨ã ããªã®ã§ãä»ã«ãæ¹æ³ãããã
ã¯ããã« ã¡ã¼ã«ã¼ç³»ä¼æ¥ã®ã³ã¼ãã¬ã¼ãé¨éã§æ¥åã·ã¹ãã ãä½ã£ã¦ããã¢ã³ã´ã«ã¨ç³ãã¾ãã 趣å³ãPJã§Next.jsã使ã£ã¦ããã®ã§ããããã¥ã¼ããªã¢ã«ãèªãã å¾ã«ãã¨ãããããã£ã¦ã¿ããã®ç²¾ç¥ã§ã4ã¤ã»ã©åããã®ãä½ã£ã¦ãã¾ããã ãã ããã®ä¸ã§ãã£ã¬ã¯ããªæ§æã«ã¤ãã¦ãããããæããããã«ããªãã¾ããã Next.jsã«è§¦ãå§ãã¦ããåå¹´ã»ã©çµéãããã¨ãããã®ã§ããã®ã¿ã¤ãã³ã°ã§ãããããã£ã¬ã¯ããªæ§æã«ã¤ãã¦æ´çãã¦ããããã¨æãã¾ãã ä»ã¾ã§ãã£ã¨ãµã¼ãã¼ãµã¤ãã®ã¨ã³ã¸ãã¢ã ã£ãã®ã§ãééã£ãèªèçãããã¨æãã¾ããåªãããææããã ããã¨å¹¸ãã§ãã å®è£ ãåãã¦ä½ãåé¡ã«ãªã£ããï¼ ä½¿ç¨ãããã¼ã¿ãã¼ã¹ãSaaSãå¤æ´ã«ãªãå¯è½æ§ããã£ãã®ã§ãå¤é¨ã¸ã¢ã¯ã»ã¹ããã³ã¼ãã¯libãã©ã«ãã«ã¾ã¨ããããã«ãããã¨èãã¦å®è£ ãã¯ããã¾ããã ï¼Next.jsã®ãã¥ã¼ããªã¢ã«ã®ã³ã¼ãã«ã
Next.js ã« Prisma ORM ãå°å ¥ããæ¹æ³ã«ã¤ãã¦è§£èª¬ãã¾ãã Next.js ããã¸ã§ã¯ãã®éå½¢ãä½æ $ mkdir hello-next-app && cd hello-next-app $ npm init -y $ npm install next react react-dom --save $ npm install typescript @types/node @types/react --save-dev $ code src/index.tsx
ã¯ããã« GWã«å ¥ãã5æ¥é£ç¶ã®Vercelã«ããæ°æ©è½ã®çºè¡¨ãå§ã¾ãã¾ãããæ©éåæ¥(2023 5/1)ããããã¾ããæ©è½ã®çºè¡¨ãããã¾ããã åæ¥ã«çºè¡¨ãããã®ã¯ã以ä¸ã®ä¸ã¤ã®Storageãµã¼ãã¹ã§ãã Vercel Postgres Vercel KV Vercel Blob ä»åã¯ãã®ä¸ã®Vercel Postgresãå®éã«ä½¿ããªãããClientããServerã¾ã§ç¶²ç¾ ãããã£ã¡ãç°¡æçãªãã«ã¹ã¿ãã¯ãªã¢ããªã±ã¼ã·ã§ã³ããå®ç¨æ§ã®å´é¢ãå å³ãã¦Prisma + Next.jsã§ä½ã£ã¦ãããã¨æãã¾ãã
ã¯ããã« å æ¥ã3ã¤ã® Storage ãµã¼ãã¹ãå ¬éããã¾ããð Vercel KV Vercel Postgres Vercel Blob ãã®ä¸ã§ãå人çã«æ°ã«ãªã£ã Vercel Postgres ã試ãã¦ã¿ããã¨æãã¾ãã ç°å¢æ§ç¯ Vercel Postgres ã試ãããã®ãã³ãã¬ã¼ããããã¤ãç¨æããã¦ãã¾ããï¼ããããã...ï¼ Vercel Postgres Next.js Starter Vercel Postgres + Kysely Next.js Starter Vercel Postgres + Prisma Next.js Starter ä¸è¨ã¯å ¨ã¦ Next.js ç¨ã®ãã³ãã¬ã¼ãã§ãããä»ã«ã SveltekitãNuxt ç¨ã®ãã³ãã¬ã¼ããç¨æããã¦ãã¾ããä»å㯠Prisma ã使ãããã£ãã®ã§ã Vercel Postgres + Prisma
主ãªä½¿ç¨ãµã¼ãã¹/ã©ã¤ãã©ãªã¯ä»¥ä¸ã§ãã Next.js â¦ã¢ããªã±ã¼ã·ã§ã³ã®ãã¬ã¼ã ã¯ã¼ã¯ Vercel â¦ãããã¤å PlanetScale â¦ãµã¼ãã¼ã¬ã¹DB(MySQL)ãORMã«ã¯Prismaãä½¿ç¨ Upstash â¦ãµã¼ãã¼ã¬ã¹ã§Redisã使ããã㤠Cloudflare R2 â¦ç»åã®ã¢ãããã¼ãå Open AI API ããã«è½ã¡çãã¾ã§ã«ç´ä½æ²æãã£ãã®ã§ãå°ã詳ãã説æãã¦ããã¾ãã Next.js on Vercel å©ç¨ãã¦ãããã¬ã¼ã ã¯ã¼ã¯ã¯Next.jsã§ããã¯ã©ã¤ã¢ã³ãããã®ãã¼ã¿ã®åå¾ã»æ´æ°ãªã¯ã¨ã¹ãã¯API Routesããåãä»ããããã«ãã¦ãã¾ãã ã¢ããªã±ã¼ã·ã§ã³ã®ãããã¤å ã¯Vercelã«ãã¾ãããæåã¯Next.js on Cloudflare Workersããããã¨ããã®ã§ãããè¾ãé¨åãå¤ãã¦æ念ãã¾ããã ä½è«ï¼ãªãNext.jsãC
Supabaseãã©ãã§ç¥ã£ããï¼ VercelåããNext.jsã§DB使ãããã£ã Vercelã®ã¤ã³ãã°ã¬ã¼ã·ã§ã³ãªã¹ããè¦ã¦ããããSupabaseãè¦ã¤ãã ããã§ç¥ã£ãã Supabaseã¨ã¯ã©ããªãã®ï¼ PostgreSQLã®BaaS ãªã¼ãã³ã½ã¼ã¹ ãªã¼ãã³ã½ã¼ã¹ã ãã©ããã¼ã¸ããã¹ãã£ã³ã°ãµã¼ãã¹ããã ç¡æã®ãã¹ãã£ã³ã°ãã©ã³ããã ãã¼ã¿ãã¼ã¹ã«å¯¾å¿ããREST APIãã¯ããã¦ããã ãªã¼ãã³ã½ã¼ã¹ã®PostgRESTã使ã£ã¦ãã Firebaseã®ãããªãªã¢ã«ã¿ã¤ã è¦ç´ ãããã£ã½ã ãã¡ã¤ã«ãä¿åããã¹ãã¬ã¼ã¸æ©è½ãããã£ã½ã Firebaseã®ä»£æ¿ã¨è¬³ãããFirebaseã¯NoSQLã§ãSupabaseã¯RDBãªã®ã§ãã¯ã³ã¿ããã§ç½®ãæãã§ãã代ç©ã§ã¯ãªã ç°¡æçãªèªè¨¼ã»èªå¯ã®ä»çµã¿ãåãã£ã¦ãã ãµã¤ã³ã¢ãããã¡ã¼ã«ã¢ãã¬ã¹ç¢ºèªããã°ã¤ã³ããã°ã¢ã¦ãããã¹ã¯
ãªãªã¼ã¹ãé害æ å ±ãªã©ã®ãµã¼ãã¹ã®ãç¥ãã
ææ°ã®äººæ°ã¨ã³ããªã¼ã®é ä¿¡
å¦çãå®è¡ä¸ã§ã
j次ã®ããã¯ãã¼ã¯
kåã®ããã¯ãã¼ã¯
lãã¨ã§èªã
eã³ã¡ã³ãä¸è¦§ãéã
oãã¼ã¸ãéã
{{#tags}}- {{label}}
{{/tags}}