Skip to content

Commit 92d1383

Browse files
committed
perf: ⚡ 只在需要时才创建 worker
1 parent 42a068a commit 92d1383

4 files changed

Lines changed: 47 additions & 26 deletions

File tree

src/components/Manga/actions/imageRecognition.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { unwrap } from 'solid-js/store';
33

44
import type { MainFn } from 'worker/ImageRecognition';
55

6-
import { getImageData, log, throttle, wait } from 'helper';
6+
import { getImageData, log, onec, throttle, wait } from 'helper';
77
import { showCanvas, showColorArea, showGrayList } from 'worker/helper';
88
import * as worker from 'worker/ImageRecognition';
99

@@ -23,6 +23,7 @@ export const handleImgRecognition = async (
2323
imgEle ??= await wait(() => getImgEle(url), 1000);
2424
if (!imgEle) return log.warn('获取图片元素失败');
2525
const { data, width, height } = getImageData(imgEle);
26+
initWorker();
2627
return worker.recognitionImg(
2728
Comlink.transfer(data, [data.buffer]),
2829
width,
@@ -33,12 +34,14 @@ export const handleImgRecognition = async (
3334
}
3435
};
3536

36-
const mainFn = {
37-
log,
38-
updatePageData: throttle(() => setState(updatePageData), 1000),
39-
setImg: (url, key, val) =>
40-
Reflect.has(store.imgMap, url) && setState('imgMap', url, key, val),
41-
} satisfies MainFn;
42-
if (isDevMode)
43-
Object.assign(mainFn, { showCanvas, showColorArea, showGrayList });
44-
worker.setMainFn(Comlink.proxy(mainFn), Object.keys(mainFn));
37+
const initWorker = onec(() => {
38+
const mainFn = {
39+
log,
40+
updatePageData: throttle(() => setState(updatePageData), 1000),
41+
setImg: (url, key, val) =>
42+
Reflect.has(store.imgMap, url) && setState('imgMap', url, key, val),
43+
} satisfies MainFn;
44+
if (isDevMode)
45+
Object.assign(mainFn, { showCanvas, showColorArea, showGrayList });
46+
worker.setMainFn(Comlink.proxy(mainFn), Object.keys(mainFn));
47+
});

src/components/Manga/actions/imageUpscale.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as Comlink from 'comlink';
33
import type { MainFn } from 'worker/ImageUpscale';
44

55
import { toast } from 'components/Toast';
6-
import { createEffectOn, getImageData, log, t, wait } from 'helper';
6+
import { createEffectOn, getImageData, log, onec, t, wait } from 'helper';
77
import { request } from 'request';
88
import * as worker from 'worker/ImageUpscale';
99

@@ -14,6 +14,7 @@ import { activeImgIndex, imgList, isUpscale } from './memo';
1414
export const upscaleImage = async (url: string, imgEle: HTMLImageElement) => {
1515
setState('imgMap', url, 'upscaleUrl', '');
1616
const { data, width, height } = getImageData(imgEle);
17+
initWorker();
1718
await worker.upscaleImage(
1819
Comlink.transfer(data, [data.buffer]),
1920
width,
@@ -105,12 +106,14 @@ const getModel = async () => {
105106
}
106107
};
107108

108-
const mainFn = {
109-
log,
110-
toast,
111-
t,
112-
setImg: (url, key, val) =>
113-
Reflect.has(store.imgMap, url) && setState('imgMap', url, key, val),
114-
getModel,
115-
} satisfies MainFn;
116-
worker.setMainFn(Comlink.proxy(mainFn), Object.keys(mainFn));
109+
const initWorker = onec(() => {
110+
const mainFn = {
111+
log,
112+
toast,
113+
t,
114+
setImg: (url, key, val) =>
115+
Reflect.has(store.imgMap, url) && setState('imgMap', url, key, val),
116+
getModel,
117+
} satisfies MainFn;
118+
worker.setMainFn(Comlink.proxy(mainFn), Object.keys(mainFn));
119+
});

src/helper/other.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,17 @@ export const inRange = (min: number, val: number, max: number) =>
3838
export const approx = (val: number, target: number, range: number) =>
3939
Math.abs(target - val) <= range;
4040

41+
/** 创建一个只会执行一次的函数 */
42+
export const onec = (fn: () => unknown) => {
43+
let hasRun = false;
44+
45+
return () => {
46+
if (hasRun) return;
47+
hasRun = true;
48+
fn();
49+
};
50+
};
51+
4152
/** 创建顺序递增的数组 */
4253
export function range(a: number, b?: number): number[];
4354
export function range<T = number>(a: number, b: (K: number) => T): T[];

src/userscript/detectAd.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as Comlink from 'comlink';
22

3-
import { log, waitImgLoad } from 'helper';
3+
import { log, onec, waitImgLoad } from 'helper';
44
import { request } from 'main';
55
import * as worker from 'worker/detectAd';
66

@@ -81,8 +81,10 @@ export const getAdPageByFileName = (
8181
) =>
8282
getAdPage(fileNameList, (fileName: string) => /^z+/i.test(fileName), adList);
8383

84-
export const isAdImg = (imgBitmap: ImageBitmap) =>
85-
worker.isAdImg(Comlink.transfer(imgBitmap, [imgBitmap]));
84+
export const isAdImg = (imgBitmap: ImageBitmap) => {
85+
initWorker();
86+
return worker.isAdImg(Comlink.transfer(imgBitmap, [imgBitmap]));
87+
};
8688

8789
/** 通过图片内容判断是否是广告 */
8890
export const getAdPageByContent = (
@@ -95,6 +97,8 @@ export const getAdPageByContent = (
9597
adList,
9698
);
9799

98-
const mainFn = { log } satisfies MainFn;
99-
if (isDevMode) Object.assign(mainFn, { showCanvas, showGrayList });
100-
worker.setMainFn(Comlink.proxy(mainFn), Object.keys(mainFn));
100+
const initWorker = onec(() => {
101+
const mainFn = { log } satisfies MainFn;
102+
if (isDevMode) Object.assign(mainFn, { showCanvas, showGrayList });
103+
worker.setMainFn(Comlink.proxy(mainFn), Object.keys(mainFn));
104+
});

0 commit comments

Comments
 (0)