구문 강조(syntax highlighting)
Prism.js
- 매우 가볍고 빠름
- CSS 테마 다양 (GitHub, Dark, Solarized 등)
- React, Vue, Markdown 등과 잘 통합됨
- C#, JS, JSX, HTML, CSS 등 모두 지원
- 플러그인 시스템으로 줄번호, 코드 복사 버튼 등 쉽게 확장 가능
<link href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/prismjs/prism.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-csharp.min.js"></script>
<pre><code class="language-csharp">Console.WriteLine("Hello World");</code></pre>
React용 Wrapper
- react-syntax-highlighter (Prism 기반 테마 지원)
- prism-react-renderer (깔끔하고 커스터마이즈 쉬움)
react-syntax-highlihter
npm install react-syntax-highlighter@^15.5.0
- react-syntax-highlighter 설치 (안정적인 15.5.0 버전)
- 15 버전은 refractor(의존성 라이브러리) v3를 자동으로 설치함
- install 명령어는 프로젝트의 루트 폴더에서 실행해야 합니다
코드 예시
import React from "react";
import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
import { atomOneDark } from "react-syntax-highlighter/dist/esm/styles/prism";
export default function CodeBlock() {
const codeString =
`
using System;
class Hello {
static void Main() {
Console.WriteLine("Hello World");
}
}
`;
return (
<SyntaxHighlighter language="csharp" style={atomOneDark} showLineNumbers>
{codeString}
</SyntaxHighlighter>
);
}
코드 설명
- Prism as SyntaxHighlighter → Prism.js 엔진 기반으로 사용
- style={atomOneDark} → Prism 테마 적용
- language=”csharp” → 코드 언어 지정
- showLineNumbers → 줄 번호 표시 옵션
사용 가능한 Prism 테마 목록
| 테마 이름 | 비고 |
|---|---|
atomDark |
GitHub Dark 스타일 (v15에서 atomOneDark -> atomDark로 변경) |
vscDarkPlus |
VSCode Dark+ 스타일 |
dracula |
어두운 보라톤 테마 |
solarizedlight |
밝은 톤 테마 |
okaidia |
기본 Prism 테마 중 하나 |
tomorrow |
깔끔하고 중립적인 다크 테마 |
coy |
밝고 대비가 강한 테마 |
twilight |
부드러운 다크 모드 테마 |
funky |
색감이 화려한 실험적 테마 |
a11yDark |
접근성(A11Y)을 고려한 다크 테마 |
사용 예시
import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
import { atomDark } from "react-syntax-highlighter/dist/esm/styles/prism";
import { vscDarkPlus } from "react-syntax-highlighter/dist/esm/styles/prism"; //VSCode 스타일
import { solarizedlight } from "react-syntax-highlighter/dist/esm/styles/prism"; //밝은 테마
import { dracula } from "react-syntax-highlighter/dist/esm/styles/prism"; //드라큘라 테마
// 언어별 import
import { javascript } from "react-syntax-highlighter/dist/esm/languages/prism";
import { jsx } from "react-syntax-highlighter/dist/esm/languages/prism";
import { html } from "react-syntax-highlighter/dist/esm/languages/prism";
import { css } from "react-syntax-highlighter/dist/esm/languages/prism";
// 언어 등록
SyntaxHighlighter.registerLanguage("javascript", javascript);
SyntaxHighlighter.registerLanguage("jsx", jsx);
SyntaxHighlighter.registerLanguage("html", html);
SyntaxHighlighter.registerLanguage("css", css);
<SyntaxHighlighter language="javascript" style={atomOneDark}>
{`const hello = "world";`}
</SyntaxHighlighter>
적용된 최종 소스 코드 (참고용)
import { useState } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
import './App.css'
//import { Routes, Route, Link } from 'react-router-dom'; // 라우터 관련 컴포넌트 임포트
import { Routes, Route, Link } from 'react-router-dom';
import Resume from './Resume.jsx';
import Portfolio from './Portfolio.jsx';
import About from './About.jsx';
import DdayCounter from './DdayCounter.jsx';
import { PrismLight as SyntaxHighlighter } from "react-syntax-highlighter";
import { csharp } from "react-syntax-highlighter/dist/esm/languages/prism";
import { atomDark } from "react-syntax-highlighter/dist/esm/styles/prism";
SyntaxHighlighter.registerLanguage("csharp", csharp);
function App() {
const [count, setCount] = useState(0)
const codeString =
`
using System;
class Hello {
static void Main() {
Console.WriteLine("Hello World");
}
}
`;
return (
<>
<header>
<DdayCounter />
</header>
<nav>
<Link to="/resume">이력</Link> | {" "}
<Link to="/portfolio">포트폴리오</Link> | {" "}
<Link to="/about">자기소개</Link>
</nav>
<div className="main-content">
<Routes>
<Route path="/resume" element={<Resume />} />
<Route path="/portfolio" element={<Portfolio />} />
<Route path="/about" element={<About />} />
</Routes>
</div>
<SyntaxHighlighter language="csharp" style={atomDark} showLineNumbers>
{codeString}
</SyntaxHighlighter>
</>
)
}
export default App
- 전체 복붙 하여 사용하지 마세요. 어떤 부분이 달랐는지 비교용 입니다.
