This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
这是一个用于检测网页更新并通知用户刷新的插件系统,支持 Vite、UmiJS、Webpack 和 Rspack。核心原理是:通过 git commit hash(也支持 svn revision、package.json version、build timestamp、custom)作为版本号,打包时将版本号写入 JSON 文件,客户端轮询服务器上的版本号并与本地比较,如果不同则通知用户刷新。
项目使用 pnpm workspace + turbo 管理 monorepo:
- packages/core: 核心逻辑库,包含版本获取、文件生成等通用功能
- packages/vite-plugin: Vite 插件实现
- packages/umi-plugin: UmiJS 插件实现
- packages/webpack-plugin: Webpack 插件实现
- packages/rspack-plugin: Rspack 插件实现(同时支持 Rsbuild)
- example/: 各种框架的示例项目(vue-vite、react-vite、svelte-vite、react-umi、vue-webpack、vue-rspack)
各插件包依赖 core 包(通过 workspace:*),共享核心功能。
# 构建所有包
pnpm build
# 开发特定包
pnpm dev:vite # 开发 vite 插件
pnpm dev:umi # 开发 umi 插件
pnpm dev:webpack # 开发 webpack 插件
pnpm dev:rspack # 开发 rspack 插件pnpm example:vue-vite # 运行 Vue + Vite 示例
pnpm example:react-vite # 运行 React + Vite 示例
pnpm example:svelte-vite # 运行 Svelte + Vite 示例
pnpm example:react-umi # 运行 React + Umi 示例
pnpm example:vue-webpack # 运行 Vue + Webpack 示例
pnpm example:vue-rspack # 运行 Vue + Rspack 示例pnpm test:unit # 运行单元测试(vitest)
pnpm test:e2e # 运行 E2E 测试
pnpm lint # 代码检查
pnpm typecheck # 类型检查pnpm release # 使用 bumpp 更新版本号
pnpm publish # 发布所有包到 npm通过策略模式实现多种版本类型:
git_commit_hash: 执行git rev-parse --short HEADsvn_revision_number: 执行svnversionpkg_version: 读取process.env.npm_package_versionbuild_timestamp: 使用Date.now()custom: 自定义版本号
如果获取失败会自动降级到 build_timestamp。仓库类型自动检测(通过查找 .git 或 .svn 目录)。
-
构建时:
- 获取版本号
- 生成
version.json文件(包含版本号和 silence 标志) - 生成并注入检测脚本(
webUpdateNoticeInjectScript.js) - 生成并注入样式文件(
webUpdateNoticeInjectStyle.css) - 在 HTML 中注入 script 标签、link 标签和通知锚点元素
-
运行时(客户端):
- 注入的脚本会在以下时机检查更新:
- 首次加载页面
- 轮询(默认 10 分钟)
- script 资源加载失败(404)
- 标签页重新获得焦点或可见
- 对比本地版本和服务器版本
- 如不同则显示通知或触发自定义事件
- 注入的脚本会在以下时机检查更新:
- 使用
apply: 'build'仅在构建时生效 - 使用
enforce: 'post'确保在其他插件之后执行 - 在
configResolved钩子中:自动获取viteConfig.base作为injectFileBase - 在
generateBundle钩子中:使用emitFileAPI 生成 JSON、CSS、JS 文件 - 在
transformIndexHtml钩子中:注入 script/link 标签和通知锚点
所有注入的文件都带有内容哈希(MD5 前 8 位),确保缓存更新:
webUpdateNoticeInjectScript.[hash].jswebUpdateNoticeInjectStyle.[hash].css
注意:IIFE 输出后缀为 .iife(由 tsdown 生成)。
如果修改 packages/core 的代码,需要重新构建才能被其他包使用:
pnpm --filter=@plugin-web-update-notification/core build注入脚本源码在 packages/core/src/injectScript.ts,通过 tsdown 构建为独立的 bundle。修改后需要重新构建 core 包。
在 packages/core/src/index.ts 的 getVersionStrategies 对象中添加新策略,并更新 VersionType 类型定义。
默认语言配置在 packages/core/src/locale.ts,支持 zh_CN、zh_TW、en_US。
如果用户需要 window.pluginWebUpdateNotice_ 的类型提示,需要在项目中添加:
/// <reference types="@plugin-web-update-notification/vite" />- 构建工具: tsdown(基于 Rolldown)
- 包管理器: pnpm (v10.8.0)
- Node.js: 使用 package.json 中的 packageManager 字段指定版本
- Monorepo: Turborepo
- 测试: Vitest + Playwright (E2E)
- 代码规范: @antfu/eslint-config