“我的作品完成了。任凭朱庇特的怒气,任凭刀、火,任凭时光的蚕蚀,都不能毁灭我的作品。时光只能消毁我的肉身,死期愿意来就请它来吧,来终结我这飘摇的寿命。但是我的精萃部分却是不朽的,它将与日月同寿,我的声名也将永不磨灭。罗马的势力征服到哪里,那里我的作品就会被人们诵读。如果诗人的预言不爽,我的声名必将千载流传。” -- 奥维德
介绍
这是一篇使用 Nextjs 制作一个静态博客的记录,稍后会集成第三方工具实现评论功能,如果你感兴趣的话,非常欢迎探讨。
开发基础环境搭建
顺便说一下,使用 VSCode 进行编辑开发。
设置 TypeScript,ESLint 以及 Absolute Imports and Module Path Aliases,具体的方法请阅读 Nextjs 文档的安装部分。
支持 MDX
- 工具包解释与安装:
- @mdx-js/react -用于在运行时将 MDX 内容渲染为 React 组件。
- @next/mdx - 专为 Next.js 提供 MDX 集成工具。简化了在 Next.js 中使用 MDX 的配置过程。内部依赖 @mdx-js/loadevr 来处理 Webpack 的加载。
- @mdx-js/loader - MDX 的 Webpack 加载器,用于在构建时将 .mdx 文件转换为可供 JavaScript 使用的模块。
- @types/mdx - TypeScript 类型声明包,为 MDX 提供类型支持,主要作用是让开发者在使用 MDX 时获得更好的类型提示、错误检测和代码补全功能。(MDX 文件本质上会被编译为 React 组件)
- @next/mdx 配置 - 项目根目录下
next.config.mjs
。(在没有使用 @next/mdx 的项目中,需要手动在 webpack.config.js
中配置 @mdx-js/loader) - 完成这一步之后在 pages router 模式下,
.md
和 .mdx
文件将被正确解析。在 app router 模式下还需要进一步配置。
- app router 模式下,需要在根目录或者
src
(如果使用 src
目录) 下创建 mdx-components.tsx
文件(注意文件名,名字由 nextjs 指定),它用来扩展或覆盖 MDX 组件映射。
- 完成后就可以正确渲染,如
app/test/page.mdx
可以在浏览器中通过 根域名/test
访问(这样显然有些麻烦,我们希望使用一个文件夹统一管理 markdown 文件)
- 前面的三个步骤是完全按照官方文档来的,现在对其进行扩展,比如希望在
/src/contents/
文件中管理所有的 MDX 文件(由于 URL 中文需要额外处理,避免麻烦,contents 内的文件夹和文件禁止使用中文),并且使用动态路由的方式,在浏览器中通过跟域名/blog/*
来访问。(就像 pages router 模式下一样可以嵌套,同时也可以使用动态路由,如 /src/contents/test/test.mdx
可以通过 /blog/test/test
访问)
- 使用 next-mdx-remote 来实现,它是一个用于 Next.js 的库,专门用于在服务器端(Server Side)加载和渲染 MDX 文件。支持将 Markdown/MDX 内容通过服务端渲染传递到前端页面,同时允许在运行时动态渲染组件。
- 核心代码
使用 tailwindcss 和 sass
安装并添加好配置文件后,在全局中引入,如在全局 layout.tsx
中引入 /src/styles/global.scss
全局亮色主题和暗色主题
由于后续步骤需要 css 样式化,在这里我们先使用 next-themes 设置全局的亮色主题和暗色主题,以方便后续操作。查看代码
remark 和 rehype
使用 remark 和 rehype 生态系统进行扩展,如 frontmatter,markdown 语法扩展(GFM),数学公式支持(Katex),代码语法高亮(rehype-pretty-code),清理并安全化 HTML(rehype-sanitize),代码压缩(rehype-minify)等等。
集成第三方评论系统 - Giscus
- 在 GitHub 仓库中启用 Discussions 功能。
- 访问 Giscus 官网,阅读它的配置选项。
- 使用
.env.local
文件,在 .gitignore
中添加此文件,以免较敏感信息直接显示在源代码之中。
Stay tuned...