优化代码 /// <reference path="../../../dts/dayjs.d.ts" /> /// <reference path="../../../dts/chrome.d.ts" /> // 异常考勤列表查询url const exception_url = "https://cchr-edge-oa-cc.bcsoa.cmbchina.cn/Edge/api/cchr.attendanceserver.sys.attendanceexception.attendanceexceptionservice/getExceptionListForSubmission?attendancePeriod="; // 邮件搜索url const mail_search_url = "https://saas-mail-gateway.paasoa.cmbchina.cn/webmail/api/mailsearch/advance"; // 发送页内消息 const send = (type, key, msg) => { window.postMessage( { type, key, msg }, "https://attendance.bcsoa.cmbchina.cn" ); }; let periodStart, periodEnd, curMonth, curYear; document.addEventListener("DOMContentLoaded", () => { console.log("attendance-helper"); const script = document.createElement("script"); script.src = chrome.runtime.getURL("static/js/injectGlobalHook.js"); document.head.appendChild(script); const message = new Message(); const getMailContent = (keys = []) => { if (!keys?.length) { return; } const reg = new RegExp( `^【阅知】关于申请(${curMonth}月\\d{1,2}日)延时服务的说明.*$` ); chrome.runtime.sendMessage( { type: "fetchJson", data: [ mail_search_url, { method: "POST", headers: { "Content-Type": "application/json", }, body: `{"subject":"延时服务","body":"","attachName":"","folder":3,"subFolder":true,"sender":"","receiver":"","size":"","beginDate":"${periodStart.substring( 0, 10 )}","endDate":"${periodEnd.substring( 0, 10 )}","attached":null,"read":null,"star":null,"importance":null,"order":"receivedDate","desc":true,"pageIndex":1,"pageSize":50}`, }, ], }, async ({ success, errorCode, message: msg, data } = {}) => { if (errorCode === "UNAUTHORIZED") { message.info("邮箱未登录!"); return; } if (!success) { message.error(`邮件拉取失败:${msg}`); return; } if (!data?.list?.length) { message.success("暂无加班邮件数据!"); return; } data.list .sort( ({ sendDate: s1 }, { sendDate: s2 }) => dayjs(s2).valueOf() - dayjs(s1).valueOf() ) .forEach(async ({ fid, mid, subject }) => { if (reg.test(subject)) { const dateStr = RegExp.$1; const dateKey = dayjs( `${curYear}年${dateStr}`, "YYYY年MM月DD日" ).format("YYYY-MM-DD 00:00:00"); if (keys.includes(dateKey)) { const { data: { content } = {} } = await chrome.runtime.sendMessage({ type: "fetchJson", data: [ `https://saas-mail-gateway.paasoa.cmbchina.cn/webmail/api/mailinfo/read?_=${dayjs().format( "X" )}&id=${mid}&fid=${fid}`, {}, ], }); const key = `tr[data-row-key='${dateKey}']`; send( "rest", `${key} .ant-input-number-handler-down` ); send( "memo", `${key} textarea`, content .replace(/<[^>]*>/g, "") .replace(/\s/g, "") .replace( new RegExp( `.*因(.*),申请${dateStr}延时服务[\\d.]+小时,烦请批准。.*` ), "$1" ) ); } } }); send("approver", ".approver .ant-select-selector"); } ); }; const showExceptions = () => { // 打卡信息异常信息拉取 const end = dayjs(); const days = end.daysInMonth(); const monthList = [end]; if (days < 10) { monthList.push(end.subtract(1, "months").startOf("month")); monthList.reverse(); } Promise.all( monthList.map((day) => chrome.runtime.sendMessage({ type: "fetchJson", data: [exception_url + day.format("YYYY-MM-01")], }) ) ).then((arr) => { const exceptionList = arr .map((item) => item.data.exceptionList) .flat() .map( ({ workingDate, attendanceType }) => workingDate.substring(0, 10) + ": " + attendanceType ) .join("\n"); if (exceptionList) { alert(exceptionList); } else { message.success("OK!"); } }); }; const dealXHRResponse = ({ detail: { type, msg } }) => { if (!/^(getCurrentPeriod|getOverTimeList)$/.test(type)) { return; } const { returnCode, data: { endAttendancePeriod, month, startAttendancePeriod, year, overtimeItemVoList, }, } = JSON.parse(msg); if (returnCode === "0000") { if ("getCurrentPeriod" === type) { periodStart = startAttendancePeriod; periodEnd = endAttendancePeriod; curMonth = month; curYear = year; } if ("getOverTimeList" === type) { getMailContent( overtimeItemVoList?.map(({ workingDate }) => workingDate) ); } } }; window.addEventListener("ajaxLoad", dealXHRResponse); window.onload = showExceptions; });
时间: 2025-08-21 20:27:15 浏览: 3
<think>好的,我需要分析用户提供的这段JavaScript代码,并尝试进行优化。首先,我会仔细阅读代码,理解它的功能和结构。这段代码似乎是一个浏览器扩展脚本,用于处理考勤异常和邮件数据。主要功能包括获取异常考勤列表、搜索特定邮件内容,并在页面上进行相关操作。接下来,我需要找出可能的优化点,比如重复代码、异步处理、性能问题等。
首先,代码中有一些重复的URL字符串,可以考虑将它们提取为常量,方便维护。例如,mail_search_url和exception_url已经是常量,但其他URL部分可能也有重复。另外,发送消息的send函数多次被调用,可以进一步封装以增强可读性。
接下来,处理邮件内容的部分使用了正则表达式,可能存在性能问题,特别是当邮件数量较多时。可以考虑预编译正则表达式,避免在循环中重复创建。此外,异步操作中的Promise处理可能需要更好的错误处理机制,避免未捕获的异常。
DOM事件监听部分,事件处理函数dealXHRResponse中使用了正则表达式来检查类型,可能会影响性能。可以考虑使用更高效的条件判断方式。同时,全局变量的使用如periodStart、curMonth等,可能导致状态管理混乱,建议将这些变量封装到一个对象中,提高代码的可维护性。
代码中的异步请求使用了chrome.runtime.sendMessage,这些请求是并行发送的,但处理结果时使用了Promise.all。需要确保这些请求的顺序和错误处理得当。此外,邮件列表的排序和处理可能在数据量大时影响性能,可以考虑分页加载或分批处理。代码的可读性方面,部分逻辑较为复杂,比如在getMailContent函数中的嵌套回调。可以考虑使用async/await来扁平化代码结构,使其更易读。另外,代码中的字符串拼接较多,容易出错,可以使用模板字符串来提高可读性。最后,异常处理和日志记录不足,代码中虽然有message.info和message.error的调用,但可能不够全面。需要增加更多的错误捕获和日志输出,方便调试和问题追踪。
综合以上分析,优化点包括:提取常量、封装重复逻辑、优化正则表达式、改进异步处理、增强错误处理、提高代码可读性等。下面将根据这些点进行具体的代码优化。</think>以下是针对该浏览器扩展脚本的优化方案,主要从代码结构、性能优化和可维护性三个方面进行改进:
1. 常量与配置提取优化:
```javascript
// 提取常量配置
const CONFIG = {
EXCEPTION_URL: "https://cchr-edge-oa-cc.bcsoa.cmbchina.cn/Edge/api/cchr.attendanceserver.sys.attendanceexception.attendanceexceptionservice/getExceptionListForSubmission",
MAIL_API_BASE: "https://saas-mail-gateway.paasoa.cmbchina.cn/webmail/api",
DATE_FORMAT: {
SHORT: "YYYY-MM-DD",
LONG: "YYYY-MM-DD HH:mm:ss"
},
REGEX: {
MAIL_SUBJECT: /^【阅知】关于申请(\d{1,2}月\d{1,2}日)延时服务的说明.*$/,
MAIL_CONTENT: /因(.*),申请(\d{1,2}月\d{1,2}日)延时服务[\d.]+小时/
}
};
```
2. 核心逻辑优化(异步处理部分):
```javascript
// 使用 async/await 重构异步流程
const fetchWithRetry = async (url, options, retries = 3) => {
for (let i = 0; i < retries; i++) {
try {
const response = await chrome.runtime.sendMessage({
type: "fetchJson",
data: [url, options]
});
if (response?.success) return response;
} catch (error) {
if (i === retries - 1) throw error;
await new Promise(r => setTimeout(r, 1000 * (i + 1)));
}
}
return null;
};
const processMailContent = (content, dateStr) => {
const cleaned = content
.replace(/<[^>]*>/g, "")
.replace(/\s/g, "");
return cleaned.match(CONFIG.REGEX.MAIL_CONTENT)?.[1] || "未匹配到原因";
};
```
3. 性能优化(缓存和预处理):
```javascript
// 预处理日期相关数据
const prepareDateInfo = (month, year) => {
const baseDate = dayjs().year(year).month(month - 1);
return {
periodStart: baseDate.startOf('month').format(CONFIG.DATE_FORMAT.LONG),
periodEnd: baseDate.endOf('month').format(CONFIG.DATE_FORMAT.LONG),
dateKeys: Array.from({length: baseDate.daysInMonth()}, (_, i) =>
baseDate.date(i+1).format(CONFIG.DATE_FORMAT.LONG))
};
};
// 使用 WeakMap 缓存 DOM 查询
const domCache = new WeakMap();
const getCachedElement = (selector) => {
if (!domCache.has(selector)) {
domCache.set(selector, document.querySelector(selector));
}
return domCache.get(selector);
};
```
优化说明:
1. 将散落的常量集中管理,提高可维护性
2. 使用异步重试机制增强请求可靠性
3. 提前预处理日期数据减少重复计算
4. 采用WeakMap缓存DOM查询结果
5. 使用更精确的正则表达式优化匹配性能
6. 将业务逻辑拆分为独立函数提高可测试性
阅读全文
相关推荐


















