프로젝트/github.io
[토이프로젝트] 개인 포폴 사이트 - (1) 개발 중
KimCookieYa
2023. 11. 29. 15:45
환경: yarn, vite, react, typescript
노션으로 작성한 포폴을 개인 github.io에서 임베딩을 시도하는 중이다. React에서는 react-notion과 react-notion-x라는 라이브러리를 사용해 노션을 임베딩할 수 있다. 이렇게 1시간 만에 완성하겠거니 싶었는데..
react-notion
import { Suspense } from 'react';
import 'react-notion/src/styles.css';
import 'prismjs/themes/prism-tomorrow.css'; // only needed for code highlighting
export default function ReactNotion() {
const [response, setResponse] = useState({});
useEffect(() => {
const NOTION_PAGE_ID = '노션 페이지 ID';
axios
.get(`https://notion-api.splitbee.io/v1/page/${NOTION_PAGE_ID}`)
.then(({ data }) => {
setResponse(data);
});
}, []);
return (
<Suspense fallback={<p>로딩 중..</p>} >
<NotionRenderer blockMap={response} fullPage={true} />
</ Suspense>
);
}
- 그냥 NotionRenderder 컴포넌트를 렌더링하면 된다.
- 그런데 데이터베이스는 못 가져온다.
- react-notion은 데이터베이스 임베딩을 지원하지 않는다고 한다.
- 결국 데이터베이스를 임베딩하기 위해서는 react-notion-x를 사용해야 한다.
react-notion-x
import { Suspense, useState, useEffect } from 'react';
import 'react-notion-x/src/styles.css';
import 'prismjs/themes/prism-tomorrow.css';
import { NotionRenderer } from 'react-notion-x';
import { NotionAPI } from 'notion-client';
import { ExtendedRecordMap } from 'notion-types/build/maps';
function Portfolio() {
const [response, setResponse] = useState<ExtendedRecordMap | null>(null);
useEffect(() => {
const fetch = async () => {
const NOTION_PAGE_ID = 'Portfolio-b30f8a5319d64d1e933130d680703abd';
const notion = new NotionAPI();
const recordMap = await notion.getPage(NOTION_PAGE_ID);
setResponse(recordMap);
};
fetch();
}, []);
return (
<Suspense fallback={<CustomFallback />}>
{response !== null && <NotionRenderer recordMap={response} fullPage />}
</Suspense>
);
}
export default Portfolio;
Uncaught ReferenceError: process is not defined
at node_modules/@szmarczak/http-timer/dist/source/index.js
- react-notion-x 공식 레포의 방식대로 수행한다.
- 그런데 위 에러가 발생했다.
- @szmarczak/http-timer 라이브러리에서 process.versions.node를 찾지 못하는 에러이다.
- Vite 환경에서는 환경 변수로 process를 인식하지 못해 발생했다.
- react-notion 이슈
솔루션
- Vite에서 process를 등록하기
import react from '@vitejs/plugin-react-swc';
import { defineConfig, loadEnv } from 'vite';
export default defineConfig(({ command, mode }) => {
const env = loadEnv(mode, process.cwd(), '');
return {
define: {
'process.versions.node': JSON.stringify('18.17.1'),
},
plugins: [react()],
};
});
- 솔루션을 따라 vite.config.ts를 위와 같이 고치면 vite가 process.versions.node를 인식한다.
- 그러나 이번에는 dns 라이브러리의 Resolver에서 에러가 발생했다.
Uncaught TypeError: Cannot read properties of undefined (reading 'Resolver')
at node_modules/cacheable-lookup/source/index.js (index.js:7:13)
- 추측컨대 Vite 환경은 react-notion-x와 호환이 되지 않는다고 판단된다.
- 구글링 결과 vite 환경에서 react-notion-x을 사용한 사례는 찾을 수 없었다.
- 그래서 "Vite에서 process를 등록하기"는 포기했다.
- Vite에서 CRA로 migration하기
사실 이게 가장 확실한 방법이다. 많은 사람들이 사용해서 검증된 방식이기도 하고, github.io를 개발해둔 것도 많이 없어서 옮기는 편이 쉬울 수 있다. migration하는 과정은 다음 시간에..