ethan-skill 1.7.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -24
- package/dist/cli/index.js +3 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/skills/15-git-workflow.d.ts +3 -0
- package/dist/skills/15-git-workflow.d.ts.map +1 -0
- package/dist/skills/15-git-workflow.js +288 -0
- package/dist/skills/15-git-workflow.js.map +1 -0
- package/dist/skills/16-unit-testing.d.ts +3 -0
- package/dist/skills/16-unit-testing.d.ts.map +1 -0
- package/dist/skills/16-unit-testing.js +298 -0
- package/dist/skills/16-unit-testing.js.map +1 -0
- package/dist/skills/17-system-design.d.ts +3 -0
- package/dist/skills/17-system-design.d.ts.map +1 -0
- package/dist/skills/17-system-design.js +294 -0
- package/dist/skills/17-system-design.js.map +1 -0
- package/dist/skills/18-database-optimize.d.ts +3 -0
- package/dist/skills/18-database-optimize.d.ts.map +1 -0
- package/dist/skills/18-database-optimize.js +294 -0
- package/dist/skills/18-database-optimize.js.map +1 -0
- package/dist/skills/19-docker.d.ts +3 -0
- package/dist/skills/19-docker.d.ts.map +1 -0
- package/dist/skills/19-docker.js +360 -0
- package/dist/skills/19-docker.js.map +1 -0
- package/dist/skills/20-cicd.d.ts +3 -0
- package/dist/skills/20-cicd.d.ts.map +1 -0
- package/dist/skills/20-cicd.js +364 -0
- package/dist/skills/20-cicd.js.map +1 -0
- package/dist/skills/21-performance.d.ts +3 -0
- package/dist/skills/21-performance.d.ts.map +1 -0
- package/dist/skills/21-performance.js +139 -0
- package/dist/skills/21-performance.js.map +1 -0
- package/dist/skills/22-refactoring.d.ts +3 -0
- package/dist/skills/22-refactoring.d.ts.map +1 -0
- package/dist/skills/22-refactoring.js +235 -0
- package/dist/skills/22-refactoring.js.map +1 -0
- package/dist/skills/23-observability.d.ts +3 -0
- package/dist/skills/23-observability.d.ts.map +1 -0
- package/dist/skills/23-observability.js +266 -0
- package/dist/skills/23-observability.js.map +1 -0
- package/dist/skills/24-design-patterns.d.ts +3 -0
- package/dist/skills/24-design-patterns.d.ts.map +1 -0
- package/dist/skills/24-design-patterns.js +258 -0
- package/dist/skills/24-design-patterns.js.map +1 -0
- package/dist/skills/index.d.ts +10 -0
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +41 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/skills.test.js +3 -3
- package/dist/skills/skills.test.js.map +1 -1
- package/dist/templates/templates.test.js +2 -3
- package/dist/templates/templates.test.js.map +1 -1
- package/package.json +1 -1
- package/rules/claude-code/CLAUDE.md +2410 -3
- package/rules/cline/.clinerules +2262 -2
- package/rules/codebuddy/CODEBUDDY.md +2361 -2
- package/rules/continue/.continuerules +2262 -2
- package/rules/copilot/copilot-instructions.md +2331 -2
- package/rules/cursor/.cursorrules +2399 -2
- package/rules/cursor/smart-flow.mdc +2399 -2
- package/rules/jetbrains/smart-flow.md +2331 -2
- package/rules/lingma/smart-flow.md +2352 -3
- package/rules/windsurf/.windsurf/rules/smart-flow.md +2332 -3
- package/rules/zed/smart-flow.rules +2251 -1
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cicdSkill = void 0;
|
|
4
|
+
exports.cicdSkill = {
|
|
5
|
+
id: 'cicd',
|
|
6
|
+
name: 'CI/CD 流水线',
|
|
7
|
+
nameEn: 'cicd',
|
|
8
|
+
order: 20,
|
|
9
|
+
category: '执行侧',
|
|
10
|
+
description: '设计完整 CI/CD 流水线,涵盖流水线阶段设计、测试自动化、部署门控和回滚策略',
|
|
11
|
+
descriptionEn: 'Design complete CI/CD pipelines covering stage design, test automation, deployment gates, and rollback triggers',
|
|
12
|
+
detailDescription: `端到端 CI/CD 流水线设计指导,从流水线阶段规划、构建优化、测试自动化分层,
|
|
13
|
+
到部署策略(蓝绿/金丝雀)、部署门控配置和自动回滚机制,帮助团队建立快速、安全的持续交付体系。`,
|
|
14
|
+
triggers: [
|
|
15
|
+
'CI/CD',
|
|
16
|
+
'cicd',
|
|
17
|
+
'流水线',
|
|
18
|
+
'pipeline',
|
|
19
|
+
'持续集成',
|
|
20
|
+
'continuous integration',
|
|
21
|
+
'持续部署',
|
|
22
|
+
'continuous deployment',
|
|
23
|
+
'自动化部署',
|
|
24
|
+
'automated deployment',
|
|
25
|
+
'GitHub Actions',
|
|
26
|
+
'构建优化',
|
|
27
|
+
'@ethan cicd',
|
|
28
|
+
'@ethan ci',
|
|
29
|
+
],
|
|
30
|
+
steps: [
|
|
31
|
+
{
|
|
32
|
+
title: '1. 流水线阶段设计',
|
|
33
|
+
content: `**标准 CI/CD 流水线结构**
|
|
34
|
+
|
|
35
|
+
\`\`\`
|
|
36
|
+
Push/PR → [CI 阶段] → [镜像构建] → [部署到 Staging] → [部署到 Production]
|
|
37
|
+
|
|
38
|
+
CI 阶段(每次 Push/PR 触发):
|
|
39
|
+
├── 代码检查: Lint + Type Check
|
|
40
|
+
├── 单元测试: Unit Tests + Coverage
|
|
41
|
+
├── 安全扫描: SAST + Dependency Audit
|
|
42
|
+
└── 构建验证: Build Success Check
|
|
43
|
+
|
|
44
|
+
镜像构建(CI 通过后):
|
|
45
|
+
├── Docker Build(多平台)
|
|
46
|
+
├── 镜像安全扫描(Trivy)
|
|
47
|
+
└── 推送到 Registry(打 tag)
|
|
48
|
+
|
|
49
|
+
部署流程:
|
|
50
|
+
├── Staging(自动,合并到 main 后)
|
|
51
|
+
│ ├── 集成测试
|
|
52
|
+
│ └── E2E 测试(冒烟)
|
|
53
|
+
└── Production(需审批 or 手动触发)
|
|
54
|
+
├── 部署策略(蓝绿/金丝雀)
|
|
55
|
+
└── 部署后验证(健康检查)
|
|
56
|
+
\`\`\`
|
|
57
|
+
|
|
58
|
+
**快速反馈原则**
|
|
59
|
+
- CI 总时长目标:< 10 分钟(开发者等待阈值)
|
|
60
|
+
- 测试并行化:单元测试 → 集成测试 → E2E(分层执行)
|
|
61
|
+
- Fail Fast:代码格式错误最先检查,最快发现`,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
title: '2. GitHub Actions 流水线配置',
|
|
65
|
+
content: `**完整 CI 工作流示例**
|
|
66
|
+
\`\`\`yaml
|
|
67
|
+
# .github/workflows/ci.yml
|
|
68
|
+
name: CI
|
|
69
|
+
|
|
70
|
+
on:
|
|
71
|
+
push:
|
|
72
|
+
branches: [main, develop]
|
|
73
|
+
pull_request:
|
|
74
|
+
branches: [main]
|
|
75
|
+
|
|
76
|
+
env:
|
|
77
|
+
NODE_VERSION: '20'
|
|
78
|
+
REGISTRY: ghcr.io
|
|
79
|
+
IMAGE_NAME: \${{ github.repository }}
|
|
80
|
+
|
|
81
|
+
jobs:
|
|
82
|
+
# ─── 代码质量检查 ───────────────────────────────
|
|
83
|
+
lint:
|
|
84
|
+
name: Lint & Type Check
|
|
85
|
+
runs-on: ubuntu-latest
|
|
86
|
+
steps:
|
|
87
|
+
- uses: actions/checkout@v4
|
|
88
|
+
- uses: actions/setup-node@v4
|
|
89
|
+
with:
|
|
90
|
+
node-version: \${{ env.NODE_VERSION }}
|
|
91
|
+
cache: 'npm'
|
|
92
|
+
- run: npm ci
|
|
93
|
+
- run: npm run lint
|
|
94
|
+
- run: npm run typecheck
|
|
95
|
+
|
|
96
|
+
# ─── 测试 ────────────────────────────────────────
|
|
97
|
+
test:
|
|
98
|
+
name: Unit Tests
|
|
99
|
+
runs-on: ubuntu-latest
|
|
100
|
+
steps:
|
|
101
|
+
- uses: actions/checkout@v4
|
|
102
|
+
- uses: actions/setup-node@v4
|
|
103
|
+
with:
|
|
104
|
+
node-version: \${{ env.NODE_VERSION }}
|
|
105
|
+
cache: 'npm'
|
|
106
|
+
- run: npm ci
|
|
107
|
+
- run: npm run test -- --coverage
|
|
108
|
+
- name: Upload coverage to Codecov
|
|
109
|
+
uses: codecov/codecov-action@v4
|
|
110
|
+
with:
|
|
111
|
+
token: \${{ secrets.CODECOV_TOKEN }}
|
|
112
|
+
|
|
113
|
+
# ─── 安全扫描 ───────────────────────────────────
|
|
114
|
+
security:
|
|
115
|
+
name: Security Audit
|
|
116
|
+
runs-on: ubuntu-latest
|
|
117
|
+
steps:
|
|
118
|
+
- uses: actions/checkout@v4
|
|
119
|
+
- run: npm audit --audit-level=high
|
|
120
|
+
- uses: github/codeql-action/init@v3
|
|
121
|
+
with:
|
|
122
|
+
languages: javascript
|
|
123
|
+
- uses: github/codeql-action/analyze@v3
|
|
124
|
+
|
|
125
|
+
# ─── 构建镜像 ───────────────────────────────────
|
|
126
|
+
build:
|
|
127
|
+
name: Build & Push Image
|
|
128
|
+
needs: [lint, test, security]
|
|
129
|
+
runs-on: ubuntu-latest
|
|
130
|
+
if: github.ref == 'refs/heads/main'
|
|
131
|
+
permissions:
|
|
132
|
+
contents: read
|
|
133
|
+
packages: write
|
|
134
|
+
outputs:
|
|
135
|
+
image-tag: \${{ steps.meta.outputs.tags }}
|
|
136
|
+
steps:
|
|
137
|
+
- uses: actions/checkout@v4
|
|
138
|
+
- uses: docker/setup-buildx-action@v3
|
|
139
|
+
- uses: docker/login-action@v3
|
|
140
|
+
with:
|
|
141
|
+
registry: \${{ env.REGISTRY }}
|
|
142
|
+
username: \${{ github.actor }}
|
|
143
|
+
password: \${{ secrets.GITHUB_TOKEN }}
|
|
144
|
+
- uses: docker/metadata-action@v5
|
|
145
|
+
id: meta
|
|
146
|
+
with:
|
|
147
|
+
images: \${{ env.REGISTRY }}/\${{ env.IMAGE_NAME }}
|
|
148
|
+
tags: |
|
|
149
|
+
type=sha,prefix={{branch}}-
|
|
150
|
+
type=semver,pattern={{version}}
|
|
151
|
+
- uses: docker/build-push-action@v5
|
|
152
|
+
with:
|
|
153
|
+
push: true
|
|
154
|
+
tags: \${{ steps.meta.outputs.tags }}
|
|
155
|
+
cache-from: type=gha
|
|
156
|
+
cache-to: type=gha,mode=max
|
|
157
|
+
\`\`\``,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
title: '3. 构建速度优化',
|
|
161
|
+
content: `**缓存策略**
|
|
162
|
+
\`\`\`yaml
|
|
163
|
+
# npm/yarn 依赖缓存
|
|
164
|
+
- uses: actions/cache@v4
|
|
165
|
+
with:
|
|
166
|
+
path: ~/.npm
|
|
167
|
+
key: \${{ runner.os }}-node-\${{ hashFiles('**/package-lock.json') }}
|
|
168
|
+
restore-keys: |
|
|
169
|
+
\${{ runner.os }}-node-
|
|
170
|
+
|
|
171
|
+
# Docker layer 缓存(使用 GitHub Actions Cache)
|
|
172
|
+
- uses: docker/build-push-action@v5
|
|
173
|
+
with:
|
|
174
|
+
cache-from: type=gha
|
|
175
|
+
cache-to: type=gha,mode=max
|
|
176
|
+
\`\`\`
|
|
177
|
+
|
|
178
|
+
**并行执行策略**
|
|
179
|
+
\`\`\`yaml
|
|
180
|
+
# 使用 matrix 并行运行测试
|
|
181
|
+
jobs:
|
|
182
|
+
test:
|
|
183
|
+
strategy:
|
|
184
|
+
matrix:
|
|
185
|
+
shard: [1, 2, 3, 4] # 4个并行 runner
|
|
186
|
+
steps:
|
|
187
|
+
- run: npm test -- --shard=\${{ matrix.shard }}/4
|
|
188
|
+
\`\`\`
|
|
189
|
+
|
|
190
|
+
**跳过不必要的 CI**
|
|
191
|
+
\`\`\`yaml
|
|
192
|
+
# 路径过滤:文档变更不触发完整 CI
|
|
193
|
+
on:
|
|
194
|
+
push:
|
|
195
|
+
paths-ignore:
|
|
196
|
+
- 'docs/**'
|
|
197
|
+
- '*.md'
|
|
198
|
+
- '.github/ISSUE_TEMPLATE/**'
|
|
199
|
+
|
|
200
|
+
# 或者使用 paths 只触发相关路径
|
|
201
|
+
on:
|
|
202
|
+
push:
|
|
203
|
+
paths:
|
|
204
|
+
- 'src/**'
|
|
205
|
+
- 'tests/**'
|
|
206
|
+
- 'package*.json'
|
|
207
|
+
\`\`\`
|
|
208
|
+
|
|
209
|
+
**Self-hosted Runner(节省 CI 费用)**
|
|
210
|
+
\`\`\`
|
|
211
|
+
适用场景: 大型项目、私有依赖、特殊硬件需求
|
|
212
|
+
注意事项:
|
|
213
|
+
- 安全隔离(不要在 public repo 使用 self-hosted runner)
|
|
214
|
+
- 定期更新 runner 软件
|
|
215
|
+
- 隔离不同项目的 runner(避免环境污染)
|
|
216
|
+
\`\`\``,
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
title: '4. 部署策略与门控',
|
|
220
|
+
content: `**三种主要部署策略**
|
|
221
|
+
|
|
222
|
+
**蓝绿部署(Blue-Green)**
|
|
223
|
+
\`\`\`
|
|
224
|
+
适用: 需要零停机、可快速回滚的场景
|
|
225
|
+
成本: 双倍资源(同时运行两套环境)
|
|
226
|
+
|
|
227
|
+
Blue(当前生产): v1.0 → 接收所有流量
|
|
228
|
+
Green(新版本): v1.1 → 部署验证中
|
|
229
|
+
切换: 负载均衡器流量从 Blue → Green(瞬间完成)
|
|
230
|
+
回滚: 流量切回 Blue(秒级)
|
|
231
|
+
\`\`\`
|
|
232
|
+
|
|
233
|
+
**金丝雀部署(Canary Release)**
|
|
234
|
+
\`\`\`
|
|
235
|
+
适用: 高风险变更、需要渐进式验证
|
|
236
|
+
流程:
|
|
237
|
+
1%流量 → 新版本(观察5min)
|
|
238
|
+
→ 10%(观察15min)
|
|
239
|
+
→ 50%(观察30min)
|
|
240
|
+
→ 100%(全量)
|
|
241
|
+
|
|
242
|
+
Kubernetes 实现:
|
|
243
|
+
kubectl scale deployment app-v2 --replicas=1 # 1/10 = 10%
|
|
244
|
+
kubectl scale deployment app-v1 --replicas=9
|
|
245
|
+
\`\`\`
|
|
246
|
+
|
|
247
|
+
**部署门控(Deployment Gates)配置**
|
|
248
|
+
\`\`\`yaml
|
|
249
|
+
# GitHub Environments 配置审批
|
|
250
|
+
deploy-production:
|
|
251
|
+
environment:
|
|
252
|
+
name: production
|
|
253
|
+
url: https://app.example.com
|
|
254
|
+
# 需要人工审批
|
|
255
|
+
steps:
|
|
256
|
+
- name: Request approval
|
|
257
|
+
uses: trstringer/manual-approval@v1
|
|
258
|
+
with:
|
|
259
|
+
approvers: team-lead,cto
|
|
260
|
+
minimum-approvals: 1
|
|
261
|
+
|
|
262
|
+
# 自动门控:基于健康检查
|
|
263
|
+
deploy-production:
|
|
264
|
+
steps:
|
|
265
|
+
- name: Deploy
|
|
266
|
+
run: kubectl apply -f k8s/
|
|
267
|
+
- name: Wait for rollout
|
|
268
|
+
run: kubectl rollout status deployment/app --timeout=5m
|
|
269
|
+
- name: Smoke test
|
|
270
|
+
run: |
|
|
271
|
+
sleep 10
|
|
272
|
+
curl -f https://api.example.com/health || exit 1
|
|
273
|
+
\`\`\``,
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
title: '5. 回滚策略与监控告警',
|
|
277
|
+
content: `**自动回滚触发条件**
|
|
278
|
+
\`\`\`yaml
|
|
279
|
+
# 部署后自动验证,失败则回滚
|
|
280
|
+
steps:
|
|
281
|
+
- name: Deploy to production
|
|
282
|
+
id: deploy
|
|
283
|
+
run: kubectl set image deployment/app app=\${{ env.NEW_IMAGE }}
|
|
284
|
+
|
|
285
|
+
- name: Monitor deployment health
|
|
286
|
+
run: |
|
|
287
|
+
# 等待10分钟,监控错误率
|
|
288
|
+
for i in {1..20}; do
|
|
289
|
+
ERROR_RATE=$(curl -s https://metrics.example.com/api/error-rate)
|
|
290
|
+
if (( $(echo "$ERROR_RATE > 5" | bc -l) )); then
|
|
291
|
+
echo "Error rate $ERROR_RATE% exceeds threshold, rolling back!"
|
|
292
|
+
kubectl rollout undo deployment/app
|
|
293
|
+
exit 1
|
|
294
|
+
fi
|
|
295
|
+
sleep 30
|
|
296
|
+
done
|
|
297
|
+
|
|
298
|
+
- name: Rollback on failure
|
|
299
|
+
if: failure() && steps.deploy.outcome == 'success'
|
|
300
|
+
run: kubectl rollout undo deployment/app
|
|
301
|
+
\`\`\`
|
|
302
|
+
|
|
303
|
+
**Kubernetes 滚动更新配置**
|
|
304
|
+
\`\`\`yaml
|
|
305
|
+
# deployment.yaml
|
|
306
|
+
spec:
|
|
307
|
+
strategy:
|
|
308
|
+
type: RollingUpdate
|
|
309
|
+
rollingUpdate:
|
|
310
|
+
maxSurge: 1 # 最多多启动1个 Pod
|
|
311
|
+
maxUnavailable: 0 # 始终保持满负载(零停机)
|
|
312
|
+
minReadySeconds: 30 # Pod 就绪后等待30s再继续
|
|
313
|
+
\`\`\`
|
|
314
|
+
|
|
315
|
+
**部署通知**
|
|
316
|
+
\`\`\`yaml
|
|
317
|
+
# 部署成功/失败通知到 Slack
|
|
318
|
+
- name: Notify deployment status
|
|
319
|
+
uses: slackapi/slack-github-action@v1
|
|
320
|
+
with:
|
|
321
|
+
channel-id: 'deployments'
|
|
322
|
+
slack-message: |
|
|
323
|
+
\${{ job.status == 'success' && '✅' || '❌' }} Deployment to Production
|
|
324
|
+
Version: \${{ github.sha }}
|
|
325
|
+
Actor: \${{ github.actor }}
|
|
326
|
+
Status: \${{ job.status }}
|
|
327
|
+
env:
|
|
328
|
+
SLACK_BOT_TOKEN: \${{ secrets.SLACK_BOT_TOKEN }}
|
|
329
|
+
\`\`\`
|
|
330
|
+
|
|
331
|
+
**关键 CI/CD 指标**
|
|
332
|
+
|
|
333
|
+
| 指标 | 目标 | 说明 |
|
|
334
|
+
|------|------|------|
|
|
335
|
+
| Lead Time | < 1天 | 代码到生产的时间 |
|
|
336
|
+
| Deploy Frequency | 每日1次+ | 部署频率 |
|
|
337
|
+
| MTTR | < 1小时 | 故障恢复时间 |
|
|
338
|
+
| Change Failure Rate | < 15% | 部署导致故障比例 |`,
|
|
339
|
+
},
|
|
340
|
+
],
|
|
341
|
+
outputFormat: 'Markdown CI/CD 方案文档,含流水线阶段图、GitHub Actions YAML 配置、部署策略对比和回滚方案',
|
|
342
|
+
examples: [
|
|
343
|
+
{
|
|
344
|
+
input: '帮我设计一个 Node.js 项目的 GitHub Actions CI/CD 流水线',
|
|
345
|
+
output: `## CI/CD 流水线方案
|
|
346
|
+
|
|
347
|
+
**流程**: PR → CI(lint + test + security)→ 合并 main → 构建镜像 → 部署 Staging → 人工审批 → 部署 Production
|
|
348
|
+
|
|
349
|
+
**关键配置**:
|
|
350
|
+
- 使用 npm cache + Docker layer cache,目标 CI 时间 < 8 分钟
|
|
351
|
+
- Production 部署需 team-lead 审批(GitHub Environment protection rules)
|
|
352
|
+
- 部署后自动运行健康检查,失败自动 kubectl rollout undo
|
|
353
|
+
- Slack 通知部署结果`,
|
|
354
|
+
},
|
|
355
|
+
],
|
|
356
|
+
notes: [
|
|
357
|
+
'流水线应该是可靠的,不稳定的 CI 比没有 CI 更糟糕(影响信任度)',
|
|
358
|
+
'保护 main 分支,禁止直接推送,所有变更必须经过 PR + CI 验证',
|
|
359
|
+
'密钥统一用 GitHub Secrets / Vault 管理,严禁硬编码在配置文件中',
|
|
360
|
+
'定期检查并更新 CI Actions 版本,避免使用废弃的 Action 版本',
|
|
361
|
+
],
|
|
362
|
+
nextSkill: 'performance',
|
|
363
|
+
};
|
|
364
|
+
//# sourceMappingURL=20-cicd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20-cicd.js","sourceRoot":"","sources":["../../src/skills/20-cicd.ts"],"names":[],"mappings":";;;AAEa,QAAA,SAAS,GAAoB;IACxC,EAAE,EAAE,MAAM;IACV,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,0CAA0C;IACvD,aAAa,EAAE,iHAAiH;IAChI,iBAAiB,EAAE;gDAC2B;IAC9C,QAAQ,EAAE;QACR,OAAO;QACP,MAAM;QACN,KAAK;QACL,UAAU;QACV,MAAM;QACN,wBAAwB;QACxB,MAAM;QACN,uBAAuB;QACvB,OAAO;QACP,sBAAsB;QACtB,gBAAgB;QAChB,MAAM;QACN,aAAa;QACb,WAAW;KACZ;IACD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BA4Ba;SACvB;QACD;YACE,KAAK,EAAE,yBAAyB;YAChC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4FR;SACF;QACD;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuDR;SACF;QACD;YACE,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqDR;SACF;QACD;YACE,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA6D4B;SACtC;KACF;IACD,YAAY,EACV,gEAAgE;IAClE,QAAQ,EAAE;QACR;YACE,KAAK,EAAE,6CAA6C;YACpD,MAAM,EAAE;;;;;;;;eAQC;SACV;KACF;IACD,KAAK,EAAE;QACL,qCAAqC;QACrC,uCAAuC;QACvC,6CAA6C;QAC7C,yCAAyC;KAC1C;IACD,SAAS,EAAE,aAAa;CACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"21-performance.d.ts","sourceRoot":"","sources":["../../src/skills/21-performance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,gBAAgB,EAAE,eAsI9B,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.performanceSkill = void 0;
|
|
4
|
+
exports.performanceSkill = {
|
|
5
|
+
id: 'performance',
|
|
6
|
+
name: '性能优化',
|
|
7
|
+
nameEn: 'performance',
|
|
8
|
+
order: 21,
|
|
9
|
+
category: '质量侧',
|
|
10
|
+
description: '系统化分析和优化前后端性能瓶颈,涵盖分析工具使用、优化策略和量化指标',
|
|
11
|
+
descriptionEn: 'Systematically analyze and optimize frontend/backend performance bottlenecks with profiling tools and metrics',
|
|
12
|
+
detailDescription: `从性能指标定义、瓶颈定位到针对性优化,覆盖前端(Core Web Vitals)、后端(数据库、缓存)三个层次,建立可量化的性能优化体系。`,
|
|
13
|
+
triggers: [
|
|
14
|
+
'性能优化',
|
|
15
|
+
'performance',
|
|
16
|
+
'页面慢',
|
|
17
|
+
'接口慢',
|
|
18
|
+
'性能分析',
|
|
19
|
+
'profiling',
|
|
20
|
+
'Core Web Vitals',
|
|
21
|
+
'@ethan 性能',
|
|
22
|
+
'/性能优化',
|
|
23
|
+
],
|
|
24
|
+
steps: [
|
|
25
|
+
{
|
|
26
|
+
title: '1. 建立性能基线与目标',
|
|
27
|
+
content: `优化前先量化,避免盲目优化。
|
|
28
|
+
|
|
29
|
+
**前端核心指标(Core Web Vitals)**
|
|
30
|
+
| 指标 | 含义 | 优秀 | 需改进 | 差 |
|
|
31
|
+
|------|------|------|--------|-----|
|
|
32
|
+
| LCP | 最大内容绘制 | ≤ 2.5s | ≤ 4s | > 4s |
|
|
33
|
+
| INP | 交互响应延迟 | ≤ 200ms | ≤ 500ms | > 500ms |
|
|
34
|
+
| CLS | 累积布局偏移 | ≤ 0.1 | ≤ 0.25 | > 0.25 |
|
|
35
|
+
| TTFB | 首字节时间 | ≤ 800ms | ≤ 1.8s | > 1.8s |
|
|
36
|
+
|
|
37
|
+
**采集工具**
|
|
38
|
+
\`\`\`bash
|
|
39
|
+
npm install -g @lhci/cli
|
|
40
|
+
lhci autorun --collect.url=https://yoursite.com
|
|
41
|
+
|
|
42
|
+
npx autocannon -c 100 -d 30 http://localhost:3000/api/users
|
|
43
|
+
\`\`\``,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
title: '2. 前端性能优化',
|
|
47
|
+
content: `**资源加载优化**
|
|
48
|
+
\`\`\`html
|
|
49
|
+
<link rel="preload" href="/fonts/main.woff2" as="font" crossorigin>
|
|
50
|
+
<link rel="preconnect" href="https://api.example.com">
|
|
51
|
+
<img src="hero.jpg" loading="eager" fetchpriority="high" />
|
|
52
|
+
<img src="below-fold.jpg" loading="lazy" />
|
|
53
|
+
\`\`\`
|
|
54
|
+
|
|
55
|
+
**代码拆分(React)**
|
|
56
|
+
\`\`\`typescript
|
|
57
|
+
const UserProfile = lazy(() => import('./pages/UserProfile'));
|
|
58
|
+
|
|
59
|
+
// 虚拟列表(大数据量)
|
|
60
|
+
import { FixedSizeList } from 'react-window';
|
|
61
|
+
<FixedSizeList height={600} itemCount={10000} itemSize={50}>
|
|
62
|
+
{({ index, style }) => <div style={style}>Row {index}</div>}
|
|
63
|
+
</FixedSizeList>
|
|
64
|
+
\`\`\`
|
|
65
|
+
|
|
66
|
+
**打包体积优化**
|
|
67
|
+
\`\`\`bash
|
|
68
|
+
npx vite-bundle-visualizer
|
|
69
|
+
# Tree-shaking: 按需引入
|
|
70
|
+
import { debounce } from 'lodash-es'; // ✅ 非 import _ from 'lodash'
|
|
71
|
+
\`\`\``,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
title: '3. 后端与数据库性能优化',
|
|
75
|
+
content: `**数据库查询优化**
|
|
76
|
+
\`\`\`sql
|
|
77
|
+
EXPLAIN ANALYZE SELECT u.*, COUNT(o.id)
|
|
78
|
+
FROM users u LEFT JOIN orders o ON u.id = o.user_id
|
|
79
|
+
WHERE u.status = 'active' GROUP BY u.id;
|
|
80
|
+
|
|
81
|
+
-- 复合索引
|
|
82
|
+
CREATE INDEX idx_user_status_created ON users(status, created_at);
|
|
83
|
+
\`\`\`
|
|
84
|
+
|
|
85
|
+
**缓存策略(Redis)**
|
|
86
|
+
\`\`\`typescript
|
|
87
|
+
async function getUserProfile(userId: string) {
|
|
88
|
+
const cacheKey = \`user:profile:\${userId}\`;
|
|
89
|
+
const cached = await redis.get(cacheKey);
|
|
90
|
+
if (cached) return JSON.parse(cached);
|
|
91
|
+
const user = await db.users.findUnique({ where: { id: userId } });
|
|
92
|
+
const ttl = 300 + Math.floor(Math.random() * 60); // 随机TTL防雪崩
|
|
93
|
+
await redis.setex(cacheKey, ttl, JSON.stringify(user));
|
|
94
|
+
return user;
|
|
95
|
+
}
|
|
96
|
+
\`\`\`
|
|
97
|
+
|
|
98
|
+
**并行化异步操作**
|
|
99
|
+
\`\`\`typescript
|
|
100
|
+
// ✅ 并行(快)
|
|
101
|
+
const [user, orders] = await Promise.all([getUser(id), getOrders(id)]);
|
|
102
|
+
\`\`\``,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
title: '4. 性能优化 Checklist 与持续监控',
|
|
106
|
+
content: `**优化优先级矩阵**
|
|
107
|
+
| 优化项 | 影响 | 成本 | 优先级 |
|
|
108
|
+
|--------|------|------|--------|
|
|
109
|
+
| 图片压缩/WebP | 高 | 低 | 🔴 立即 |
|
|
110
|
+
| 关键资源预加载 | 高 | 低 | 🔴 立即 |
|
|
111
|
+
| 数据库慢查询修复 | 高 | 中 | 🔴 立即 |
|
|
112
|
+
| 代码拆分/懒加载 | 高 | 中 | 🟡 近期 |
|
|
113
|
+
| Redis 缓存层 | 高 | 高 | 🟡 规划 |
|
|
114
|
+
|
|
115
|
+
**Lighthouse CI 集成**
|
|
116
|
+
\`\`\`yaml
|
|
117
|
+
- name: Lighthouse CI
|
|
118
|
+
uses: treosh/lighthouse-ci-action@v10
|
|
119
|
+
with:
|
|
120
|
+
urls: https://yoursite.com
|
|
121
|
+
uploadArtifacts: true
|
|
122
|
+
\`\`\`
|
|
123
|
+
|
|
124
|
+
**性能优化报告模板**
|
|
125
|
+
\`\`\`
|
|
126
|
+
优化前:LCP 4.8s | FCP 3.2s | P99 API 1200ms
|
|
127
|
+
已实施:图片WebP → LCP -1.8s;加索引 → P99 -600ms
|
|
128
|
+
优化后:LCP 2.3s ✅ | FCP 1.4s ✅ | P99 380ms ✅
|
|
129
|
+
\`\`\``,
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
outputFormat: 'Markdown 性能分析报告,含当前指标基线、瓶颈列表、优化方案和预期收益',
|
|
133
|
+
notes: [
|
|
134
|
+
'先测量再优化,不要猜测瓶颈,用数据说话',
|
|
135
|
+
'Core Web Vitals 直接影响 Google SEO 排名',
|
|
136
|
+
'缓存是最有效的优化,但要仔细设计失效策略',
|
|
137
|
+
],
|
|
138
|
+
};
|
|
139
|
+
//# sourceMappingURL=21-performance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"21-performance.js","sourceRoot":"","sources":["../../src/skills/21-performance.ts"],"names":[],"mappings":";;;AAEa,QAAA,gBAAgB,GAAoB;IAC/C,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,oCAAoC;IACjD,aAAa,EAAE,+GAA+G;IAC9H,iBAAiB,EAAE,uEAAuE;IAC1F,QAAQ,EAAE;QACR,MAAM;QACN,aAAa;QACb,KAAK;QACL,KAAK;QACL,MAAM;QACN,WAAW;QACX,iBAAiB;QACjB,WAAW;QACX,OAAO;KACR;IACD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE;;;;;;;;;;;;;;;;OAgBR;SACF;QACD;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;OAwBR;SACF;QACD;YACE,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BR;SACF;QACD;YACE,KAAK,EAAE,yBAAyB;YAChC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;OAuBR;SACF;KACF;IACD,YAAY,EAAE,wCAAwC;IACtD,KAAK,EAAE;QACL,qBAAqB;QACrB,oCAAoC;QACpC,sBAAsB;KACvB;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"22-refactoring.d.ts","sourceRoot":"","sources":["../../src/skills/22-refactoring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,gBAAgB,EAAE,eAsO9B,CAAC"}
|