|
| 1 | +# CLAUDE.md |
| 2 | + |
| 3 | +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. |
| 4 | + |
| 5 | +## 项目概述 |
| 6 | + |
| 7 | +这是一个用于检测网页更新并通知用户刷新的插件系统,支持 Vite、UmiJS 和 Webpack。核心原理是:通过 git commit hash(也支持 svn revision、package.json version、build timestamp、custom)作为版本号,打包时将版本号写入 JSON 文件,客户端轮询服务器上的版本号并与本地比较,如果不同则通知用户刷新。 |
| 8 | + |
| 9 | +## Monorepo 架构 |
| 10 | + |
| 11 | +项目使用 pnpm workspace + turbo 管理 monorepo: |
| 12 | + |
| 13 | +- **packages/core**: 核心逻辑库,包含版本获取、文件生成等通用功能 |
| 14 | +- **packages/vite-plugin**: Vite 插件实现 |
| 15 | +- **packages/umi-plugin**: UmiJS 插件实现 |
| 16 | +- **packages/webpack-plugin**: Webpack 插件实现 |
| 17 | +- **example/**: 各种框架的示例项目(vue-vite、react-vite、svelte-vite、react-umi、vue-webpack) |
| 18 | + |
| 19 | +各插件包依赖 core 包(通过 `workspace:*`),共享核心功能。 |
| 20 | + |
| 21 | +## 常用命令 |
| 22 | + |
| 23 | +### 构建 |
| 24 | +```bash |
| 25 | +# 构建所有包 |
| 26 | +pnpm build |
| 27 | + |
| 28 | +# 开发特定包 |
| 29 | +pnpm dev:vite # 开发 vite 插件 |
| 30 | +pnpm dev:umi # 开发 umi 插件 |
| 31 | +pnpm dev:webpack # 开发 webpack 插件 |
| 32 | +``` |
| 33 | + |
| 34 | +### 示例运行 |
| 35 | +```bash |
| 36 | +pnpm example:vue-vite # 运行 Vue + Vite 示例 |
| 37 | +pnpm example:react-vite # 运行 React + Vite 示例 |
| 38 | +pnpm example:svelte-vite # 运行 Svelte + Vite 示例 |
| 39 | +pnpm example:react-umi # 运行 React + Umi 示例 |
| 40 | +pnpm example:vue-webpack # 运行 Vue + Webpack 示例 |
| 41 | +``` |
| 42 | + |
| 43 | +### 测试和检查 |
| 44 | +```bash |
| 45 | +pnpm test:unit # 运行单元测试(vitest) |
| 46 | +pnpm test:e2e # 运行 E2E 测试 |
| 47 | +pnpm lint # 代码检查 |
| 48 | +pnpm typecheck # 类型检查 |
| 49 | +``` |
| 50 | + |
| 51 | +### 发布 |
| 52 | +```bash |
| 53 | +pnpm release # 使用 bumpp 更新版本号 |
| 54 | +pnpm publish # 发布所有包到 npm |
| 55 | +``` |
| 56 | + |
| 57 | +## 核心架构设计 |
| 58 | + |
| 59 | +### 版本获取策略(packages/core/src/index.ts) |
| 60 | + |
| 61 | +通过策略模式实现多种版本类型: |
| 62 | +- `git_commit_hash`: 执行 `git rev-parse --short HEAD` |
| 63 | +- `svn_revision_number`: 执行 `svnversion` |
| 64 | +- `pkg_version`: 读取 `process.env.npm_package_version` |
| 65 | +- `build_timestamp`: 使用 `Date.now()` |
| 66 | +- `custom`: 自定义版本号 |
| 67 | + |
| 68 | +如果获取失败会自动降级到 `build_timestamp`。仓库类型自动检测(通过查找 .git 或 .svn 目录)。 |
| 69 | + |
| 70 | +### 插件工作流程 |
| 71 | + |
| 72 | +1. **构建时**: |
| 73 | + - 获取版本号 |
| 74 | + - 生成 `version.json` 文件(包含版本号和 silence 标志) |
| 75 | + - 生成并注入检测脚本(`webUpdateNoticeInjectScript.js`) |
| 76 | + - 生成并注入样式文件(`webUpdateNoticeInjectStyle.css`) |
| 77 | + - 在 HTML 中注入 script 标签、link 标签和通知锚点元素 |
| 78 | + |
| 79 | +2. **运行时**(客户端): |
| 80 | + - 注入的脚本会在以下时机检查更新: |
| 81 | + - 首次加载页面 |
| 82 | + - 轮询(默认 10 分钟) |
| 83 | + - script 资源加载失败(404) |
| 84 | + - 标签页重新获得焦点或可见 |
| 85 | + - 对比本地版本和服务器版本 |
| 86 | + - 如不同则显示通知或触发自定义事件 |
| 87 | + |
| 88 | +### Vite 插件实现要点(packages/vite-plugin/src/index.ts) |
| 89 | + |
| 90 | +- 使用 `apply: 'build'` 仅在构建时生效 |
| 91 | +- 使用 `enforce: 'post'` 确保在其他插件之后执行 |
| 92 | +- 在 `configResolved` 钩子中:自动获取 `viteConfig.base` 作为 `injectFileBase` |
| 93 | +- 在 `generateBundle` 钩子中:使用 `emitFile` API 生成 JSON、CSS、JS 文件 |
| 94 | +- 在 `transformIndexHtml` 钩子中:注入 script/link 标签和通知锚点 |
| 95 | + |
| 96 | +### 文件哈希机制 |
| 97 | + |
| 98 | +所有注入的文件都带有内容哈希(MD5 前 8 位),确保缓存更新: |
| 99 | +- `webUpdateNoticeInjectScript.[hash].js` |
| 100 | +- `webUpdateNoticeInjectStyle.[hash].css` |
| 101 | + |
| 102 | +## 开发注意事项 |
| 103 | + |
| 104 | +### 修改核心逻辑 |
| 105 | +如果修改 `packages/core` 的代码,需要重新构建才能被其他包使用: |
| 106 | +```bash |
| 107 | +pnpm --filter=@plugin-web-update-notification/core build |
| 108 | +``` |
| 109 | + |
| 110 | +### 修改注入脚本 |
| 111 | +注入脚本源码在 `packages/core/src/injectScript.ts`,通过 tsup 构建为独立的 bundle。修改后需要重新构建 core 包。 |
| 112 | + |
| 113 | +### 添加新的版本类型 |
| 114 | +在 `packages/core/src/index.ts` 的 `getVersionStrategies` 对象中添加新策略,并更新 `VersionType` 类型定义。 |
| 115 | + |
| 116 | +### 国际化 |
| 117 | +默认语言配置在 `packages/core/src/locale.ts`,支持 `zh_CN`、`zh_TW`、`en_US`。 |
| 118 | + |
| 119 | +### TypeScript 类型 |
| 120 | +如果用户需要 `window.pluginWebUpdateNotice_` 的类型提示,需要在项目中添加: |
| 121 | +```ts |
| 122 | +/// <reference types="@plugin-web-update-notification/vite" /> |
| 123 | +``` |
| 124 | + |
| 125 | +## 技术栈 |
| 126 | + |
| 127 | +- **构建工具**: tsup(基于 esbuild) |
| 128 | +- **包管理器**: pnpm (v10.8.0) |
| 129 | +- **Node.js**: 使用 package.json 中的 packageManager 字段指定版本 |
| 130 | +- **Monorepo**: Turborepo |
| 131 | +- **测试**: Vitest + Playwright (E2E) |
| 132 | +- **代码规范**: @antfu/eslint-config |
0 commit comments