Vue 应用的性能预算配置:CI/CD 集成与性能回归检测
大家好,今天我们来聊聊 Vue 应用的性能预算配置,以及如何在 CI/CD 流程中集成性能测试,实现性能回归检测。
性能预算是为项目设定的一组性能目标,它能帮助团队在开发过程中保持性能意识,避免性能瓶颈。通过将性能测试集成到 CI/CD 流程中,我们可以自动化地检测性能回归,及时发现并解决性能问题。
1. 什么是性能预算?
性能预算是一组预先设定的性能指标,用于指导开发和设计决策,确保最终产品在性能方面达到可接受的标准。这些指标可以包括:
- 加载时间: 首次渲染时间、可交互时间等。
- 资源大小: JavaScript、CSS、图片等资源的大小。
- 请求数量: HTTP 请求的数量。
- 性能指标: Lighthouse 得分、Web Vitals 指标等。
性能预算的目的是在开发过程中尽早发现性能问题,避免在发布后才发现,从而降低修复成本和风险。
2. 制定 Vue 应用的性能预算
制定性能预算需要考虑多个因素,包括:
- 目标用户: 用户的网络环境、设备性能等。
- 应用类型: 页面密集型应用、交互密集型应用等。
- 竞争对手: 竞争对手的性能表现。
- 业务目标: 用户体验、转化率等。
以下是一些常见的性能指标及其建议值:
| 指标 | 建议值 |
|---|---|
| 首次内容绘制 (FCP) | 1.8 秒以内 |
| 最大内容绘制 (LCP) | 2.5 秒以内 |
| 首次可交互时间 (TTI) | 5 秒以内 |
| 总阻塞时间 (TBT) | 300 毫秒以内 |
| Cumulative Layout Shift (CLS) | 0.1 以内 |
| JavaScript 大小 | 170KB (压缩后) |
| CSS 大小 | 70KB (压缩后) |
| 图片大小 | 根据具体情况而定,尽量压缩和优化 |
| 请求数量 | 尽量减少 HTTP 请求的数量,可以使用 CDN、缓存等技术 |
这些只是一些通用的建议,具体的性能预算需要根据实际情况进行调整。
3. Vue 应用性能测试工具
Vue 应用的性能测试可以使用多种工具,以下是一些常用的工具:
- Lighthouse: Google 提供的开源工具,可以对网页进行全方位的性能评估,并提供改进建议。
- WebPageTest: 在真实浏览器中进行性能测试,可以模拟不同的网络环境和设备。
- PageSpeed Insights: Google 提供的在线工具,可以对网页进行性能评估,并提供改进建议。
- Chrome DevTools: Chrome 浏览器自带的开发者工具,可以进行性能分析、内存分析等。
- Bundle Analyzer: 分析 webpack 打包后的文件,找出体积过大的模块。
在 CI/CD 流程中,通常使用 Lighthouse 或 WebPageTest 进行自动化性能测试。
4. CI/CD 集成与性能回归检测
将性能测试集成到 CI/CD 流程中,可以自动化地检测性能回归,及时发现并解决性能问题。以下是一个 CI/CD 集成示例,使用 Lighthouse 进行性能测试,并使用 Node.js 脚本进行性能回归检测。
步骤 1:安装 Lighthouse 和相关依赖
npm install -D lighthouse puppeteer
步骤 2:创建 Lighthouse 配置文件 (lighthouse.config.js)
module.exports = {
ci: {
collect: {
url: ['http://localhost:8080'], // 你的 Vue 应用的 URL
numberOfRuns: 3, // 运行 Lighthouse 的次数,取平均值
},
assert: {
preset: 'lighthouse:recommended',
assertions: {
'first-contentful-paint': ['warn', { maxNumericValue: 1800 }],
'largest-contentful-paint': ['warn', { maxNumericValue: 2500 }],
'cumulative-layout-shift': ['warn', { maxNumericValue: 0.1 }],
'total-blocking-time': ['warn', { maxNumericValue: 300 }],
'performance': ['warn', { minScore: 0.9 }], // 总性能得分
'accessibility': ['warn', { minScore: 0.9 }], // 无障碍得分
'best-practices': ['warn', { minScore: 0.9 }], // 最佳实践得分
'seo': ['warn', { minScore: 0.9 }], // SEO得分
},
},
upload: {
target: 'temporary-public-storage', // 将报告上传到临时公共存储
},
},
};
步骤 3:创建性能回归检测脚本 (check-performance.js)
const lighthouse = require('lighthouse');
const chromeLauncher = require('chrome-launcher');
const fs = require('fs');
async function runLighthouse(url) {
const chrome = await chromeLauncher.launch({ chromeFlags: ['--headless'] });
const options = { logLevel: 'info', onlyCategories: ['performance'], port: chrome.port };
const runnerResult = await lighthouse(url, options);
await chrome.kill();
return runnerResult.lhr;
}
async function checkPerformance() {
const url = 'http://localhost:8080'; // 你的 Vue 应用的 URL
const baselineFile = 'baseline.json'; // 基准性能数据文件
const threshold = 0.05; // 性能下降阈值 (5%)
try {
const currentLHR = await runLighthouse(url);
const baselineLHR = JSON.parse(fs.readFileSync(baselineFile, 'utf8'));
let regressionDetected = false;
// 检查关键性能指标
const metricsToCheck = [
'first-contentful-paint',
'largest-contentful-paint',
'total-blocking-time',
'cumulative-layout-shift',
'performance',
];
for (const metric of metricsToCheck) {
const currentValue = metric === 'performance' ? currentLHR.categories.performance.score : currentLHR.audits[metric].numericValue;
const baselineValue = metric === 'performance' ? baselineLHR.categories.performance.score : baselineLHR.audits[metric].numericValue;
const percentageChange = (currentValue - baselineValue) / baselineValue;
if (percentageChange < -threshold) {
console.error(`Performance regression detected for ${metric}:`);
console.error(` Baseline: ${baselineValue}`);
console.error(` Current: ${currentValue}`);
console.error(` Change: ${percentageChange.toFixed(2)}`);
regressionDetected = true;
}
}
if (regressionDetected) {
console.error('Performance regression detected! Failing the build.');
process.exit(1); // 退出进程,表示测试失败
} else {
console.log('Performance tests passed!');
}
// 保存当前性能数据作为新的基准
fs.writeFileSync(baselineFile, JSON.stringify(currentLHR, null, 2));
console.log(`Updated baseline performance data in ${baselineFile}`);
} catch (error) {
console.error('Error during performance check:', error);
process.exit(1);
}
}
checkPerformance();
步骤 4:创建 baseline.json 文件
第一次运行性能测试时,需要创建一个 baseline.json 文件,用于存储基准性能数据。可以手动运行 check-performance.js 脚本,并将输出的 JSON 数据保存到 baseline.json 文件中。后续的性能测试将会与这个基准数据进行比较。
步骤 5:配置 CI/CD 流程
在 CI/CD 配置文件中,添加以下步骤:
- 构建 Vue 应用: 使用
npm run build命令构建 Vue 应用。 - 启动本地服务器: 使用
serve或类似的工具启动一个本地服务器,用于提供构建后的 Vue 应用。例如:npx serve -s dist -p 8080 - 运行性能测试: 使用
node check-performance.js命令运行性能回归检测脚本。
以下是一个 GitLab CI 配置文件示例 (.gitlab-ci.yml):
stages:
- build
- test
build:
stage: build
image: node:16
script:
- npm install
- npm run build
artifacts:
paths:
- dist/
test:
stage: test
image: node:16
dependencies:
- build
before_script:
- npm install -D lighthouse puppeteer serve
- npm install -D fs
- npx serve -s dist -p 8080 &
- sleep 5 # 等待服务器启动
script:
- node check-performance.js
artifacts:
paths:
- baseline.json
步骤 6:首次运行 CI/CD 流程
首次运行 CI/CD 流程时,由于 baseline.json 文件不存在,性能测试将会失败。需要手动创建一个 baseline.json 文件,并将首次性能测试的结果保存到该文件中。然后,将 baseline.json 文件提交到代码仓库。
步骤 7:后续运行 CI/CD 流程
后续运行 CI/CD 流程时,性能测试将会与 baseline.json 文件中的基准数据进行比较。如果性能下降超过阈值,CI/CD 流程将会失败。
代码解释:
lighthouse.config.js:Lighthouse 配置文件,定义了需要测试的 URL、性能指标和阈值。check-performance.js:性能回归检测脚本,使用 Lighthouse 进行性能测试,并将测试结果与基准数据进行比较。如果性能下降超过阈值,脚本将会退出,表示测试失败。.gitlab-ci.yml:GitLab CI 配置文件,定义了 CI/CD 流程的各个阶段和步骤。
注意:
- 需要根据实际情况修改
lighthouse.config.js和check-performance.js文件中的 URL、性能指标和阈值。 - 需要确保 CI/CD 环境中安装了 Node.js、npm 和 Lighthouse 等工具。
- 可以根据需要调整 CI/CD 流程的各个阶段和步骤。
- 首次运行需要手动创建 baseline.json 文件,后续 CI/CD 会自动更新。
5. 性能预算的维护
性能预算不是一成不变的,需要定期进行维护和更新。以下是一些维护性能预算的建议:
- 定期审查: 定期审查性能预算,确保其仍然符合业务目标和用户需求。
- 跟踪指标: 跟踪关键性能指标,了解应用的性能趋势。
- 调整阈值: 根据实际情况调整性能指标的阈值。
- 添加新指标: 随着应用的发展,可能需要添加新的性能指标。
- 技术升级: 随着技术的发展,可以采用新的技术来优化应用性能。
6. 优化 Vue 应用性能的常见手段
除了设置性能预算和进行性能回归检测外,还需要采取一些措施来优化 Vue 应用的性能。以下是一些常见的优化手段:
- 代码分割: 将代码分割成多个 chunk,按需加载。
- 懒加载: 延迟加载非关键资源,例如图片、组件等。
- 路由懒加载: 延迟加载路由组件,提高首屏加载速度。
- 图片优化: 压缩图片大小,使用合适的图片格式,使用 CDN。
- 缓存: 使用浏览器缓存、CDN 缓存等技术,减少 HTTP 请求。
- 代码优化: 避免不必要的计算,减少 DOM 操作,使用高效的算法。
- 组件优化: 避免不必要的渲染,使用
v-memo和v-once指令。 - 服务端渲染 (SSR): 使用服务端渲染,提高首屏加载速度和 SEO。
- 预渲染 (Prerendering): 在构建时生成静态 HTML 文件,提高首屏加载速度。
7. 使用 ESLint 插件进行性能规则检查
可以使用 ESLint 插件来静态检查代码中的性能问题。以下是一些常用的 ESLint 插件:
- eslint-plugin-vue: Vue 官方提供的 ESLint 插件,可以检查 Vue 组件中的语法错误和潜在问题。
- eslint-plugin-import: 检查 import 语句中的错误,例如未使用的 import、循环依赖等。
- eslint-plugin-promise: 检查 Promise 的使用,例如未处理的 rejection。
通过配置 ESLint 规则,可以帮助开发者在编写代码时避免一些常见的性能问题。例如,可以配置规则禁止在循环中使用 v-if 指令,或者禁止使用过于复杂的计算。
8. 利用 Vue Devtools 进行性能分析
Vue Devtools 是一个强大的调试工具,可以用于分析 Vue 应用的性能。通过 Vue Devtools,可以查看组件的渲染次数、渲染时间、数据变化等信息,从而找出性能瓶颈。
以下是一些使用 Vue Devtools 进行性能分析的技巧:
- 查看组件的渲染次数: 减少不必要的组件渲染次数。
- 查看组件的渲染时间: 找出渲染时间过长的组件,并进行优化。
- 查看数据变化: 找出频繁变化的数据,并进行优化。
- 使用 Performance 面板: 记录应用的性能数据,并进行分析。
9. 使用 Web Vitals 进行性能监控
Web Vitals 是一组由 Google 提出的用于衡量网页用户体验的指标。这些指标包括:
- Largest Contentful Paint (LCP): 最大内容绘制,衡量页面加载速度。
- First Input Delay (FID): 首次输入延迟,衡量页面交互性。
- Cumulative Layout Shift (CLS): 累积布局偏移,衡量页面视觉稳定性。
可以通过 Google Analytics 或其他分析工具来监控 Web Vitals 指标,了解应用的性能表现。可以使用 web-vitals JavaScript 库来收集 Web Vitals 指标。
10. 总结
我们讨论了性能预算的定义、制定、工具选择、CI/CD 集成和维护,以及 Vue 应用性能优化的常见手段。通过设置性能预算,并在 CI/CD 流程中进行自动化性能测试,可以有效地监控和控制 Vue 应用的性能,提升用户体验。 持续优化代码和组件,定期审查和维护性能预算,构建更快速流畅的 Vue 应用。
更多IT精英技术系列讲座,到智猿学院