npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

vitepress-plugin-word-count

v0.1.1

Published

Simple word count plugin for vitepress

Readme

vitepress-plugin-word-count

简单轻量的文字计数VitePress插件。

插件会在解析markdown时统计字数并注入frontmatter,不会在运行时才统计。

安装

npm install --save-dev vitepress-plugin-word-count
# pnpm add --save-dev vitepress-plugin-word-count
# ...

使用

在VitePress的配置文件.vitepress/config.ts处添加:

import { withWordCountAndReadingTime } from "vitepress-plugin-word-count"
export default defineConfig({
  // 其他配置…
  markdown: {
    config(md) {
      md.render = withWordCountAndReadingTime(md.render, {
          // 阅读速度配置,详见「#配置」
      });
    }
  }
})

随后可以利用插值语法,在markdown中使用,比如:

<script setup lang="ts">
import { useData } from 'vitepress'
const { frontmatter } = useData()
</script>

这是,一个,示例文件!

My {{frontmatter.wordCount}} Words!

Only {{frontmatter.readingTime}} Minutes!

Let's See All Details! {{frontmatter.wordCountStats}}

输出:

这是,一个,示例文件!

My 22 Words!

Only 0.5 Minutes!

Let's See All Details! { "total": 22, "cjk": 8, "noCjk": 11, "other": 3, "character": 125, "text": "这是,一个,示例文件!\nMy !InterpolationHere! Words!\nOnly !InterpolationHere! Minutes!\nLet's See All Details! !InterpolationHere! \n" }

或者自定义一个vue组件,以显示文字计数

假设有以下文件结构:

./docs/.vitepress/theme/
├─ components/
│  └─ WordCountComponent.vue
├─ MyLayout.vue
└─ index.ts

示例组件代码:

<!-- components/WordCountComponent.vue -->
<script setup lang="ts">

defineOptions({ name: "WordCountComponent" })

import { useData } from 'vitepress'

const { frontmatter } = useData()

</script>

<template>
  <div class="WordCountContainer">
    <span class="WordCount">
      Word Count: {{ frontmatter.wordCount }}
    </span>
    <span class="ReadingTime">
      Reading Time: {{ frontmatter.readingTime }} minute
    </span>
  </div>
</template>

可通过布局插槽直接插入示例组件。

比如:

<!-- MyLayout.vue -->
<script setup lang="ts">
import WordCountComponent from "./components/WordCountComponent.vue"
//…
</script>

<template>
  <DefaultTheme.Layout>
    <template #doc-before>
      <WordCountComponent />
    </template>
  </DefaultTheme.Layout>
</template>

然后在主题入口文件配置:

// index.ts
import MyLayout from './MyLayout.vue'
//…

export default {
  Layout: MyLayout,
  //…
} satisfies Theme

配置

/**
 * 阅读速度配置(单位:字/分钟)
 */
export interface ReadingSpeed {
  /* 中日韩字符阅读速度
  *  @default 330
  */
  cjk?: number
  /* 其他语言阅读速度
  *  @default 200
  */
  noCjk?: number
  /* 其他字符(全角标点)
  *  @default 1000
  */
  other?: number
}

可在VitePress配置文件自定义默认阅读速度:

md.render = withWordCountAndReadingTime(md.render, {
  // 阅读速度配置(单位:字/分钟)
  cjk: 330,    // 中日韩字符,默认 330
  noCjk: 200,  // 其他语言单词,默认 200
  other: 1000 // 其他字符(标点之类的),默认 1000
});

也可以在frontmatter中为单个文件配置阅读速度,这会覆盖默认速度:

---
title: My .md file!
readingSpeed:
  cjk: .Inf
  noCjk: 0.0001
  other: 100000
---

<script setup lang="ts">
import { useData } from 'vitepress'
const { frontmatter } = useData()
</script>

Only {{frontmatter.readingTime}} Minutes!

输出:

Only 30000 Minutes!

API

/**
 * 统计结果接口
 */
interface WordCountResult {
    /** 总字数 */
    total: number;
    /** 中日韩字符数(汉字、日文假名、韩文谚文) */
    cjk: number;
    /** 其他语言单词数 */
    noCjk: number;
    /** 全角标点等其他字符数 */
    other: number;
    /** 所有字符数 */
    character: number;
    /** 解析后的原文 */
    text: string;
}

/**
 * 通用字数统计:任何语言的字母序列(字母、数字、连字符)作为一个单词,
 * 但 CJK 字符每个单独计数。
 * @param html 原始 HTML 字符串
 * @returns 字数统计结果
 */
declare function getWordCount(html: string): WordCountResult;

/**
 * 计算阅读时长(分钟)
 * @param stats 字数统计结果
 * @param speed 可选的速度配置
 * @returns 阅读时长(分钟),向上取整到0.5分钟
 */
declare function getReadingTime(stats: WordCountResult, speed?: ReadingSpeed): number;

我可以在非VitePress项目安装吗

当然可以!如果你只导入并使用API的话,按理说任何Node.js项目都行。

这个插件非常轻量,甚至不依赖VitePress运行。作者开发插件的目的是在VitePress项目中使用,所以叫VitePress插件,仅此而已。

理论上该插件还可以适用于任何使用markdown-it作为markdown解析器的项目,但不保证一定能用。

许可证

MIT


由于本项目写得比较急,多有疏忽还望海涵。欢迎issue和PR!