Skip to content

性能优化

Directix v2.2.0 引入了极致性能优化工具,用于减小包体积、提升运行时性能和增强内存效率。

概览

工具描述版本
事件委托管理器全局事件委托减少 DOM 监听器2.2.0
批处理器通用批处理器,支持优先级队列2.2.0
DOM 批量更新器读写分离的 DOM 批量更新2.2.0
虚拟列表优化器动态高度缓存和 VNode 回收2.2.0
内存泄漏检测器自动检测和报告内存泄漏2.2.0
对象池对象池化,支持自动扩容和预热1.11.0+
弱引用缓存基于 WeakMap 的缓存,支持 LRU 淘汰1.11.0+

事件委托管理器

通过将事件委托到公共祖先元素,减少 DOM 事件监听器数量。

基本用法

typescript
import {
  registerDelegatedHandler,
  unregisterDelegatedHandler,
  configureEventDelegation,
} from 'directix'

// 配置(可选)
configureEventDelegation({
  enabled: true,
  root: document, // 或指定容器
  events: ['click', 'touchstart'],
  capture: false,
  maxHandlers: 1000,
})

// 注册委托处理器
const id = registerDelegatedHandler('.dropdown-trigger', 'click', (event, target) => {
  console.log('下拉触发器被点击:', target)
})

// 用完后注销
unregisterDelegatedHandler(id)

API

函数描述
registerDelegatedHandler(selector, event, handler, options?)注册委托处理器,返回 ID
unregisterDelegatedHandler(id)通过 ID 移除处理器
pauseDelegatedHandler(id)暂停但不移除
resumeDelegatedHandler(id)恢复暂停的处理器
getDelegationStats()获取委托统计信息
startDelegation()启动委托
stopDelegation()停止委托(移除根监听器)

批处理器 & DOM 批量更新器

DOMBatchUpdater

分离 DOM 读写操作,避免强制同步布局(布局抖动)。

typescript
import { domRead, domWrite } from 'directix'

// 安排 DOM 读取
domRead(() => {
  const height = element.offsetHeight
  const width = element.offsetWidth

  // 基于读取值安排 DOM 写入
  domWrite(() => {
    element.style.transform = `translate(${width}px, ${height}px)`
  })
})

BatchProcessor

通用批处理器,支持优先级队列,用于分组操作。

typescript
import { BatchProcessor } from 'directix'

const processor = new BatchProcessor<Task, Result>(
  (tasks) => {
    return tasks.map(task => ({
      id: task.id,
      success: true,
      data: processTask(task.data),
      duration: 0,
    }))
  },
  { maxBatchSize: 50, flushInterval: 16, useRAF: true },
)

// 添加任务
processor.add(myTask, 'default', 100)

// 强制刷新
processor.flush()

// 获取统计
processor.getStats()

虚拟列表优化器

通过动态高度缓存和 VNode 回收优化虚拟滚动。

typescript
import { VirtualListOptimizer } from 'directix'

const optimizer = new VirtualListOptimizer({
  bufferSize: 5,
  estimatedItemHeight: 40,
  dynamicHeight: true,
  recyclePoolSize: 100,
})

// 初始化总项目数和容器高度
optimizer.init(10000, 600)

// 缓存已知高度
optimizer.cacheItemHeight(0, 48)
optimizer.cacheItemHeight(1, 72)

// 根据滚动位置计算可见范围
const range = optimizer.calculateVisibleRange(scrollTop)

// 处理滚动事件
const scrollInfo = optimizer.handleScroll(scrollTop)

// 回收和复用 VNode
optimizer.recycleVNode('item-type', vnode)
const recycled = optimizer.acquireRecycledVNode('item-type')

内存泄漏检测器

自动检测和报告应用中的内存泄漏。

基本用法

typescript
import {
  trackResource,
  cleanupResource,
  startLeakDetection,
  getLeakReports,
} from 'directix'

// 启动定期检测
startLeakDetection()

// 跟踪需要清理的资源
const listenerId = trackResource(
  'event-listener',
  'Window 滚动处理器',
  () => window.removeEventListener('scroll', handler),
  { target: window },
)

// 组件卸载时清理
cleanupResource(listenerId)

// 检查泄漏报告
const reports = getLeakReports()
for (const report of reports) {
  console.log(`[${report.severity}] ${report.description}`)
  for (const suggestion of report.suggestions) {
    console.log(`  → ${suggestion}`)
  }
}

增强的对象池

typescript
import { ObjectPool } from 'directix'

const pool = new ObjectPool({
  initialSize: 10,
  maxSize: 100,
  autoExpand: true, // 新增:允许超出 maxSize 扩展
  createFunction: () => ({ x: 0, y: 0 }),
  resetFunction: (obj) => { obj.x = 0; obj.y = 0 },
})

// 预热池(新增)
pool.preWarm(50)

// 增强的统计(新增)
const stats = pool.getStats()
// { poolSize, maxSize, createdCount, availableCount, inUseCount, acquireCount, releaseCount, utilizationRate }

增强的弱引用缓存

typescript
import { WeakCache } from 'directix'

const cache = new WeakCache<HTMLElement, any>(50)

cache.set(element, { computed: true })
cache.get(element)

// 新增:带命中率的缓存统计
const stats = cache.getStats()
// { hitCount, missCount, hitRate, strongCacheSize, maxStrongSize }

基于 MIT 许可发布