@devflow-tools/plugin-performance 0.12.6 → 0.13.1

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.
@@ -0,0 +1,9 @@
1
+ import type { AnalysisResult } from './types.js';
2
+ export interface PerformanceAuditOptions {
3
+ filePath?: string;
4
+ focus?: 'bundle' | 'deps' | 'assets' | 'all';
5
+ maxFindings?: number;
6
+ outputMode?: 'summary' | 'focused' | 'full';
7
+ }
8
+ export declare function auditPerformance(projectRoot: string, options?: PerformanceAuditOptions): AnalysisResult;
9
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/analyzers/audit.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,YAAY,CAAC;AAE1D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;CAC7C;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,cAAc,CAyG3G"}
@@ -0,0 +1,199 @@
1
+ import { readFileSync } from 'fs';
2
+ import { readdirSync, statSync } from 'fs';
3
+ import { basename, join, relative } from 'path';
4
+ import { execSync } from 'child_process';
5
+ export function auditPerformance(projectRoot, options = {}) {
6
+ const findings = [];
7
+ const outputMode = options.outputMode ?? (options.filePath ? 'summary' : 'focused');
8
+ const maxFindings = normalizeMaxFindings(options.maxFindings, outputMode);
9
+ let bundleSize = 'unknown';
10
+ try {
11
+ const result = execSync('du -sh dist 2>/dev/null || du -sh build 2>/dev/null || echo "unknown"', {
12
+ cwd: projectRoot, encoding: 'utf-8',
13
+ });
14
+ bundleSize = result.trim().split('\t')[0] || 'unknown';
15
+ }
16
+ catch { }
17
+ const files = selectFiles(scanProjectFiles(projectRoot), projectRoot, options);
18
+ for (const file of files) {
19
+ const content = readFileSync(file, 'utf-8');
20
+ const relPath = relative(projectRoot, file);
21
+ // Check package.json for large dependencies
22
+ if ((options.focus ?? 'all') !== 'assets' && file.endsWith('package.json')) {
23
+ try {
24
+ const pkg = JSON.parse(content);
25
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
26
+ const largeDeps = ['moment', 'lodash', 'ramda', 'jquery'];
27
+ for (const dep of largeDeps) {
28
+ if (deps[dep]) {
29
+ findings.push({
30
+ severity: 'warning',
31
+ category: 'large-dependency',
32
+ title: `大依赖 ${dep}`,
33
+ description: `${dep} 体积较大,建议替换为轻量替代`,
34
+ file: relPath,
35
+ suggestion: dep === 'moment' ? '替换为 dayjs' : dep === 'lodash' ? '使用 lodash-es 或按需导入' : undefined,
36
+ });
37
+ }
38
+ }
39
+ }
40
+ catch { }
41
+ }
42
+ if ((options.focus ?? 'all') !== 'deps' && /\.(tsx?|jsx?|vue|css|scss)$/.test(file)) {
43
+ if (/loading\s*=\s*["']eager["']/.test(content)) {
44
+ findings.push({
45
+ severity: 'warning',
46
+ category: 'eager-resource',
47
+ title: '检测到 eager 加载资源',
48
+ description: '非关键资源使用 eager 加载,可能拖慢首屏渲染',
49
+ file: relPath,
50
+ suggestion: '仅对 LCP 相关资源使用 eager,其余资源改为 lazy 或按需加载',
51
+ });
52
+ }
53
+ if (/import\s+['"]lodash['"]|import\s+_?\w*\s+from\s+['"]lodash['"]/.test(content)) {
54
+ findings.push({
55
+ severity: 'warning',
56
+ category: 'full-import',
57
+ title: '检测到 lodash 全量导入',
58
+ description: '全量导入 lodash 会显著增加 bundle 体积',
59
+ file: relPath,
60
+ suggestion: '改为 lodash-es 或子路径按需导入',
61
+ });
62
+ }
63
+ if (/new\s+Image\(\)|<img[^>]+src=/.test(content) && !/loading\s*=\s*["']lazy["']/.test(content)) {
64
+ findings.push({
65
+ severity: 'suggestion',
66
+ category: 'image-lazy-load',
67
+ title: '图片缺少懒加载',
68
+ description: '图片资源未声明 lazy 加载,可能增加初始网络负担',
69
+ file: relPath,
70
+ suggestion: '为非首屏图片添加 loading="lazy",并考虑响应式图片方案',
71
+ });
72
+ }
73
+ }
74
+ }
75
+ const sortedFindings = sortFindings(findings, options);
76
+ const limitedFindings = outputMode === 'full'
77
+ ? sortedFindings
78
+ : sortedFindings.slice(0, maxFindings);
79
+ const truncated = limitedFindings.length < sortedFindings.length;
80
+ const targetLabel = options.filePath ? `文件 ${options.filePath}` : '当前项目';
81
+ const reportId = truncated ? buildReportId(targetLabel, files) : undefined;
82
+ return {
83
+ success: true,
84
+ summary: buildSummary(targetLabel, files.length, sortedFindings.length, limitedFindings.length, truncated),
85
+ findings: limitedFindings,
86
+ metrics: { bundleSize, filesScanned: files.length },
87
+ data: {
88
+ bundleSize,
89
+ focus: options.focus ?? 'all',
90
+ scannedFiles: files.map((file) => relative(projectRoot, file)),
91
+ totalFindings: sortedFindings.length,
92
+ shownFindings: limitedFindings.length,
93
+ truncated,
94
+ reportId,
95
+ },
96
+ totalFindings: sortedFindings.length,
97
+ truncated,
98
+ reportId,
99
+ _report: reportId ? {
100
+ bundleSize,
101
+ focus: options.focus ?? 'all',
102
+ scannedFiles: files.map((file) => relative(projectRoot, file)),
103
+ findings: sortedFindings,
104
+ } : undefined,
105
+ };
106
+ }
107
+ function scanProjectFiles(root) {
108
+ const files = [];
109
+ function walk(dir) {
110
+ try {
111
+ for (const entry of readdirSync(dir)) {
112
+ if (['node_modules', 'dist', 'build', '.git'].includes(entry))
113
+ continue;
114
+ const fullPath = join(dir, entry);
115
+ try {
116
+ const stat = statSync(fullPath);
117
+ if (stat.isDirectory())
118
+ walk(fullPath);
119
+ else
120
+ files.push(fullPath);
121
+ }
122
+ catch { }
123
+ }
124
+ }
125
+ catch { }
126
+ }
127
+ walk(root);
128
+ return files;
129
+ }
130
+ function selectFiles(files, projectRoot, options) {
131
+ if (!options.filePath)
132
+ return files;
133
+ const normalized = options.filePath.replace(projectRoot, '').replace(/\\/g, '/').replace(/^\/+/, '').replace(/\/+$/, '');
134
+ const matched = files.filter((file) => relative(projectRoot, file).replace(/\\/g, '/') === normalized);
135
+ if (matched.length > 0)
136
+ return matched;
137
+ const targetDirectory = `${normalized}/`;
138
+ const targetBaseName = basename(normalized).toLowerCase();
139
+ const fallback = files
140
+ .map((file) => {
141
+ const relPath = relative(projectRoot, file).replace(/\\/g, '/');
142
+ const relPathLower = relPath.toLowerCase();
143
+ const fileBaseName = basename(relPathLower).replace(/\.[^.]+$/, '');
144
+ let score = 0;
145
+ if (relPathLower.replace(/\.[^.]+$/, '') === normalized.toLowerCase())
146
+ score += 4;
147
+ if (relPathLower.startsWith(targetDirectory.toLowerCase()))
148
+ score += 3;
149
+ if (fileBaseName === targetBaseName)
150
+ score += 2;
151
+ return { file, score };
152
+ })
153
+ .filter((item) => item.score > 0)
154
+ .sort((a, b) => b.score - a.score || a.file.localeCompare(b.file))
155
+ .map((item) => item.file);
156
+ return fallback.length > 0 ? fallback : files;
157
+ }
158
+ function normalizeMaxFindings(maxFindings, outputMode) {
159
+ if (outputMode === 'full')
160
+ return Number.MAX_SAFE_INTEGER;
161
+ if (!maxFindings || Number.isNaN(maxFindings)) {
162
+ return outputMode === 'summary' ? 5 : 10;
163
+ }
164
+ return Math.max(1, Math.min(maxFindings, 50));
165
+ }
166
+ function sortFindings(findings, options) {
167
+ const severityRank = {
168
+ critical: 0,
169
+ warning: 1,
170
+ suggestion: 2,
171
+ info: 3,
172
+ };
173
+ const targetPath = options.filePath?.replace(/\\/g, '/').toLowerCase();
174
+ return [...findings].sort((a, b) => {
175
+ const aScore = targetPath && a.file?.toLowerCase().includes(targetPath.toLowerCase()) ? 1 : 0;
176
+ const bScore = targetPath && b.file?.toLowerCase().includes(targetPath.toLowerCase()) ? 1 : 0;
177
+ if (aScore !== bScore)
178
+ return bScore - aScore;
179
+ const severityDiff = severityRank[a.severity] - severityRank[b.severity];
180
+ if (severityDiff !== 0)
181
+ return severityDiff;
182
+ return (a.file ?? '').localeCompare(b.file ?? '');
183
+ });
184
+ }
185
+ function buildSummary(targetLabel, scannedFiles, totalFindings, shownFindings, truncated) {
186
+ const base = `已审计${targetLabel},扫描 ${scannedFiles} 个文件,发现 ${totalFindings} 个性能优化项`;
187
+ if (!truncated)
188
+ return base;
189
+ return `${base};当前仅返回前 ${shownFindings} 条高优先级发现`;
190
+ }
191
+ function buildReportId(targetLabel, files) {
192
+ const source = `${targetLabel}:${files.join('|')}`;
193
+ let hash = 0;
194
+ for (let i = 0; i < source.length; i++) {
195
+ hash = (hash * 31 + source.charCodeAt(i)) >>> 0;
196
+ }
197
+ return `performance-audit-${hash.toString(16)}`;
198
+ }
199
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/analyzers/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface AnalysisResult {
2
+ success: boolean;
3
+ summary: string;
4
+ findings?: Finding[];
5
+ metrics?: Record<string, number | string>;
6
+ data?: unknown;
7
+ totalFindings?: number;
8
+ truncated?: boolean;
9
+ reportId?: string;
10
+ _report?: Record<string, unknown>;
11
+ error?: string;
12
+ }
13
+ export interface Finding {
14
+ severity: 'critical' | 'warning' | 'info' | 'suggestion';
15
+ category: string;
16
+ title: string;
17
+ description: string;
18
+ file?: string;
19
+ line?: number;
20
+ suggestion?: string;
21
+ codeSnippet?: string;
22
+ }
23
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/analyzers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,YAAY,CAAC;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/analyzers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { DevFlowPlugin } from "@devflow-tools/sdk";
2
+ export declare const performancePlugin: DevFlowPlugin;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,eAAO,MAAM,iBAAiB,EAAE,aA4mD/B,CAAC"}