镜像自地址
https://github.com/lhly/cloud-drive-renamer.git
已同步 2026-10-20 13:47:47 +08:00
refactor(ci): 优化 CI 流程并精简 npm scripts
docs: 添加 SCRIPTS.md 文档说明新命令集 style: 添加代码注释说明性能指标和 polyfill 状态 ci: 合并测试步骤为单一命令并优化构建验证
这个提交包含在:
父节点
b8936adf6a
当前提交
4b224761b6
72
.github/workflows/ci.yml
vendored
72
.github/workflows/ci.yml
vendored
@ -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
|
||||
|
||||
23
.github/workflows/complete-tests.yml
vendored
23
.github/workflows/complete-tests.yml
vendored
@ -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)"
|
||||
|
||||
30
.github/workflows/release.yml
vendored
30
.github/workflows/release.yml
vendored
@ -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
普通文件
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 命令
|
||||
- ✅ 更新开发文档
|
||||
25
package.json
25
package.json
@ -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
|
||||
*/
|
||||
|
||||
/**
|
||||
|
||||
正在加载...
在新工单中引用
屏蔽一个用户