发布于 2026-01-06 2 阅读
0

前端开发自动化。第四部分:DEV 全球展示挑战赛,由 Mux 呈现:展示你的项目!

前端开发自动化。第四部分

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

引言

本文将创建某个系统的一部分,而该系统又是更大系统的一部分。我们将只关注性能测试的运行。

注意:本文假设您对 Git、Github WebhooksNodeJS和 Docker 非常熟悉。

NodeJS:这是包含所有代码的仓库

问题

ABC公司拥有一项SPA对业务至关重要的功能。该功能需要在移动端表现出色(我们稍后会定义“出色”的含义)。随着时间的推移,版本发布频率越来越高,因此迫切需要确保所有新版本都符合分配performance budget给它的功能。

解决方案

作为开发人员,我们必须确保每个版本都处于可部署状态。对我们而言,可部署意味着所有测试都已通过,并且新功能在类似生产环境中运行正常。此外,我们需要/希望能够即时获得关于下一个版本性能的反馈,因此提出了以下解决方案:

创建一个系统,在每次发布新版本时运行性能测试。

依赖关系

  • dotenv是一个零依赖模块,它可以将环境变量从.env文件中加载到系统中。process.env
  • NodeJS
  • Puppeteer . 无头 Chrome Node API。<!-- * ShellJS . 基于 Node.js API 的 Unix shell 命令 -->
  • Lightouse CLI。审核我们的应用程序并获取相关数据。

1. 开发我们的分析工具

理想情况下,我们的下一个版本应该始终在上个版本的基础上有所改进,或者保持在可接受的范围内。如果情况开始偏离,我们需要尽快获取相关数据。

我们将创建一个函数来收集这些指标:

  • JS 代码覆盖率和 CSS 代码覆盖率。该指标告诉我们实际使用的代码量与加载的代码量之比。
  • 网络请求。列出页面加载期间发出的网络请求。
  • 速度指数。速度指数显示页面内容可见加载的速度。

我们将运行 Lighthouse 提供的所有测试。以下是测试的先后顺序:

  1. 获取在测试/预发布/本地环境中运行的应用程序 URL。该 URL 应从配置文件中读取。
  2. 生成代码覆盖率。目前我们只获取首页的代码覆盖率。
  3. 运行 Lighthouse 审计
  4. 过滤信息并将其发送到可以持久保存的位置。这可以是保存在文件系统中的 JSON 数据,也可以是数据库。随着应用程序的成熟,我们会将其定义在其他地方。
/**
 * puppeteerPerformance.js
*/

'use strict';
require('dotenv').config();

const chromeLauncher = require( 'lighthouse/chrome-launcher/chrome-launcher' );
const fs = require( 'fs' );
const lighthouse = require( 'lighthouse' );


const { APP_URL } = proccess.env;
// 1.

const flags = {
  output: 'json'
};

const launchChromeAndRunLighthouse = ( url, flags, config = null ) => {
  return chromeLauncher.launch()
    .then( chrome => {
      flags.port = chrome.port;
      return lighthouse( url, flags, config )
        .then( results =>
          chrome.kill()
          .then( () => results )
        );
    } );
}


// 2.
launchChromeAndRunLighthouse( APP_URL, flags )
// 3.
  .then( results => {
     fs.writeFile( './results.json', JSON.stringify(results), function ( err ) {
        if ( err ) {
          return console.log( err );
        }
        console.log( 'The file was saved!' );
      } );
});

Enter fullscreen mode Exit fullscreen mode

请注意,该results变量可以发送到数据库并存储起来,以便进行历史比较。

在这种情况下,我们只需将其保存为 JSON 文件即可。

2. 未创建我们的 GitHub Action

真可惜目前 GitHub Actions 还是公开测试版,我还在候补名单上。所以我们暂时会使用 GitHub WebHook。如果您能批准我的请求,我很乐意写篇博文分享一下。

NodeJS:这是包含所有代码的仓库

我已经写过一篇关于如何设置 GitHub Webhooks 的博客文章。这次我会创建一个 Heroku 应用,并使用该应用的 URL 进行 URL 设置。

现在我们需要创建一个简单的 Express 应用程序,该应用程序在每次收到请求时都会运行测试。

我们将安装 Express

yarn add express
Enter fullscreen mode Exit fullscreen mode

require('dotenv').config();

const { APP_STAGING_URL, APP_PRODUCTION_URL } = process.env;

const express = require('express');
const bodyParser = require('body-parser');
const fs = require('fs');
const { lighthousePerfAudits } = require('./audits/lighthousePerfAudits');

const app = express();
const flags = {
  output: 'json',
};

app.use(bodyParser.json());

app.post('/run', (req, res) => {
  // 1. Check secret
  if (req.headers['x-hub-signature']) {
    /**
     * Secret is valid,
     * run tests and write json data
     * on both environments
     */
    lighthousePerfAudits(APP_PRODUCTION_URL, flags)
      .then((results) => {
        fs.writeFile('/production_results.json', JSON.stringify(results), (err) => {
          if (err) {
            return console.log(err);
          }
          console.log('The file was saved!');
        });
      });

    lighthousePerfAudits(APP_STAGING_URL, flags)
      .then((results) => {
        fs.writeFile('/staging_results.json', JSON.stringify(results), (err) => {
          if (err) {
            return console.log(err);
          }
          console.log('The file was saved!');
        });
      });

    // send response with 200
    res.status(200).send();
  } else {
    res.status(500).send();
  }
  // secret is not valid, return 500
});

app.listen(process.env.PORT || 8080, () => {
  console.log('App linstening on ', process.env.PORT || 8080);
});

Enter fullscreen mode Exit fullscreen mode

结论

有了这个实例,每次向存储库推送部署时,我们都可以运行脚本并获取相关的指标。

该申请还有一些未完成的部分,例如:

  • 这些数据应该保存在哪里?
  • 有没有办法直接把它接入Github?
  • 我们如何将产品发布表现的历史数据可视化?
  • 狐狸怎么叫?

我会在后续文章中解答这些问题。我目前也在开发一个开源的SaaS产品,旨在解决这些问题。如果您还有其他疑问,欢迎在Twitter上联系我。

NodeJS:这是包含所有代码的仓库

干杯。

更多资源:

文章来源:https://dev.to/jrioscloud/front-end-development-automation-part-4-3gjd