Skip to content

Commit 8477bd3

Browse files
committed
docs: 添加 CLAUDE.md 文件,提供项目概述、架构设计和常用命令说明
1 parent f9686f8 commit 8477bd3

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed

CLAUDE.md

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
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

Comments
 (0)