Hasura 테이블 이벤트를 사용하여 주문형 Next.js 페이지(ISR) 재생성
9857 단어 javascriptnextjsgraphql
Next.js 12.1의 새로운 기능은 Incremental Static Regeneration이며 이를 통해 필요에 따라 페이지를 만들고 업데이트할 수 있습니다. 이를 Hasura 테이블 이벤트와 페어링하여 웹 페이지를 항상 최신 상태로 유지하고 데이터가 변경될 때만 다시 빌드할 수 있습니다.
이를 확인하기 위해 예제 블로그 앱을 설정해 보겠습니다.
설정 하수라
1. Download the Hasura Docker Compose file.
2. Docker Compose graphql-engine 환경 변수 섹션에서 추가
SECRET_TOKEN: <a random string you come up with>
3. Start Hasura and launch the console.
4. 데이터 탭에서 다음 열이 있는 새 테이블
post
을 생성합니다.id
자주 사용되는 열의 UUIDtitle
텍스트 입력 content
텍스트 입력 5. API 탭에서 GraphQL 쿼리를 구성합니다.
{
post {
content
id
title
}
}
Next.js 설정
1. 예시 Typescript Next.js 앱을 생성합니다
npx create-next-app@latest --ts
.2. graphql-request을 사용하여 Hasura를 쿼리합니다.
npm install graphql-request graphql
로 설치3.
index.tsx
에서 getStaticProps 데이터 가져오기를 설정합니다. import { request, gql } from "graphql-request";
interface Props {
posts: {
id: string;
title: string;
content: string;
}[];
}
const query = gql`
{
post {
content
id
title
}
}
`;
export async function getStaticProps() {
const { post: posts } = await request(
"http://localhost:8080/v1/graphql",
query
);
return {
props: {
posts,
},
};
}
4. 마지막으로 블로그 게시물을 표시합니다.
const Home: NextPage<Props> = ({ posts }) => {
return (
<main>
{posts.map((post) => (
<article key={post.id}>
<h2>{post.title}</h2>
<p>{post.content}</p>
</article>
))}
</main>
);
};
export default Home;
증분 정적 재생성 설정
프로덕션 모드에서 Next.js를 실행할 때 Hasura에 새 블로그 게시물을 추가하면 Next.js는 이에 대해 알 수 있는 방법이 없습니다. 과거에는 증분 정적 재생성 전에는 revalidate time 을 설정해야 했습니다. 여기서 새 항목이 없더라도 x 시간마다 페이지를 다시 빌드해야 했습니다.
이제 데이터가 변경될 때 특정 페이지를 다시 빌드하도록 Next.js에 지시할 수 있는 웹후크를 설정할 수 있습니다! Following the Next.js on-demand revalidation guide:
1. Docker Compose를 설정할 때
SECRET_TOKEN
를 생각해 냈고 이를 Next.js와 통신하기 위한 암호로 사용합니다. .env.local 파일 생성```env
SECRET_TOKEN=<Same as what you set in Docker Compose>
```
2. 재검증 API 경로를 생성합니다. 공식 예제와 유일한 차이점은 쿼리 변수 대신 헤더에서 비밀 토큰을 찾는 것입니다.
```typescript
// pages/api/revalidate.ts
// From Next.js docs https://nextjs.org/docs/basic-features/data-fetching/incremental-static-regeneration#using-on-demand-revalidation
import type { NextApiRequest, NextApiResponse } from "next";
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
// Check for secret to confirm this is a valid request
if (req.headers.secret !== process.env.SECRET_TOKEN) {
return res.status(401).json({ message: "Invalid token" });
}
try {
await res.unstable_revalidate("/");
return res.json({ revalidated: true });
} catch (err) {
// If there was an error, Next.js will continue
// to show the last successfully generated page
return res.status(500).send("Error revalidating");
}
}
```
3. Hasura 콘솔 이벤트 탭으로 돌아가서 이벤트 트리거를 생성합니다.
http://host.docker.internal/api/revalidate
여야 합니다.SECRET_TOKEN
환경 변수4. 이벤트 트리거를 저장하고 run Next.js in production mode
```bash
npm run build
npm run start
```
이제 Hasura에 게시물을 추가하고 Next.js 앱을 새로고침하면 업데이트된 데이터를 볼 수 있습니다!
소스 코드
Available on Github: https://github.com/hasura/graphql-engine/tree/master/community/sample-apps/nextjs-incremental-
static-regeneration
The article was originally published on the Hasura blog - Regenerate Next.js Pages On-demand (ISR) with Hasura Table Events.
Reference
이 문제에 관하여(Hasura 테이블 이벤트를 사용하여 주문형 Next.js 페이지(ISR) 재생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/hasurahq/regenerate-nextjs-pages-on-demand-isr-with-hasura-table-events-jl0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)