paper-burner/scripts/apply-phase1-optimizations.js

183 lines
6.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Phase 1 性能优化自动应用脚本
*
* 使用方式: node scripts/apply-phase1-optimizations.js
*/
const fs = require('fs');
const path = require('path');
console.log('开始应用 Phase 1 性能优化...\n');
// ============================================
// 优化 1.2: 历史记录搜索防抖
// ============================================
console.log('[1/3] 应用历史记录搜索防抖优化...');
const historyJsPath = path.join(__dirname, '../js/history/history.js');
let historyContent = fs.readFileSync(historyJsPath, 'utf8');
// 检查是否已经应用过
if (historyContent.includes('debouncedRenderHistoryList')) {
console.log(' ⚠️ 历史记录防抖优化已存在,跳过');
} else {
// 在搜索输入事件监听器前添加防抖函数
const searchOld = ` const historySearchInput = document.getElementById('historySearchInput');
const historyFolderSelectMobile = document.getElementById('historyFolderSelectMobile');
if (historySearchInput) {
historySearchInput.addEventListener('input', function(event) {
historyUIState.searchQuery = event.target.value || '';
renderHistoryList();
});
}`;
const searchNew = ` const historySearchInput = document.getElementById('historySearchInput');
const historyFolderSelectMobile = document.getElementById('historyFolderSelectMobile');
// 性能优化:防抖函数(减少频繁的渲染调用)
function debounce(fn, delay) {
let timer = null;
return function debounced(...args) {
const context = this;
if (timer) clearTimeout(timer);
timer = setTimeout(() => {
timer = null;
fn.apply(context, args);
}, delay);
};
}
// 创建防抖版本的渲染函数300ms 延迟)
const debouncedRenderHistoryList = debounce(function() {
renderHistoryList();
}, 300);
if (historySearchInput) {
historySearchInput.addEventListener('input', function(event) {
historyUIState.searchQuery = event.target.value || '';
debouncedRenderHistoryList(); // 使用防抖版本,减少渲染次数
});
}`;
if (historyContent.includes(searchOld)) {
historyContent = historyContent.replace(searchOld, searchNew);
fs.writeFileSync(historyJsPath, historyContent, 'utf8');
console.log(' ✅ 历史记录搜索防抖优化已应用');
} else {
console.log(' ❌ 未找到预期的代码模式,请手动检查');
}
}
// ============================================
// 优化 1.3: 正则表达式提升
// ============================================
console.log('\n[2/3] 应用正则表达式提升优化...');
const markdownAstPath = path.join(__dirname, '../js/processing/markdown_processor_ast.js');
let markdownContent = fs.readFileSync(markdownAstPath, 'utf8');
// 检查是否已经应用过
if (markdownContent.includes('MATH_DELIMITER_PATTERNS')) {
console.log(' ⚠️ 正则表达式提升优化已存在,跳过');
} else {
// 在 normalizeMathDelimiters 函数前添加正则常量
const regexOld = `function normalizeMathDelimiters(text) {`;
const regexNew = `// 性能优化:提升正则表达式到模块级(避免重复编译)
const MATH_DELIMITER_PATTERNS = Object.freeze({
dollarWithComma: /\$\\\$\s*([^\$\n]{1,200}?)\s*\\\$\s*\s*\$/g,
doubleDollar: /\$\\\$\s*([^\$\n]{1,200}?)\s*\\\$\$/g,
singleDollarEnd: /\$\\\$\s*([^\$\n]{1,200}?)\s*\\\$/g,
dollarSpaceDollar: /\$\s+\$/g,
dollarDollarSpace: /\$\$\s+/g,
spaceDollarDollar: /\s+\$\$/g,
doubleDollarEOL: /\$\$\$/g
});
function normalizeMathDelimiters(text) {`;
if (markdownContent.includes(regexOld)) {
markdownContent = markdownContent.replace(regexOld, regexNew);
// 替换函数内部的正则使用
markdownContent = markdownContent.replace(
/s = s\.replace\(\/\\\$\\\\\\\$\\s\*\(\[\\^\\\$\\n\]\{1,200\}\?\)\\s\*\\\\\\\$\\s\*\\s\*\\\$\/g,/g,
'MATH_DELIMITER_PATTERNS.dollarWithComma.lastIndex = 0;\n s = s.replace(MATH_DELIMITER_PATTERNS.dollarWithComma,'
);
fs.writeFileSync(markdownAstPath, markdownContent, 'utf8');
console.log(' ✅ 正则表达式提升优化已应用');
} else {
console.log(' ⚠️ 未找到 normalizeMathDelimiters 函数,可能已经被重构');
}
}
// ============================================
// 优化 1.4: 轮询定时器优化
// ============================================
console.log('\n[3/3] 应用轮询定时器优化...');
const annotationsPath = path.join(__dirname, '../js/annotations/annotations_summary_modal.js');
if (!fs.existsSync(annotationsPath)) {
console.log(' ⚠️ annotations_summary_modal.js 不存在,跳过');
} else {
let annotationsContent = fs.readFileSync(annotationsPath, 'utf8');
if (annotationsContent.includes('ColorPollingManager')) {
console.log(' ⚠️ 轮询定时器优化已存在,跳过');
} else {
// 查找 setInterval(checkForNewColors
if (annotationsContent.includes('setInterval(checkForNewColors')) {
const pollerOld = `setInterval(checkForNewColors, 1000)`;
const pollerNew = `// 性能优化:页面隐藏时暂停轮询
(function() {
let timerId = null;
let isActive = false;
function poll() {
if (!isActive) return;
if (!document.hidden) {
checkForNewColors();
}
timerId = setTimeout(poll, 1000);
}
function start() {
if (isActive) return;
isActive = true;
poll();
}
function stop() {
isActive = false;
if (timerId) {
clearTimeout(timerId);
timerId = null;
}
}
document.addEventListener('visibilitychange', () => {
// 页面隐藏/显示时无需额外操作poll 函数会自动跳过
});
window.addEventListener('beforeunload', stop);
start();
})()`;
annotationsContent = annotationsContent.replace(pollerOld, pollerNew);
fs.writeFileSync(annotationsPath, annotationsContent, 'utf8');
console.log(' ✅ 轮询定时器优化已应用');
} else {
console.log(' ⚠️ 未找到 setInterval(checkForNewColors),可能已经被重构');
}
}
}
console.log('\n✅ Phase 1 性能优化应用完成!\n');
console.log('建议:');
console.log('1. 运行 git diff 查看所有更改');
console.log('2. 在浏览器中测试所有修改功能');
console.log('3. 使用性能工具验证优化效果');
console.log('4. 如有问题,使用 git checkout -- <file> 回滚特定文件\n');