vercel.com 배포 연습 페이지
1. 노션 데이터로 정적 사이트 생성(SSG)이 가능할까?
1. 파일구조 프로토타입
JavaScript
복사
/poc-prototype
│
├── /src
│ ├── /app
│ │ ├── /api
│ │ │ └── /deploy
│ │ │ └── route.js # 생성한 웹사이트 Vercel로 배포하는 api
│ │ │ └── /notion
│ │ │ └── [...slug] # Notion API를 사용한 데이터 fetch
│ │ │ └── route.js # Notion API를 사용한 데이터 fetch해서 웹사이트 생성하는 api
│ │ ├── /layout.js # 메인 레이아웃
│ │ └── /page.js # 메인 페이지
│ ├── /components
│ │ ├── NotionPageRenderer.js # react-notion-x를 이용해 Notion 페이지 렌더링
│ │ └── LoginButton.js # 로그인 버튼 컴포넌트
│ │
│ └── /lib
│ └── notion.js # Notion API를 통한 데이터 fetch 로직
│
└── package.json
2. react-notion-x 라이브러리로 Notion 페이지 렌더링
노션 원본
react-notion-x 라이브러리로 렌더링한 노션 페이지
미구현 항목
칸반보드(노션 데이터베이스)
코드블럭(기본 코드블럭은 가능한데 머메이드 등 특정 언어는 불가능)
하위페이지(링크는 있지만 로컬호스트를 사용해서 그런지 클릭하면 404에러 발생)
react-notion-x는 어느정도 react로 노션 컨텐츠를 가져오게 도와주는 라이브러리
노션 데이터 가져오기
JavaScript
복사
import { NotionAPI } from 'notion-client'
const notionClient = new NotionAPI()
const recordMap = await notionClient.getPage('가져올 노션 url') // https://repeated-lycra-c2c.notion.site/POC-1059d270074a80cd8d66f098fbe5b5bf?pvs=4 을 가져온다면, 1059d270074a80cd8d66f098fbe5b5bf를 입력
const response = NextResponse.json({ recordMap });
return response;
가져올 노션 url
https://repeated-lycra-c2c.notion.site/POC-1059d270074a80cd8d66f098fbe5b5bf?pvs=4 의 구조
https://repeated-lycra-c2c.notion.site/ : 개인도메인 + 노션 도메인
/POC-1059d270074a80cd8d66f098fbe5b5bf 해당 페이지의 url, 제목이 영어로 구성되어 있으면 앞에 POC- 등과 같이 붙고, 정확히는 뒷부분이 주소 (POC-1059d270074a80cd8d66f098fbe5b5bf 로 주소를 넣어도, 1059d270074a80cd8d66f098fbe5b5bf로 주소를 넣어도 동일한 페이지로 인식)
1059d270074a80cd8d66f098fbe5b5bf 구성은 UUID로 되어있음 ( 8자리-4자리-4자리-4자리-나머지 형식)
?pvs=4 기록변경에 대한 버전관리(4번의 변경기록이 있는 페이지)
JavaScript
복사
import * as React from 'react'
import { NotionRenderer } from 'react-notion-x'
export default ({ recordMap }) => (
<NotionRenderer recordMap={recordMap} fullPage={true} darkMode={false} />
)
React로 렌더링
2. 생성한 페이지를 url만으로 배포하는게 가능할까?
배포는 가능했지만, 렌더링에 대한 부분은 더 알아봐야 함
JavaScript
복사
const recordMap = await notion.getPage(pageId);
const htmlContent = `
<html>
<head>
<title>Notion Page - ${pageId}</title>
<style>
body { font-family: Arial, sans-serif; }
</style>
</head>
<body>
<h1>Notion Page ID: ${pageId}</h1>
<p>This is a deployed version of your Notion page.</p>
<pre>${JSON.stringify(recordMap, null, 2)}</pre>
</body>
</html>
`;
const vercelResponse = await fetch('https://api.vercel.com/v13/deployments', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VERCEL_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'notion-page-test',
files: [
{
file: 'index.html',
data: htmlContent,
},
],
target: 'production',
projectSettings: {
devCommand: '',
installCommand: '',
buildCommand: '',
outputDirectory: '',
rootDirectory: '',
},
}),
});
서버사이드에서 노션을 렌더링하는 기능을 가진 라이브러리는 없는 것 같음
puppeteer로 snapshot을 찍는 방식으로 가져오는건 가능함
3. 일부분 배포 시 입력 에디터
tiptap 에디터는 노션과 입력하는 방식이 동일 →
참고 url
4. 순수 Notion API만 이용해서 렌더하는 경우
<NotionPageRenderer />
JavaScript
복사
/<div[^>]*data-block-id[^>]*>.*?<\/div>/g
^ → 입력시작
→
g → global(문자열 내의 모든 패턴 검색)
5. Partial deploy 사고 흐름
플로우차트
url 입력
puppeteer로 notion 데이터 가져옴
모든 블록옆에 선택/삭제버튼 제공
사용자가 선택한 블록들만 남긴 데이터 저장
커스터마이징된 데이터만 빈 노션페이지로 puppeteer사용해서 불러와 삽입 후 스냅샷 찍어서 배포
vercel에 스냅샷 배포 및 서브도메인 설정
전체배포시 노션 데이터 블럭 콘솔창 확인
부분배포시 노션 데이터 블럭 콘솔창 확인