普通视图

发现新文章,点击刷新页面。
昨天 — 2026年1月24日首页

开源一个 markdown-it 插件:让你的博客支持 GitHub 用户悬浮卡片

作者 Joie
2026年1月24日 18:20

开源一个 markdown-it 插件:让你的博客支持 GitHub 用户悬浮卡片

前言

在写技术博客或文档时,我们经常需要提到 GitHub 上的开发者,比如「这个方案参考了 @antfu 的实现」。但读者看到这个 @ 时,往往需要点击跳转才能了解这个人是谁。

能不能像 GitHub 那样,鼠标悬停就能看到用户信息呢?

于是我开发了这个插件:markdown-it-github-mention-card

效果预览

在 Markdown 中写入:

这个项目的灵感来自 {@antfu} 的开源作品。

渲染后,鼠标悬停在链接上,就会出现一个精美的用户信息卡片,包含:

  • 用户头像
  • 用户名和简介
  • 地理位置、公司信息
  • 粉丝数、关注数、公开仓库数

无需跳转页面,信息一目了然。

特性

  • 语法简洁{@username} 即可,支持自定义显示文本
  • 悬浮卡片:调用 GitHub API 实时获取用户信息
  • 暗色模式:自动适配 .dark 主题类
  • SSR/SSG 友好:完美支持 VitePress、Nuxt、Next.js 等框架
  • TypeScript:完整的类型定义
  • 轻量无依赖:核心代码仅依赖 markdown-it

安装

# npm
npm install markdown-it-github-mention-card

# pnpm
pnpm add markdown-it-github-mention-card

# yarn
yarn add markdown-it-github-mention-card

基础使用

import MarkdownIt from 'markdown-it'
import MarkdownItGitHubMentionCard, { initHoverCard } from 'markdown-it-github-mention-card'

const md = new MarkdownIt()
md.use(MarkdownItGitHubMentionCard, {
  // 可选:提高 GitHub API 速率限制
  githubToken: 'YOUR_GITHUB_TOKEN',
})

// 渲染 Markdown
const html = md.render('{@antfu} 是 Vue 核心团队成员')
document.querySelector('#app').innerHTML = html

// 初始化悬浮卡片(浏览器端调用)
initHoverCard()

语法说明

插件支持三种写法:

