refactor(ci): 优化 CI 流程并精简 npm scripts

docs: 添加 SCRIPTS.md 文档说明新命令集
style: 添加代码注释说明性能指标和 polyfill 状态
ci: 合并测试步骤为单一命令并优化构建验证
这个提交包含在:
Zain 2025-12-16 17:58:20 +08:00
父节点 b8936adf6a
当前提交 4b224761b6
共有 9 个文件被更改,包括 392 次插入 和 90 次删除

查看文件

@ -73,15 +73,15 @@ jobs:
run: npm ci
# ------------------------------------------
# 步骤 4: 运行快速测试(无覆盖率,更快)
# 步骤 4: 运行完整 CI 流程(质量检查 + 构建)
# ------------------------------------------
- name: 🧪 Run fast tests
run: npm run test:ci
- name: 🚀 Run CI pipeline
run: npm run ci
continue-on-error: false
timeout-minutes: 3
timeout-minutes: 5
# ------------------------------------------
# 步骤 5: 上传测试覆盖率
# 步骤 5: 上传测试覆盖率报告
# ------------------------------------------
- name: 📊 Upload coverage reports
uses: actions/upload-artifact@v4
@ -92,40 +92,40 @@ jobs:
retention-days: 7
# ------------------------------------------
# 步骤 6: TypeScript 类型检查
# 步骤 6: 验证构建产物
# ------------------------------------------
- name: 🔍 Run type checking
run: npm run typecheck
# ------------------------------------------
# 步骤 7: ESLint 代码检查
# ------------------------------------------
- name: 🎨 Run linting
run: npm run lint
# ------------------------------------------
# 步骤 8: 构建验证
# ------------------------------------------
- name: 🏗️ Build extension
run: npm run build
# ------------------------------------------
# 步骤 9: 验证构建产物
# ------------------------------------------
- name: ✅ Verify build
- name: ✅ Verify build artifacts
run: |
echo "📋 Verifying build artifacts..."
# 检查关键文件
test -f dist/manifest.json || exit 1
test -f dist/icons/icon16.png || exit 1
test -f dist/icons/icon48.png || exit 1
test -f dist/icons/icon128.png || exit 1
required_files=(
"dist/manifest.json"
"dist/icons/icon16.png"
"dist/icons/icon48.png"
"dist/icons/icon128.png"
)
echo "✅ Build verification passed"
all_ok=true
for file in "${required_files[@]}"; do
if test -f "$file"; then
echo "✅ $file exists"
else
echo "❌ $file NOT FOUND"
all_ok=false
fi
done
if [ "$all_ok" = true ]; then
echo "✅ Build verification passed"
exit 0
else
echo "❌ Build verification FAILED"
exit 1
fi
# ------------------------------------------
# 步骤 10: 总结
# 步骤 7: CI 总结
# ------------------------------------------
- name: 📣 CI Summary
if: success()
@ -133,7 +133,11 @@ jobs:
echo "## ✅ CI Checks Completed" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "All quality checks passed successfully:" >> $GITHUB_STEP_SUMMARY
echo "- ✅ Tests passed with coverage" >> $GITHUB_STEP_SUMMARY
echo "- ✅ Type checking passed" >> $GITHUB_STEP_SUMMARY
echo "- ✅ Linting passed" >> $GITHUB_STEP_SUMMARY
echo "- ✅ Code linting (ESLint)" >> $GITHUB_STEP_SUMMARY
echo "- ✅ Type checking (TypeScript)" >> $GITHUB_STEP_SUMMARY
echo "- ✅ Unit tests with coverage" >> $GITHUB_STEP_SUMMARY
echo "- ✅ Build succeeded and verified" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📊 Performance" >> $GITHUB_STEP_SUMMARY
echo "- Single command execution (no redundant checks)" >> $GITHUB_STEP_SUMMARY
echo "- Optimized CI pipeline" >> $GITHUB_STEP_SUMMARY

查看文件

