LogoSEO Jing
  • All Posts
  • SEO Jing
  • KD Team
  • CLab CoreTeam
  • Study

Contact Me

© 2026 SEOJing. All rights reserved.

DevLogSEO JingInsight

MDX DOM 트리 파싱하기

2026년 3월 14일·5분 읽기

전체 흐름

content/*.mdx → [gray-matter로 파싱] → [fs로 스캔] → content-tree.json → [페이지에서 import] → FileExplorer

gray-matter

packages/utils에 설치했고, MDX 파일 상단의 frontmatter(YAML 메타데이터)를 파싱하는 데 사용한다.

yaml
---
title: React 시작하기
date: "2025-03-05"
tags: [react, frontend]
description: React의 기본...
---
  • MDX/마크다운 frontmatter 파싱의 사실상 표준 (Next.js 공식 예제에서도 사용)
  • 파일 내용 전체를 읽어서 { data, content }로 분리해줌
  • YAML/TOML/JSON frontmatter 모두 지원
  • 의존성이 가볍고, 빌드 타임에만 사용

scanContentDir()

content/ 디렉토리를 재귀 스캔해서 트리 구조 JSON을 만드는 함수다.

동작 과정:
  1. fs.readdirSync()로 현재 디렉토리의 엔트리(파일/폴더)를 읽음
  2. 각 엔트리를 순회하면서:
    • 폴더면 → 자기 자신을 재귀 호출해서 children을 채움
    • 파일이면 → 확장자 추출 후, .mdx/.md면 matter(raw)로 frontmatter 파싱
  3. 정렬: 폴더가 먼저, 파일이 나중 (한국어 정렬 localeCompare("ko"))
ts
const raw = fs.readFileSync(fullPath, "utf-8"); // MDX 파일 전체 읽기
const { data } = matter(raw); // frontmatter → JS 객체
// data = { title: "React 시작하기", date: "2025-03-05", tags: [...], ... }

getItemsForPath()

생성된 트리에서 특정 경로의 아이템만 꺼내는 함수다.
targetPath = "/frontend/hooks"
  → segments = ["frontend", "hooks"]
  → tree에서 name === "frontend"인 폴더 찾기 → 그 children으로 이동
  → children에서 name === "hooks"인 폴더 찾기 → 그 children 반환

루트(/)면 tree 자체를 반환하고, 경로가 존재하지 않으면 빈 배열 [] 반환.


빌드 스크립트

tsx(TypeScript executor)로 실행되는 빌드 스크립트로, pnpm dev 또는 pnpm build 전에 자동 실행된다.

json
"generate:content": "tsx scripts/generate-content-tree.ts",
"dev": "pnpm run generate:content && vinext dev",
"build": "pnpm run generate:content && vinext build"
  1. content/ 디렉토리에 scanContentDir() 호출 2. 결과를 src/generated/content-tree.json에 JSON으로 저장 3. 이 JSON은 .gitignore에 포함되어 커밋되지 않음 (매번 빌드 시 생성)

페이지에서 사용

tsx
import contentTree from "../../generated/content-tree.json"; // 정적 import

// 쿼리스트링에서 현재 경로 추출
const currentPath =
  new URLSearchParams(window.location.search).get("path") || "/";

// 해당 경로의 아이템 가져오기
const nodes = getItemsForPath(contentTree, currentPath);

// ContentNode[] → ExplorerItem[] 변환 후 FileExplorer에 전달
const items = toExplorerItems(nodes);

요약

구성 요소위치역할
gray-matterpackages/utils 의존성MDX frontmatter → JS 객체 파싱
scanContentDir()content.tsfs로 디렉토리 재귀 스캔 + frontmatter 파싱 → 트리 생성
getItemsForPath()content.ts트리에서 특정 경로의 아이템만 추출
generate-content-tree.tsscripts/빌드 타임에 JSON 생성

포스트 목록

/SEOJing/devLog/insight
파일 10개, 폴더 0개
엄청난 피드백생각보다 어려웠던 댓글, 완독 로컬스토리지디자인 시스템을 구축할 때 주의할 점폰트는 왜 메인 페이지에서만 적용이 안되고 있었을까?MDX DOM 트리 파싱하기MDX 관련 이슈 노트결국 Node.js 까지 와버렸다전체적인 플로우Storybook으로 디자인 시스템 테스팅하기MDX가 뭘까?
content-tree.jsonsrc/generated/ (자동 생성)정적 JSON, 페이지에서 import