나만의 Markdown 언어를 사용하는 MDX 플러그인 만들기
12300 단어 reactautomationwebdevblog
어떻게?
TL;DR: Intercept Next.js and MDX pipeline, parse our custom syntax and write into supported syntax.
Next.js 및 MDX는 사용자 지정 및 유연성을 염두에 두고 설계 및 생성되었습니다.
결합된 파이프라인은 다음과 같습니다.
수행할 수 있는 작업의 몇 가지 예:
제가 한?
이전에는
blog/
디렉토리의 모든 MDX 페이지가 수동으로 작성된 JSX props와 함께 BlogPost
구성 요소를 가져오고 내보내야 했으며 다음과 같은 단점이 있습니다.blog
디렉토리에 있다는 것은 MDX 페이지가 사용해야 하는 레이아웃을 나타내기에 충분해야 합니다. 가져오기 및 내보내기는 상용구입니다. path
소품을 작성해야 했습니다. 그러나 수동으로 작성한 prop을 작성하지 않아도 파일 위치가 충분해야 합니다. 위의 문제를 해결하기 위해 다음과 같은 개념을 설계했습니다.
path
, slug
및 레이아웃은 파일 위치에서 유추됩니다. 가져오기 및 복제된 소품이 없습니다. import
문과 해당 레이아웃 구성 요소를 포함하는 줄export default
을 동적으로 추가합니다. description
, published time
와 같은 기타 모든 정보는 Github이 제대로 렌더링할 수 있도록 YAML 프론트매터로 작성되었습니다. MDX에서 기사가 어떻게 보이는지
full source code 참조:
---
title: "Switch to Next.js and MDX"
description: ">-"
I switched from plain HTML to using Next.js and MDX to have better ease of
writing and extensibility.
published time: 2020-12-18
---
## The Problem
To prevent myself from procrastinating, I [started my blog dead simple in plain
HTML][start blog].
사용자 정의 플러그인 작성 방법(개념적으로)
full source code 참조:
const path = require("path");
const yaml = require("yaml");
const find = require("unist-util-find");
const Components = {
blog: "BlogPost",
};
const getSubpage = (file) => path.basename(file.dirname);
const getRoute = (file) => {
const sub = getSubpage(file);
const Component = Components[sub];
if (!Component)
return file.fail(
`Subpage '${sub}' is invalid. Valid subpages: ${Object.keys(Components)
.map((it) => `'${it}'`)
.join(", ")}.`
);
const slug = file.stem;
return {
Component,
slug,
path: `${sub}/${slug}`,
};
};
module.exports = () => (tree, file) => {
const frontmatter = find(tree, { type: "yaml" });
const { title, description, "published time": publishedTime } = yaml.parse(
frontmatter.value
);
const { path, Component } = getRoute(file);
const props = `{
path: "${path}",
title: "${title}",
description: "${description}",
publishedTime: new Date("${publishedTime}"),
}`;
tree.children.unshift(
{
type: "import",
value: `import ${Component} from "~components/mdx/${Component}";`,
},
{
type: "export",
default: true,
value: `export default ${Component}(${props});`,
}
);
};
Reference
이 문제에 관하여(나만의 Markdown 언어를 사용하는 MDX 플러그인 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/phuctm97/create-an-mdx-plugin-to-have-my-own-markdown-language-18bn텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)