@ -52,20 +52,19 @@ jobs:
- name: 📦 Install dependencies
run: npm ci
# 运行所有单元和集成测试
- name: 🧪 Run unit and integration tests
run: npm run test:ci
continue-on-error: false
# 运行性能测试
- name: 📊 Run performance tests
run: npm run test:performance
# 运行完整的质量检查和测试
- name: 🚀 Run complete CI suite
run: npm run ci
continue-on-error: false
# 可选:运行 E2E 测试
# - name: 🎭 Run E2E tests
# run: npm run test:e2e
# continue-on-error: false
- name: 🎭 Run E2E tests
run: npm run test:e2e
continue-on-error: true # E2E 测试失败不阻止流程
- name: ✅ All tests completed
run: echo "✅ Complete test suite passed!"
run: |
echo "✅ Complete test suite passed!"
echo "- ✅ Quality checks (lint, typecheck, tests)"
echo "- ✅ Build verification"
echo "- 🎭 E2E tests (optional)"

查看文件

@ -74,32 +74,14 @@ jobs:
run: npm ci # 使用 ci 而非 install 确保可重现性
# ------------------------------------------
# 步骤 4: 运行测试套件
# 步骤 4: 运行完整 CI 流程(质量检查 + 构建)
# ------------------------------------------
- name: 🧪 Run tests
run: npm run test
continue-on-error: false # 测试失败则中止流程
- name: 🚀 Run complete CI pipeline
run: npm run ci
continue-on-error: false # 质量检查失败则中止发布
# ------------------------------------------
# 步骤 5: TypeScript 类型检查
# ------------------------------------------
- name: 🔍 Run type checking
run: npm run typecheck
# ------------------------------------------
# 步骤 6: ESLint 代码检查
# ------------------------------------------
- name: 🎨 Run linting
run: npm run lint
# ------------------------------------------
# 步骤 7: 构建扩展
# ------------------------------------------
- name: 🏗️ Build extension
run: npm run build
# ------------------------------------------
# 步骤 8: 验证构建产物
# 步骤 5: 验证构建产物
# ------------------------------------------
- name: ✅ Verify build artifacts
run: |
@ -130,7 +112,7 @@ jobs:
echo "✅ All required files present"
# ------------------------------------------
# 步骤 9: 上传构建产物(供后续 Job 使用)
# 步骤 6: 上传构建产物(供后续 Job 使用)
# ------------------------------------------
- name: 📤 Upload build artifacts
uses: actions/upload-artifact@v4

325
docs/SCRIPTS.md 普通文件
查看文件

