从 Hugo 到 Next.js

tl;dr: 本站已迁移至 Pandoc + React 技术栈。

§再见,Hugo

经过了不到一年的使用,我决定彻底放弃 Hugo 极其相关技术栈。

主要原因是:

  • Haskell 社区有 Pandoc 这一功能强大的文档转换器。作为长期的函数式编程爱好者和 Haskell 用户,我认为我应该使用 Pandoc 而非 Hugo.
  • Hugo 采取一种自有的模板格式,可读性、可维护性不佳。
  • Hugo 基本上无法利用 React / Vue 社区的技术栈。
  • 不知道是我用的 Love-It 主题的问题还是 Hugo 程序本身的问题, LaTeX\LaTeX 代码要使用特 有的语法,必须用 \\ 代替 \ . 这是我最无法忍受的一点。
  • 一直以来,我都想要一种自由度,那就是中文的斜体用 楷体字 表示,而英文的斜体仍 旧保持 italic , 就像 LaTeX\LaTeX 对于中文的处理一样。这涉及到修改转换器本身。

因此,我决定迁移到 Pandoc + React 技术栈。

§技术选型

怎么把 Pandoc 和 React 结合起来,是一个未被探索的问题。我目前采用的方法是

  • 写一个 Haskell 程序,把 Pandoc 语法树转换为 jsx (目前被我叫作 `panda`,计划是 后续替换成直接封装一个自己的 `pandoc` 程序)
  • 用一个 webpack loader, 在这个 loader 里调用上面的程序
  • 基于 Next.js,实现静态 HTML 导出

某种意义上来说,这就是 MDX 的方案。不过我们的优势是,理论上这套方案可以支持所有 Pandoc 能够解析的 markup 语言,例如 markdown, org-mode, reStructuredText 等等。 1

§实现

目前实现在仓库中。

§TODO

目前的实现非常脏,主要的问题是

  • panda 程序与 Next.js 前端耦合过深。
  • 没有找到一个高质量、兼容 next-theme 、SSG 友好的代码语法高亮组件库。可能需要 自己做一个。
  • UI 仍然需要调整。