tools/WeixinBrowserPlugin/URL_DETECTION_OPTIMIZATION.md
原始代码使用 MutationObserver 监听整个文档的DOM变化来检测URL变化:
new MutationObserver(() => {
// URL检测逻辑
}).observe(document, { subtree: true, childList: true });
通过重写 history.pushState 和 history.replaceState 方法,直接监听URL变化:
// 保存原始方法
const originalPushState = history.pushState;
const originalReplaceState = history.replaceState;
// 重写 pushState
history.pushState = function(...args) {
originalPushState.apply(history, args);
handleUrlChange(); // 直接触发URL变化处理
};
// 重写 replaceState
history.replaceState = function(...args) {
originalReplaceState.apply(history, args);
handleUrlChange();
};
// 监听浏览器前进后退
window.addEventListener('popstate', handleUrlChange);
window.addEventListener('hashchange', handleUrlChange);
优势:
如果需要使用 MutationObserver,可以进行以下优化:
// 使用节流减少执行频率
let throttleTimeout = null;
function throttledUrlCheck() {
if (throttleTimeout) return;
throttleTimeout = setTimeout(() => {
// URL检测逻辑
throttleTimeout = null;
}, 100); // 100ms 节流
}
// 只监听 body 的直接子节点变化
new MutationObserver(throttledUrlCheck).observe(document.body, {
childList: true,
subtree: false // 不监听所有后代节点
});
优化点:
同时使用 History API 和优化的 MutationObserver:
// 优先使用 History API
setupHistoryAPIDetection();
// MutationObserver 作为备选
setupOptimizedMutationObserver();
| 方案 | 触发频率 | CPU开销 | 内存占用 | 响应速度 | 兼容性 |
|---|---|---|---|---|---|
| 原始MutationObserver | 很高 | 高 | 中等 | 中等 | 优秀 |
| 优化MutationObserver | 中等 | 中等 | 低 | 中等 | 优秀 |
| History API | 很低 | 很低 | 很低 | 很快 | 良好 |
| 混合方案 | 低 | 低 | 低 | 快 | 优秀 |
新的实现提供了灵活的配置选项:
const URL_DETECTION_CONFIG = {
// 检测方案:'history' | 'mutation' | 'hybrid'
method: 'history',
// 防抖延迟时间(毫秒)
debounceDelay: 500,
// 节流延迟时间(毫秒,仅用于 MutationObserver)
throttleDelay: 100,
// 是否启用调试日志
enableDebugLog: true
};
内置性能监控器,可以实时追踪各种检测方案的调用情况:
// 获取性能统计
window.UrlDetectionPerformanceMonitor.getStats();
// 输出统计信息
window.UrlDetectionPerformanceMonitor.logStats();
// 重置统计
window.UrlDetectionPerformanceMonitor.reset();
提供了专门的性能测试工具:
// 创建测试器
const tester = new UrlDetectionTester();
// 运行性能测试
tester.runFullTest(1000); // 测试1000次迭代
// 开始实时监控
tester.startRealTimeMonitoring();
history 方案,关闭调试日志hybrid 方案,开启调试日志mutation 方案根据测试结果,优化后的方案相比原始实现:
通过采用基于 History API 的URL检测方案,我们成功解决了原始 MutationObserver 方案的性能问题,同时保持了功能的完整性和兼容性。新的实现不仅性能更优,还提供了更好的可配置性和监控能力。