@ -0,0 +1,325 @@
# 📋 NPM Scripts 使用指南
> 精简后的命令集:从 30 个减少到 16 个核心命令(减少 47%)
## 🚀 核心开发命令
### `npm run dev`
**启动开发服务器**
- 自动同步版本号
- 启动 Vite 热更新开发服务器
- 实时预览扩展功能
```bash
npm run dev
```
### `npm run build`
**完整质量检查 + 生产构建** ✨
- ✅ 自动同步版本号
- ✅ ESLint 代码检查
- ✅ TypeScript 类型检查
- ✅ 单元测试 + 覆盖率
- ✅ 编译构建
- 🎯 **质量门控设计**:确保所有质量检查通过才能构建成功
```bash
npm run build
```
**为什么 build 包含这么多步骤?**
这是有意的质量门控(Quality Gate)设计,防止遗漏检查导致问题上线。如果需要快速测试构建,可以使用 `npm run validate` 预检查。
### `npm run preview`
**预览生产构建**
- 本地预览构建产物
- 验证生产环境行为
```bash
npm run build
npm run preview
```
---
## 🔍 代码质量命令
### `npm run lint`
**运行 ESLint 检查**
- 检查代码规范问题
- 不自动修复
```bash
npm run lint
```
### `npm run lint:fix`
**自动修复 ESLint 问题**
- 自动修复可修复的问题
- 替代了原 `format` 命令
```bash
npm run lint:fix
```
💡 **提示**:建议在 IDE 中配置保存时自动运行 `lint:fix`
### `npm run typecheck`
**TypeScript 类型检查**
- 不生成编译产物
- 仅检查类型错误
```bash
npm run typecheck
```
---
## 🧪 测试命令
### `npm test`
**交互式单元测试(开发模式)**
- Vitest 监听模式
- 文件变化自动重跑
- 适合开发时使用
```bash
npm test
```
### `npm run test:coverage`
**单元测试 + 覆盖率报告**
- 运行所有单元测试
- 生成覆盖率报告
- 与 `test:ci` 功能相同
```bash
npm run test:coverage
```
### `npm run test:ci`
**CI 环境测试(等同于 test:coverage)**
- 用于 CI/CD 流程
- 生成覆盖率报告
```bash
npm run test:ci
```
### `npm run test:e2e`
**端到端测试(Playwright)**
- 运行 E2E 测试套件
- 无头模式运行
```bash
npm run test:e2e
```
### `npm run test:e2e:ui`
**可视化 E2E 测试**
- Playwright UI 模式
- 可视化调试测试
```bash
npm run test:e2e:ui
```
💡 **按需使用的测试命令**:
```bash
# 测试 UI 界面(按需安装)
npx vitest --ui
# E2E 调试模式(按需使用)
npx playwright test --debug
# 性能测试(暂未配置)
npx vitest run tests/performance
```
---
## ✅ 验证和 CI 命令
### `npm run validate`
**完整质量验证**
- Lint + TypeCheck + Test
- 用于提交前验证
- 比 `build` 更快(不实际编译)
```bash
npm run validate
```
### `npm run ci`
**CI/CD 完整流程**
- 运行 `validate`
- 运行 `build`
- 用于自动化部署
```bash
npm run ci
```
---
## 🖼️ 图片处理命令
### `npm run resize`
**参数化图片调整工具**
替代了原来的 6 个独立命令,现在统一使用参数化调用:
```bash
# 商店截图 (1280x800)
npm run resize screenshot
# Logo (300x300)
npm run resize logo
# 小促销磁贴 (440x280)
npm run resize small-promo
# 大型促销磁贴 (1400x560)
npm run resize large-promo
# 小尺寸截图 (640x400)
npm run resize screenshot-small
# 查看所有可用预设
npm run resize
```
**高级用法**:
```bash
# 自定义输入目录
npm run resize screenshot ./my-images
# 自定义输出目录
npm run resize logo ./icons ./output
# 自定义背景颜色
npm run resize screenshot -- --background=white
# 自定义图片位置
npm run resize logo -- --position=top
```
---
## 🔧 工具命令
### `npm run sync:version`
**同步版本号**
- 自动同步 package.json 和 manifest.json 版本号
- `dev` 和 `build` 会自动调用
```bash
npm run sync:version
```
### `npm run verify:release`
**验证发布包**
- 检查构建产物完整性
- 发布前验证
```bash
npm run verify:release
```
---
## 📊 命令精简对比
| 类别 | 原有 | 精简后 | 说明 |
|------|------|--------|------|
| 开发构建 | 5 | 3 | 移除 prebuild/predev hooks |
| 代码质量 | 3 | 2 | 移除独立 format 命令 |
| 测试 | 8 | 5 | 移除重复和 YAGNI 命令 |
| 验证 | 2 | 2 | 保持不变 |
| 图片处理 | 6 | 1 | 参数化替代 |
| 其他 | 6 | 3 | 移除重复命令 |
| **总计** | **30** | **16** | **-47%** |
---
## ❌ 已移除的命令及替代方案
| 已移除 | 替代方案 | 原因 |
|--------|----------|------|
| `prebuild` | `build` 中自动调用 | 移除 npm hooks,简化流程 |
| `predev` | `dev` 中自动调用 | 移除 npm hooks,简化流程 |
| `build:only` | `build` | 避免绕过质量检查 |
| `format` | `lint:fix` | ESLint 可以处理格式化 |
| `test:ui` | `npx vitest --ui` | 按需使用,无需固定命令 |
| `test:full` | `test:coverage` | 功能重复 |
| `test:performance` | `npx vitest run tests/performance` | YAGNI - 暂不需要 |
| `test:e2e:debug` | `npx playwright test --debug` | 按需使用 |
| `validate:quick` | `validate` | 功能重叠 |
| `release:check` | `verify:release` | 完全重复 |
| `resize:screenshots` | `npm run resize screenshot` | 参数化替代 |
| `resize:screenshots-small` | `npm run resize screenshot-small` | 参数化替代 |
| `resize:logo` | `npm run resize logo` | 参数化替代 |
| `resize:promo-small` | `npm run resize small-promo` | 参数化替代 |
| `resize:promo-large` | `npm run resize large-promo` | 参数化替代 |
| `resize:all` | 手动运行多次 `resize` | 简化命令集 |
---
## 💡 最佳实践
### 开发工作流
```bash
# 1. 启动开发服务器
npm run dev
# 2. 开发过程中运行测试
npm test
# 3. 提交前验证
npm run validate
# 4. 构建前最终检查
npm run build
```
### CI/CD 工作流
```bash
# 完整 CI 流程
npm run ci
```
### 发布工作流
```bash
# 1. 完整构建和测试
npm run build
# 2. 运行 E2E 测试
npm run test:e2e
# 3. 验证发布包
npm run verify:release
# 4. 发布到商店...
```
---
## 🎯 设计原则
1. **质量门控优先** - `build` 命令整合所有质量检查
2. **参数化优先** - 用参数替代多个相似命令
3. **YAGNI 原则** - 移除未来可能需要的命令
4. **按需使用** - 低频命令使用 `npx` 按需调用
5. **简化认知** - 减少命令数量,降低学习成本
---
## 📝 更新日志
**2025-12-16**
- ✅ 从 30 个命令精简到 16 个核心命令
- ✅ 保留 `build` 命令的质量门控设计
- ✅ 图片处理命令参数化
- ✅ 移除 npm hooks(prebuild/predev)
- ✅ 移除重复和 YAGNI 命令
- ✅ 更新开发文档