语法 说明 示例
{@username} 基础用法 {@antfu} → 显示 "antfu"
{@username|显示文本} 自定义文本 {@antfu|Anthony Fu} → 显示 "Anthony Fu"
{@username|显示文本|链接} 自定义链接 {@antfu|博客|https://antfu.me}

SSR/SSG 场景最佳实践

在服务端渲染场景下,构建时和浏览器端环境分离,推荐以下方式:

服务端(构建时):

import MarkdownIt from 'markdown-it'
import MarkdownItGitHubMentionCard from 'markdown-it-github-mention-card'

const md = new MarkdownIt()
md.use(MarkdownItGitHubMentionCard)
// 服务端不传 token,避免暴露

const html = md.render('{@antfu}')

客户端(浏览器):

import { initHoverCard } from 'markdown-it-github-mention-card'

// VitePress / Vite
initHoverCard(import.meta.env.VITE_GITHUB_TOKEN)

// Next.js
initHoverCard(process.env.NEXT_PUBLIC_GITHUB_TOKEN)

暗色模式

插件内置暗色模式支持,当页面或父元素包含 .dark 类时,卡片自动切换暗色主题:

<html class="dark">
  <!-- 卡片自动适配暗色 -->
</html>

与 VitePress、Tailwind CSS 等主流方案完美兼容。

在 VitePress 中使用

// .vitepress/config.ts
import MarkdownItGitHubMentionCard from 'markdown-it-github-mention-card'

export default {
  markdown: {
    config: (md) => {
      md.use(MarkdownItGitHubMentionCard)
    }
  }
}
// .vitepress/theme/index.ts
import { initHoverCard } from 'markdown-it-github-mention-card'
import { onMounted } from 'vue'

export default {
  enhanceApp() {
    if (typeof window !== 'undefined') {
      onMounted(() => {
        initHoverCard(import.meta.env.VITE_GITHUB_TOKEN)
      })
    }
  }
}

实现原理

简单介绍一下核心实现:

  1. Markdown 解析:通过 markdown-it 的 inline rule,匹配 {@...} 语法,生成带有 data-github-user 属性的 <a> 标签

  2. 悬浮卡片initHoverCard() 在浏览器端监听鼠标事件,当悬停在目标链接上时:

    • 调用 GitHub REST API 获取用户信息
    • 动态创建卡片 DOM 并定位显示
    • 内置请求缓存,避免重复请求
  3. 样式注入:首次调用时自动注入 CSS,支持亮/暗两套主题

为什么不用 GitHub 官方的 Hover Card?

GitHub 的 Hover Card 仅在 github.com 域名下生效,且需要登录状态。本插件:

  • 可在任意网站使用
  • 无需用户登录 GitHub
  • 可自定义样式和行为
  • 适配各种 SSR/SSG 框架

项目地址

写在最后

这是我开源的一个小工具,希望能帮助到有类似需求的同学。

如果觉得有用,欢迎:

  • 给项目点个 ⭐ Star
  • 提 Issue 反馈问题或建议
  • 提 PR 一起完善

有任何问题欢迎在评论区交流讨论!

昨天以前首页

一个程序员2004年的决定,如何悄悄改变了整个互联网?

作者 冴羽
2026年1月23日 17:39

一个程序员2004年的决定,如何悄悄改变了整个互联网?

想象一下:

你正在写一份工作报告,想给标题加个粗体,或者插入一个网址链接。

在传统的 Word 文档里,你需要花几分钟时间找各种按钮、菜单,偶尔还会因为误操作把整页格式搞乱。

现在,你只需要输入 # 标题 就能得到大标题,输入 **粗体文字** 就能得到粗体,输入 [点击这里](网址) 就能得到一个可点击的链接。

简单、直接、高效,就像发微信一样自然。

这就是 Markdown。

本篇和你讲讲 Markdown 背后的故事,以及为什么它能成功到风靡全球,以及它的故事对我们的启示。

1. 一个决定

故事要从 2004 年说起。

那时的互联网还很“原始"”,如果想在网页上发布一篇文章,你必须学习一门叫 HTML 的语言。

想象一下,每次写文章都要像这样编码:

<h1>我的文章标题</h1><p>这是一段<strong>重要</strong>的文字,包含一个<a href="链接地址">链接</a></p>

这就像是想给朋友写封信,却必须先学会用摩斯密码一样荒谬。

就在这时,一个叫约翰·格鲁伯的程序员做了一个大胆的决定:创造一种“反HTML”的格式。

HTML是“标记语言”,那他就创造一种“反标记语言”——Markdown。

约翰的想法很简单:为什么不能让写文章就像写普通邮件一样简单?

1.png

2. 意外传播

约翰发布 Markdown 时,并没有想到它会成为互联网的基础设施。

他只是厌倦了复杂的 HTML 语法,想为自己和朋友提供一个更简单的选择。

但接下来发生的事情连约翰自己都没想到:

  • 2004 年:Markdown 悄悄诞生

  • 2005-2010 年:程序员们开始用 Markdown 写技术文档

  • 2010-2015 年:各大平台开始支持 Markdown 格式

  • 2015-2020 年:笔记软件、协作工具全面拥抱 Markdown

  • 2020 年至今:连苹果的 Notes 都支持 Markdown 了

这就像你发明了一种新的记账方法,结果全世界的企业都跟着用了。

2.png

3. Markdown 成功的十个原因

所以为什么 Markdown 能在众多技术中脱颖而出呢?

让我们看看它的成功秘密:

1. 绝妙的名字

“Markdown”这个名字很好!懂技术的人一眼就知道它是“反 Markup”,普通人听起来也简单好记。

2. 解决了真实痛点

不是所有新技术都解决了实际问题,但 Markdown 确实让无数人从 HTML 的折磨中解脱了出来。

3. 顺应了用户习惯

Markdown 的语法基于人们已经在邮件和文档中形成的习惯。比如用 * 表示强调,用 # 表示标题等。

4. 找到了最佳时机

2004 年正值博客爆发期,人们正在寻找更好的写作工具。Markdown 正好撞上了这个风口。

5. 开放包容的社区

从一开始,Markdown 就有一个开放的社区。

各种版本出现:GitHub 版本、通用版本、扩展版本...但核心依然保持一致。

6. 极简主义的设计哲学

保持简单,而不是追求复杂。 这是很多成功技术的共同特点。

7. 技术人员的推动

程序员们是早期使用者,他们发现了 Markdown 的价值并大力推广,形成了滚雪球效应。

8. 可读性强

即使不懂 Markdown 语法的人,看到 .md 文件也能大概猜出意思。这种“自我解释”的能力很珍贵。

9. 跨平台兼容

Markdown 文件在任何设备、任何系统上都能正常显示和编辑。不怕软件更新,不怕系统迁移。

10. 零专利壁垒

最重要的是,约翰·格鲁伯没有为 Markdown 申请专利。这意味着任何人都可以自由使用它。

3.png

4. 带给我们什么启发?

Markdown 的故事不仅仅是一个技术成功的案例,它还给我们很多启发:

4.1. 简单比复杂更有力量

在这个喜欢把简单事情搞复杂的世界里,Markdown 证明了“less is more”的智慧。

4.2. 从解决实际问题出发

不是为了技术而技术,而是为了解决人们的实际问题。Markdown 的成功源于它真的让写作变得更简单。

4.3. 长期主义的重要性

从 2004 年到今天,Markdown 已经存在了20年。它没有一夜爆红,而是慢慢渗透,最终无处不在。

4.png

5. 最后

不是每个人都需要发明影响世界的技术,但每个人都可以创造一些让世界变得更美好的小东西。

关键在于:观察人们真正的问题,提出简单的解决方案,然后分享给世界。

或许这就是 Markdown 的故事给我们的最珍贵的礼物。

我是冴羽,10 年笔耕不辍,专注前端领域,更新了 10+ 系列、300+ 篇原创技术文章,翻译过 Svelte、Solid.js、TypeScript 文档,著有小册《Next.js 开发指南》、《Svelte 开发指南》、《Astro 实战指南》。

欢迎围观我的“网页版朋友圈”,关注我的公众号:冴羽(或搜索 yayujs) ,每天分享前端知识、AI 干货。

❌
❌