prism-react-renderer를 사용하여 Gatsby MDX에 줄 번호로 구문 강조 표시 추가
prism-react-renderer
가 있는 Gatsby MDX 파일의 줄 번호로 코드 강조 표시를 활성화하는 방법에 대한 단계를 살펴보겠습니다.MDX를 프로젝트에 아직 통합하지 않은 경우(MDX가 훌륭하기 때문에 통합해야 함) Gatsby 설명서official guide에서 프로젝트에 추가할 수 있습니다. 그러나 프로젝트에서 이미 Markdown Remark를 사용하고 있다면 고려하십시오. 이 게시물에서는 PrismJS 구문 강조를
prism-react-renderer
을 사용하여 MDX와 통합할 것입니다. 또한 코드 블록에 줄 번호를 추가할 것입니다. 이것이 우리가 목표로 하는 것입니다:1단계: prism-react-renderer 패키지 설치
시작하려면 PrismJS를 React 구성 요소로 래핑하는
prism-react-renderer
를 설치해야 합니다.npm install prism-react-renderer
.mdx
파일에 분리 코드 블록을 추가하면 gatsby-plugin-mdx
가 코드를 <pre>
요소로 래핑하고 프로그래밍 언어를 나타내는 클래스 이름을 추가합니다. prism-react-renderer
는 이를 사용하여 언어를 식별하고 코드 블록을 강조 표시합니다.2단계: CodeBlock 구성 요소 생성
코드 블록에 줄 번호(선택 사항)가 있는 코드 강조 표시를 추가하는 React 구성 요소를 만들어 봅시다. 먼저
CodeBlock.jsx
에 파일src/components/
을 생성한 후 다음 내용을 추가합니다.// CodeBlock.jsx
import React from 'react'
import Highlight, { defaultProps } from 'prism-react-renderer'
import theme from 'prism-react-renderer/themes/vsDark'
export default function CodeBlock(props) {
const className = props.children.props.className || ''
const matches = className.match(/language-(?<lang>.*)/)
const showLineNumbers = props.children.props.lineNumbers
return (
<Highlight
{...defaultProps}
code={props.children.props.children.trim()}
language={
matches && matches.groups && matches.groups.lang
? matches.groups.lang
: ''
}
theme={theme}
>
{({ className, style, tokens, getLineProps, getTokenProps }) => (
<pre className={className} style={{ ...style, padding: '20px' }}>
{tokens.map((line, i) => (
<div key={i} {...getLineProps({ line, key: i })}>
{showLineNumbers && <span className='line-number'>{i + 1}</span>}
{line.map((token, key) => (
<span key={key} {...getTokenProps({ token, key })} />
))}
</div>
))}
</pre>
)}
</Highlight>
)
}
이 구성 요소는 코드 블록을 강조 표시합니다. 선택적으로
lineNumbers
파일의 코드 블록에 메타 문자열.mdx
을 전달하여 줄 번호를 추가할 수 있습니다. 다른 테마를 원하면 theme
가져오기를 원하는 대로 사용 가능한 theme으로 변경하십시오.3단계: <MDXProvider>에 CodeBlock 구성 요소 추가
<MDXRenderer>
구성 요소(제 경우에는 내 블로그 게시물을 렌더링하는 src/templates/blog-post.js
)를 사용하는 파일로 이동하여 <MDXProvider>
구성 요소로 래핑합니다. 그런 다음 CodeBlock
구성 요소를 components
개체에 추가하고 이를 <MDXProvider>
구성 요소에 전달합니다.// blog-post.js
// ...
import { MDXProvider } from '@mdx-js/react'
import CodeBlock from '/src/components/CodeBlock.jsx'
const components = {
pre: CodeBlock,
}
const BlogPostTemplate = ({ data, location }) => {
const post = data.mdx
//...
return (
//...
<MDXProvider components={components}>
<MDXRenderer>{post.body}</MDXRenderer>
</MDXProvider>
//...
)
}
export default BlogPostTemplate
4단계: 줄 번호 스타일 지정
줄 번호를 올바르게 렌더링하기 위해 일부 스타일을 추가합니다.
style.css
폴더에 파일src
을 만들고 다음 CSS 스타일을 추가합니다. 전역 CSS 파일이 이미 있는 경우 다음 스타일을 추가합니다./* style.css */
.line-number {
text-align: right;
padding-right: 1em;
user-select: none;
opacity: 0.5;
}
이제
gatsby-browser.js
파일에서 방금 만든 파일을 가져옵니다.// gatsby-browser.js
// custom CSS styles
import './src/style.css'
5단계: .mdx 파일에 코드 추가
코드 강조 표시를 테스트하려면
.mdx
파일 중 하나를 열고 일부 코드를 추가하십시오. 줄 번호를 지정하려면 언어 선언 뒤에 메타 문자열lineNumbers
을 전달하면 됩니다. 참고: 공간이 중요합니다.```javascript lineNumbers function add(num1, num2) { const result = num1 + num2 return result } console.log(add(1, 2)) ```
And that's it! Save your files, run gatsby develop
, and go to the pages created from .mdx
files to see your code blocks highlighted and optionally numbered. If something went wrong, let's put on the debugging glasses and get to work.
디버깅 오류
Here're some errors that popped up when I was integrating prism-react-renderer
with MDX.
props.children.props.children.trim은 함수가 아닙니다.
My blog previously used gatsby-remark-prismjs
to highlight code blocks, which conflicted with prism-react-renderer
. So I uninstalled it and removed it from the plugins
array in gatsby-config.js
.
npm remove gatsby-remark-prismjs`
// gatsby-config.js
module.exports = {
plugins: [
//...
{
resolve: `gatsby-plugin-mdx`,
options: {
gatsbyRemarkPlugins: [
- `gatsby-remark-prismjs`,
],
},
}
]
}
코드 블록 스타일이 끔찍해 보입니다.
코드 강조 표시를 처음 추가했을 때 다음과 같이 표시되었습니다.
아, 끔찍해! 무슨 일이야? 이것은 위와 동일한 문제입니다.
gatsby-remark-prismjs
에서 gatsby-browser.js
가 사용하는 기존 CSS 스타일을 제거하는 것을 잊었습니다. 이로 인해 스타일이 충돌하고 위의 혼란이 발생했습니다. 이 문제를 해결하려면 gatsby-browser.js
에서 CSS 가져오기를 제거하기만 하면 됩니다.// gatsby-browser.js
- import "prismjs/themes/prism.css"
결론
버그를 수정하고 모든 것이 제대로 되었다면 축하합니다🎉. 그렇지 않으면 gatsby-plugin-mdx , MDX 및 prism-react-renderer 에 대한 공식 문서를 확인하십시오. 즐거운 코딩하세요!
Reference
이 문제에 관하여(prism-react-renderer를 사용하여 Gatsby MDX에 줄 번호로 구문 강조 표시 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mmz001/adding-syntax-highlighting-with-line-numbers-to-gatsby-mdx-using-prism-react-renderer-1bgk텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)