utils.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. const chokidar = require("chokidar");
  2. const { exec } = require("child_process");
  3. const path = require("path")
  4. exports.parseK6StdoutTable = function (text) {
  5. const keysToKeep = new Set([
  6. "checks_total",
  7. "checks_succeeded",
  8. "checks_failed",
  9. "browser_data_received",
  10. "browser_data_sent",
  11. "browser_http_req_duration",
  12. "browser_http_req_failed",
  13. "browser_web_vital_cls",
  14. "browser_web_vital_fcp",
  15. "browser_web_vital_ttfb",
  16. "checks",
  17. "data_received",
  18. "data_sent",
  19. "iteration_duration",
  20. "iterations",
  21. "vus",
  22. "vus_max",
  23. ]);
  24. const lines = text.split("\n");
  25. const result = {};
  26. for (let line of lines) {
  27. line = line.replace(/^[✓×\s]+/, ""); // 去掉开头 ✓ × 空格
  28. if (!line.includes(":")) continue;
  29. let [keyPart, valPart] = line.split(":");
  30. if (!valPart) continue;
  31. const key = keyPart.trim().replace(/\.+$/, "");
  32. if (!keysToKeep.has(key)) continue;
  33. valPart = valPart.trim();
  34. if (/(\w+\()?=/.test(valPart)) {
  35. const stats = {};
  36. const regex = /([^\s=]+)=([^\s]+)/g;
  37. let match;
  38. while ((match = regex.exec(valPart)) !== null) {
  39. stats[match[1]] = match[2];
  40. }
  41. result[key] = stats;
  42. } else {
  43. const parts = valPart.split(/\s+/);
  44. if (parts.length === 4 && parts[2].endsWith("/s")) {
  45. result[key] = {
  46. value: parts[0] + " " + parts[1],
  47. rate: parts[2] + " " + parts[3],
  48. };
  49. } else if (parts.length === 2 && parts[1].endsWith("/s")) {
  50. result[key] = {
  51. value: parts[0],
  52. rate: parts[1],
  53. };
  54. } else {
  55. result[key] = valPart;
  56. }
  57. }
  58. }
  59. return result;
  60. };
  61. exports.watchClient = () => {
  62. const watchPath = path.join(__dirname, '../client/src');
  63. // 初始化 watcher
  64. const watcher = chokidar.watch(watchPath, {
  65. ignored: /(^|[\/\\])\../, // 忽略隐藏文件
  66. persistent: true,
  67. });
  68. // 添加事件监听
  69. watcher
  70. .on("add", (path) => runScript(`新增文件:${path}`))
  71. .on("change", (path) => runScript(`文件修改:${path}`))
  72. .on("unlink", (path) => runScript(`删除文件:${path}`));
  73. // 你想在文件变更后执行的脚本(例如执行某个命令)
  74. function runScript(changeInfo) {
  75. console.log(`[触发] ${changeInfo}`);
  76. // 例如执行 build 脚本或 shell 命令
  77. exec("cd ../client && npm run build", (error, stdout, stderr) => {
  78. if (error) {
  79. console.error(`执行出错: ${error.message}`);
  80. return;
  81. }
  82. if (stderr) {
  83. console.error(`stderr: ${stderr}`);
  84. }
  85. console.log(`stdout: ${stdout}`);
  86. });
  87. }
  88. };