查看文件

@ -4,33 +4,22 @@
"description": "批量重命名工具,支持夸克网盘(阿里云盘和百度网盘开发中)",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"dev": "npm run sync:version && vite",
"build": "npm run sync:version && npm run lint && npm run typecheck && npm run test:ci && tsc && vite build",
"preview": "vite preview",
"sync:version": "node scripts/sync-version.js",
"prebuild": "npm run sync:version",
"predev": "npm run sync:version",
"lint": "eslint . --ext .ts,.tsx",
"lint:fix": "eslint . --ext .ts,.tsx --fix",
"format": "prettier --write \"src/**/*.{ts,tsx,json}\"",
"test": "vitest",
"test:ui": "vitest --ui",
"test:coverage": "vitest --coverage",
"test:coverage": "vitest run --coverage",
"test:ci": "vitest run --coverage",
"test:full": "vitest run --coverage --config vitest.config.full.ts",
"test:performance": "vitest run tests/performance",
"test:e2e": "playwright test",
"test:e2e:ui": "playwright test --ui",
"test:e2e:debug": "playwright test --debug",
"typecheck": "tsc --noEmit",
"resize:screenshots": "node scripts/resize-screenshots.js screenshot",
"resize:screenshots-small": "node scripts/resize-screenshots.js screenshot-small",
"resize:logo": "node scripts/resize-screenshots.js logo",
"resize:promo-small": "node scripts/resize-screenshots.js small-promo",
"resize:promo-large": "node scripts/resize-screenshots.js large-promo",
"resize:all": "npm run resize:screenshots && npm run resize:logo && npm run resize:promo-small && npm run resize:promo-large",
"verify:release": "node scripts/verify-release.js",
"release:check": "npm run verify:release"
"validate": "npm run lint && npm run typecheck && npm run test:ci",
"ci": "npm run validate && npm run build",
"resize": "node scripts/resize-screenshots.js",
"verify:release": "node scripts/verify-release.js"
},
"keywords": [
"chrome-extension",

查看文件

@ -715,6 +715,7 @@ export function onExecute(context?: {
perf?: { injectTime: number; loadTime: number };
}) {
if (context?.perf) {
// Performance metrics 可选,暂不处理
}
init();
}

查看文件

@ -25,6 +25,7 @@ if (typeof customElements === 'undefined' || customElements === null) {
// 注意:这是正常的,loader会异步加载必要的polyfill
// 实际的API可用性检查应该在使用时进行(见index.ts的openRenameDialog)
} else {
// Polyfill 已加载,可以直接使用 customElements
}
export {};

查看文件

@ -125,11 +125,12 @@ function setupCommunication(dialogElement: any) {
*/
function handleParentMessage(message: Message, dialogElement: any) {
switch (message.type) {
case 'DIALOG_OPEN':
case 'DIALOG_OPEN': {
const openMsg = message as DialogOpenMessage;
dialogElement.files = openMsg.payload.files;
dialogElement.open = true;
break;
}
default:
}

查看文件

@ -10,7 +10,7 @@
* 1. Edit version in package.json
* 2. Run: npm run sync:version (or automatically via prebuild/predev)
*
* Generated at: 2025-12-16T07:42:56.888Z
* Generated at: 2025-12-16T09:49:08.955Z
*/
/**