From 562ba00912a609916bce4bd132c9860ed3b099f5 Mon Sep 17 00:00:00 2001 From: DefectingCat Date: Thu, 18 Aug 2022 15:19:25 +0800 Subject: [PATCH] Add next-mdx-remote --- assets/sandpack/hello-world/main.js | 5 ++ components/mdx/components.ts | 9 +++ data/mdxData.ts | 9 +++ .../posts}/create-a-mini-router-for-react.mdx | 0 ...mponent-encapsulate-reusable-component.mdx | 0 data/posts/hello-world.mdx | 22 ++++++ .../how-to-load-a-background-with-threejs.mdx | 0 .../posts}/my-develop-environmental.mdx | 0 .../setting-up-docsearch-for-nextjs.mdx | 0 lib/posts.ts | 35 +++++++-- package.json | 1 + pages/_app.tsx | 6 +- pages/p/[slug].tsx | 74 ++++++++++++++++++ pages/p/hello-world.mdx | 43 ---------- {assets => public}/images/favicon.ico | Bin {assets => public}/images/favicon.webp | Bin {assets => public}/images/img/64.ai | 0 {assets => public}/images/img/64.png | Bin {assets => public}/images/img/64.svg | 0 .../images/img/Sensei_dark.webp | Bin .../images/img/Sensei_sakura.webp | Bin {assets => public}/images/img/about.webp | Bin .../images/img/apple-touch-icon.webp | Bin {assets => public}/images/img/avatar.ai | 0 {assets => public}/images/img/avatar.svg | 0 {assets => public}/images/img/avatar_b.webp | Bin {assets => public}/images/img/avatar_b2.webp | Bin {assets => public}/images/img/backup.webp | Bin {assets => public}/images/img/category.webp | Bin .../images/img/comment-line-dark.svg | 0 .../images/img/comment-line.svg | 0 {assets => public}/images/img/default.webp | Bin {assets => public}/images/img/favicon.webp | Bin {assets => public}/images/img/friend.webp | Bin {assets => public}/images/img/index.webp | Bin {assets => public}/images/img/loading.gif | Bin .../images/img/mona-loading-default.gif | Bin .../images/img/mona-loading-dimmed.gif | Bin {assets => public}/images/img/mona.webp | Bin .../images/img/placeholder-1200x1000.webp | Bin .../images/img/placeholder-600x500.webp | Bin .../images/img/police_beian.webp | Bin {assets => public}/images/img/post.webp | Bin {assets => public}/images/img/qrcode.webp | Bin .../images/img/sparkling-heart.ai | 0 .../images/img/sparkling-heart.png | Bin .../images/img/sparkling-heart.svg | 0 {assets => public}/images/img/tags.webp | Bin yarn.lock | 44 ++++++++++- 49 files changed, 193 insertions(+), 55 deletions(-) create mode 100644 assets/sandpack/hello-world/main.js create mode 100644 components/mdx/components.ts create mode 100644 data/mdxData.ts rename {pages/p => data/posts}/create-a-mini-router-for-react.mdx (100%) rename {pages/p => data/posts}/generic-component-encapsulate-reusable-component.mdx (100%) create mode 100644 data/posts/hello-world.mdx rename {pages/p => data/posts}/how-to-load-a-background-with-threejs.mdx (100%) rename {pages/p => data/posts}/my-develop-environmental.mdx (100%) rename {pages/p => data/posts}/setting-up-docsearch-for-nextjs.mdx (100%) create mode 100644 pages/p/[slug].tsx delete mode 100644 pages/p/hello-world.mdx rename {assets => public}/images/favicon.ico (100%) rename {assets => public}/images/favicon.webp (100%) rename {assets => public}/images/img/64.ai (100%) rename {assets => public}/images/img/64.png (100%) rename {assets => public}/images/img/64.svg (100%) rename {assets => public}/images/img/Sensei_dark.webp (100%) rename {assets => public}/images/img/Sensei_sakura.webp (100%) rename {assets => public}/images/img/about.webp (100%) rename {assets => public}/images/img/apple-touch-icon.webp (100%) rename {assets => public}/images/img/avatar.ai (100%) rename {assets => public}/images/img/avatar.svg (100%) rename {assets => public}/images/img/avatar_b.webp (100%) rename {assets => public}/images/img/avatar_b2.webp (100%) rename {assets => public}/images/img/backup.webp (100%) rename {assets => public}/images/img/category.webp (100%) rename {assets => public}/images/img/comment-line-dark.svg (100%) rename {assets => public}/images/img/comment-line.svg (100%) rename {assets => public}/images/img/default.webp (100%) rename {assets => public}/images/img/favicon.webp (100%) rename {assets => public}/images/img/friend.webp (100%) rename {assets => public}/images/img/index.webp (100%) rename {assets => public}/images/img/loading.gif (100%) rename {assets => public}/images/img/mona-loading-default.gif (100%) rename {assets => public}/images/img/mona-loading-dimmed.gif (100%) rename {assets => public}/images/img/mona.webp (100%) rename {assets => public}/images/img/placeholder-1200x1000.webp (100%) rename {assets => public}/images/img/placeholder-600x500.webp (100%) rename {assets => public}/images/img/police_beian.webp (100%) rename {assets => public}/images/img/post.webp (100%) rename {assets => public}/images/img/qrcode.webp (100%) rename {assets => public}/images/img/sparkling-heart.ai (100%) rename {assets => public}/images/img/sparkling-heart.png (100%) rename {assets => public}/images/img/sparkling-heart.svg (100%) rename {assets => public}/images/img/tags.webp (100%) diff --git a/assets/sandpack/hello-world/main.js b/assets/sandpack/hello-world/main.js new file mode 100644 index 0000000..d9922da --- /dev/null +++ b/assets/sandpack/hello-world/main.js @@ -0,0 +1,5 @@ +const main = `export default function App() { + return

Hello world

+}`; + +export default main; diff --git a/components/mdx/components.ts b/components/mdx/components.ts new file mode 100644 index 0000000..85a4f00 --- /dev/null +++ b/components/mdx/components.ts @@ -0,0 +1,9 @@ +import RUASandpack from 'components/RUA/RUASandpack'; +import Anchor from 'components/mdx/Anchor'; + +const components = { + RUASandpack, + a: Anchor, +}; + +export default components; diff --git a/data/mdxData.ts b/data/mdxData.ts new file mode 100644 index 0000000..872314e --- /dev/null +++ b/data/mdxData.ts @@ -0,0 +1,9 @@ +import main from 'assets/sandpack/hello-world/main'; + +const data = { + sandpack: { + 'hello-world': main, + }, +}; + +export default data; diff --git a/pages/p/create-a-mini-router-for-react.mdx b/data/posts/create-a-mini-router-for-react.mdx similarity index 100% rename from pages/p/create-a-mini-router-for-react.mdx rename to data/posts/create-a-mini-router-for-react.mdx diff --git a/pages/p/generic-component-encapsulate-reusable-component.mdx b/data/posts/generic-component-encapsulate-reusable-component.mdx similarity index 100% rename from pages/p/generic-component-encapsulate-reusable-component.mdx rename to data/posts/generic-component-encapsulate-reusable-component.mdx diff --git a/data/posts/hello-world.mdx b/data/posts/hello-world.mdx new file mode 100644 index 0000000..4e3596b --- /dev/null +++ b/data/posts/hello-world.mdx @@ -0,0 +1,22 @@ +--- +title: Hello world +date: '2022-04-06' +tags: ['Hello world'] +--- + +## Hello + +This is my first post! + +```ts +console.log('Hello world'); +``` + +## Say hello to world + + diff --git a/pages/p/how-to-load-a-background-with-threejs.mdx b/data/posts/how-to-load-a-background-with-threejs.mdx similarity index 100% rename from pages/p/how-to-load-a-background-with-threejs.mdx rename to data/posts/how-to-load-a-background-with-threejs.mdx diff --git a/pages/p/my-develop-environmental.mdx b/data/posts/my-develop-environmental.mdx similarity index 100% rename from pages/p/my-develop-environmental.mdx rename to data/posts/my-develop-environmental.mdx diff --git a/pages/p/setting-up-docsearch-for-nextjs.mdx b/data/posts/setting-up-docsearch-for-nextjs.mdx similarity index 100% rename from pages/p/setting-up-docsearch-for-nextjs.mdx rename to data/posts/setting-up-docsearch-for-nextjs.mdx diff --git a/lib/posts.ts b/lib/posts.ts index 5387ee6..3d4061e 100644 --- a/lib/posts.ts +++ b/lib/posts.ts @@ -1,17 +1,19 @@ -import fs from 'fs'; +import fs from 'fs/promises'; import path from 'path'; import matter from 'gray-matter'; import { MyMatters, Post } from 'types'; import { sortByDate } from 'lib/utils'; +const dataPath = 'data/posts'; + /** * Read post meta info with gray-matter. * @param filename * @returns */ -const readFileMeta = (filename: string) => { - const markdownWithMeta = fs.readFileSync( - path.join('pages/p', filename), +const readFileMeta = async (filename: string) => { + const markdownWithMeta = await fs.readFile( + path.join(dataPath, filename), 'utf-8' ); const slug = filename.replace(/\.mdx$/, ''); @@ -27,8 +29,25 @@ const readFileMeta = (filename: string) => { * @returns */ export const postLists = async (): Promise => { - const files = fs.readdirSync(path.join('pages/p')); - const posts = files.map(readFileMeta).sort(sortByDate); - - return posts; + const files = await fs.readdir(path.join(dataPath)); + return (await Promise.all(files.map(readFileMeta))).sort(sortByDate); +}; + +const readFilePath = async (filename: string) => { + const slug = filename.replace(/\.mdx$/, ''); + return { + params: { + slug, + }, + }; +}; + +export const allPostsPath = async () => { + const files = await fs.readdir(path.join(dataPath)); + return await Promise.all(files.map(readFilePath)); +}; + +export const readSinglePost = async (slug: string) => { + const filename = path.join(`${dataPath}/${slug}.mdx`); + return await fs.readFile(filename, { encoding: 'utf-8' }); }; diff --git a/package.json b/package.json index a26fc1f..de59f69 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "dayjs": "^1.11.4", "next": "12.2.4", "next-compose-plugins": "^2.2.1", + "next-mdx-remote": "^4.1.0", "next-themes": "^0.2.0", "octokit": "^2.0.4", "react": "^18.2.0", diff --git a/pages/_app.tsx b/pages/_app.tsx index a94855e..aa6bce6 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -40,9 +40,9 @@ function MyApp({ Component, pageProps }: AppPropsWithLayout) { enableSystem defaultTheme="system" > - - {getLayout()} - + {/* */} + {getLayout()} + {/* */} {loading && } diff --git a/pages/p/[slug].tsx b/pages/p/[slug].tsx new file mode 100644 index 0000000..32c0593 --- /dev/null +++ b/pages/p/[slug].tsx @@ -0,0 +1,74 @@ +import { allPostsPath, readSinglePost } from 'lib/posts'; +import { GetStaticPaths, GetStaticProps, InferGetStaticPropsType } from 'next'; +import { serialize } from 'next-mdx-remote/serialize'; +import { MDXRemote, MDXRemoteSerializeResult } from 'next-mdx-remote'; +import components from 'components/mdx/components'; +import data from 'data/mdxData'; +import rehypePrism from '@mapbox/rehype-prism'; +import remarkGfm from 'remark-gfm'; +import rehypeSlug from 'rehype-slug'; +import dynamic from 'next/dynamic'; +import { MyMatters } from 'types'; + +const Footer = dynamic(() => import('components/Footer')); +const HeadBar = dynamic(() => import('components/NavBar')); +const PostComment = dynamic(() => import('components/post/PostComment')); + +const Slug = ({ + mdxSource, +}: InferGetStaticPropsType) => { + return ( + <> + + +
+

{mdxSource.frontmatter?.title}

+ + +
+ + +
+
+ +