Comlink 算力卸载
灵感:能力工具箱 comlink-worker(Comlink 把大数组评分求和丢到后台线程)。
> 小四原创:Comlink.wrap 调 Worker 内 sumScores。
> 仅覆盖「重循环计算」场景;文件解析/OCR 引擎仍属过重项,勿塞进本包。
何时使用
- 列表上千条本地算加权分
- 导入后批量评分怕卡 UI
- Demo 工具箱展示 Worker 卸载
硬约束
- 依赖:
comlink;Worker 内再用Comlink.expose。 - 入参可结构化克隆(纯数据);勿传 DOM/函数进 Worker。
- 组件卸载时
worker.terminate()。 - 实现要点注释标 小四原创。
- 小数据(<1e4)可主线程算;大数组再走 Worker。
- 错误要回到主线程 Toast,勿静默失败。
推荐实现
// worker.ts
import * as Comlink from 'comlink'
// 小四原创:Worker 内求和
export type ScoreApi = {
sumScores: (scores: number[]) => number
weightedAvg: (scores: number[], weights: number[]) => number
}
const api: ScoreApi = {
sumScores(scores) {
let s = 0
for (let i = 0; i < scores.length; i++) s += scores[i] || 0
return s
},
weightedAvg(scores, weights) {
let s = 0
let w = 0
const n = Math.min(scores.length, weights.length)
for (let i = 0; i < n; i++) {
s += (scores[i] || 0) * (weights[i] || 0)
w += weights[i] || 0
}
return w ? s / w : 0
},
}
Comlink.expose(api)
// main.ts
import * as Comlink from 'comlink'
import type { ScoreApi } from './worker'
// 小四原创:主线程代理
export function createScoreWorker() {
const worker = new Worker(new URL('./worker.ts', import.meta.url), {
type: 'module',
})
const api = Comlink.wrap<ScoreApi>(worker)
return {
api,
terminate: () => worker.terminate(),
}
}
Agent 步骤
npm i comlink;按打包器配置 Worker(Vite 可用new URL)。- 大数组评分走
api.sumScores;离开页terminate。 - 自测:1e5 条求和主线程不长时间冻结。
不要做
- 在 Worker 里碰
document/ Vue 实例。 - 把完整 PDF/OCR 引擎塞进本 Skill。
附加
- README.md · reference.md · templates/usage.md