처음 간트차트를 구현할 때 다른 라이브러리들 처럼 상단에 import를 해서 useEffect 내에서 초기화 후 렌더링하는 방식으로 로직을 짰다.
const GanttChart: React.FC = () => {
const ganttContainer = useRef<HTMLDivElement>(null);
useEffect(() => {
// Gantt 초기화
if (ganttContainer.current) {
...
gantt.init(ganttContainer.current);
return () => {
gantt.clearAll();
};
}
}, []);
return (
<div>
<div ref={ganttContainer} style={{width: "100%", height: "400px"}} />
로컬에서는 문제가 없었는데 빌드를 하니 다음과 같은 에러가 발생하였다.
해당 프로젝트는 Next
프레임워크를 사용하고 있다.
dhtmlx-gantt는 DOM을 직접 조작하는 라이브러리이고 Next는 서버사이드 렌더링(SSR)을 수행하므로 DOM이 없는 서버에서 dhtmlx-gantt를 실행하려고 했던 것이 원인이었다.
1️⃣ useEffect
와 typeof window
를 사용하여 클라이언트 환경에서만 실행되도록 한다.
2️⃣ Next는 import 구문을 SSR 단계에서 처리하므로 클라이언트 환경에서 동적으로 로드하기 위해 required
를 사용한다.
최종 코드
import React, { useEffect, useRef } from "react";
import "dhtmlx-gantt/codebase/dhtmlxgantt.css";
const GanttChart: React.FC = () => {
const ganttContainer = useRef<HTMLDivElement>(null);
useEffect(() => {
if (typeof window !== "undefined" && ganttContainer.current) {
const gantt = require("dhtmlx-gantt");
if (ganttContainer.current) {
gantt.init(ganttContainer.current);
gantt.parse({
data: [
{ id: 1, text: "Task #1", start_date: "01-04-2023", duration: 5, progress: 0.6 },
{ id: 2, text: "Task #2", start_date: "06-04-2023", duration: 3, progress: 0.4, parent: 1 },
],
});
}
}
}, []);
return <div ref={ganttContainer} style={{ width: "100%", height: "400px" }} />;
};
export default GanttChart;
수정 후 다시 시도하니 빌드가 자알 된다!😊