Nuxt3博客主题

Jun 13, 2023

设置博客主题

theme设置渲染 Markdown 内容样式

原因

使用 Nuxt/content 渲染 Markdown 博客内容,但是样式不够好看,这里两种自定义样式。

参考

当前项目使用的是 @nuxt-themes/typography 。 如果需要设置 typography 的样式,可以参考 tokens.config.ts 。 如果想要自定义样式,单个语法样式,可以重写 Prose 组件,参考当前项目的components\content\ProseH1.vue

实现

代码高亮

这里其实并不需要引入什么依赖,特殊需求除外,参考官方文档 Nuxt/content highlight。当前项目配置的是 GitHub 的 Code高亮,如下配置:

export default defineNuxtConfig({
  content: {
    highlight: {
      theme: {
        // Default theme (same as single string)
        default: 'github-light',
        // Theme used if `html.dark`
        dark: 'github-dark',
        // Theme used if `html.sepia`
        sepia: 'monokai'
      }
    }
  }
})

heti

这个是直接引入 JS 和 CSS ,现成的样式文件,然后在页面中添加类名,如果修改也是直接修改 CSS 文件就 okk 。

  1. 引入 JS

这里是在 Nuxt3 中,使用了 VueUse/useScriptTag 引入

// 注册函数
export async function registerHeti() {
  // 字体间距优化
  useScriptTag(
    '/heti/heti-addon.min.js',
    (el: HTMLScriptElement) => {
      const heti = new (window as any).Heti('.heti')
      heti.autoSpacing()
    },
  )
}
// 在页面中引入 heti.js
registerHeti()
  1. 在页面中引入 heti.min.css

  2. 在页面中添加类名 heti ,挂载样式,就 okk 了

如果想自定义 CSS 样式,直接修改样式文件就行了

  1. 当然 heti 主要是针对中文排版,如果觉得有些样式不能通过 CSS 很好的自定义样式,比如 Code 想要加一个语言的 Tab ,这里就可以通过编写代码,利用 Prose 。

Prose components

这个是直接利用 Nuxt/content 的 API , 重写 Prose 组件,然后在页面中使用。

A list of Prose components currently implemented. Here is a list of all the Prose components currently implemented. To overwrite a prose component, create a component with the same name in your project components/content/ directory (ex: components/content/ProseA.vue)

只要新建一个同名的组件,就可以重写 Prose 组件了,然后在渲染的时候直接会覆盖默认的样式。

@nuxt-themes

Nuxt 提供了一些主题,比如:

这里的前三个都是官方推荐的主题,可以直接安装使用,步骤很简单,直接安装依赖,然后在 nuxt.config.ts 中注册就 okk 了。

# 安装依赖
pnpm install @nuxt-themes/docus -D
// 注册使用
defineNuxtConfig({
  extends: '@nuxt-themes/docus'
})

这里其实还是使用 nuxt/content Prose 自定义渲染样式,只不过这些包已经将一些常备组件样式,并且又新增加规定了一些语法样式组件,所以使用起来更加方便,不需要自己去写样式了。

记得刚安装后,要删除 .nuxt 缓存,然后重新跑一下。

然后还有一个模板项目 nuxt-themes/starter ,可以自定义样式,并发布。

在根目录新建一个 tokens.config.ts ,这里可以配置一些样式变量,比如颜色,字体等等。

发布日期: 2023/06/13