feat: implement async file hash calculation using web workers for improved performance

This commit is contained in:
keven1024
2025-06-21 22:41:19 +08:00
parent 7f5149566c
commit 41e9df5ee8
3 changed files with 26 additions and 2 deletions

View File

@@ -2,9 +2,10 @@
import CircularProgress from '@/components/CircularProgress.vue'
import { chunk, get, shuffle, times } from 'lodash-es'
import { cx } from 'class-variance-authority'
import calcFileHash from '@/lib/calcFileHash'
import { filesize } from 'filesize'
import { toast } from 'vue-sonner'
import asyncWorker from '~/lib/asyncWorker'
import calcFileHashWorker from '~/lib/calcFileHashWorker?worker'
const props = defineProps<{
data: { file: File; config: any; handle_type: string }
}>()
@@ -34,7 +35,8 @@ const { error } = useAsyncState(async () => {
if (!file) return
const { size, type = 'application/octet-stream' } = file || {}
const now = Date.now()
const hash = await calcFileHash({ file })
const res = await asyncWorker(calcFileHashWorker, { data: { file } })
const { hash } = res?.data || {}
if (hash) {
step.value = 'upload'
calcHashTime.value = Date.now() - now

14
front/lib/asyncWorker.ts Normal file
View File

@@ -0,0 +1,14 @@
const asyncWorker = (w: new () => Worker, opts: { data: any }) => {
const { data } = opts || {}
return new Promise<MessageEvent>((resolve, reject) => {
const worker = new w()
worker.postMessage(data || {})
worker.onmessage = (e: MessageEvent) => {
resolve(e)
}
worker.onerror = (e: ErrorEvent) => {
reject(e)
}
})
}
export default asyncWorker

View File

@@ -0,0 +1,8 @@
import calcFileHash from './calcFileHash'
// 监听主线程消息
self.onmessage = async (e: MessageEvent<{ file: File }>) => {
const { file } = e.data || {}
const hash = await calcFileHash({ file })
self.postMessage({ hash })
}