mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-24 08:44:06 +00:00
## Summary Reduces initial module preload from 12.94 MB to 8.24 MB (-4.7 MB, -36%). ## Changes - Split vendor chunks for better cache isolation (firebase, sentry, i18n, zod, etc.) - Exclude heavy optional chunks from initial preload: THREE.js, xterm, tiptap, chart.js, yjs - Lazy load 16 dialog components in dialogService - Add \endor-yjs\ chunk for CRDT library ## Metrics | Metric | Before | After | |--------|--------|-------| | Initial preload | 12.94 MB | 8.24 MB | | vendor-other | 4,006 KB | 2,156 KB | | dialogService | 1,860 KB | 1,304 KB | All excluded chunks still load on-demand when their features are used. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8542-feat-code-splitting-optimization-reduce-initial-bundle-by-36-2fb6d73d36508146aaf7fdaed3274033) by [Unito](https://www.unito.io) --------- Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: github-actions <github-actions@github.com>
71 lines
1.7 KiB
TypeScript
71 lines
1.7 KiB
TypeScript
import { computed, ref, toValue } from 'vue'
|
|
import type { MaybeRefOrGetter } from 'vue'
|
|
|
|
import { SUPPORTED_EXTENSIONS } from '@/extensions/core/load3d/constants'
|
|
import { t } from '@/i18n'
|
|
import { useToastStore } from '@/platform/updates/common/toastStore'
|
|
|
|
interface UseLoad3dDragOptions {
|
|
onModelDrop: (file: File) => void | Promise<void>
|
|
disabled?: MaybeRefOrGetter<boolean>
|
|
}
|
|
|
|
export function useLoad3dDrag(options: UseLoad3dDragOptions) {
|
|
const isDragging = ref(false)
|
|
const dragMessage = ref('')
|
|
|
|
const isDisabled = computed(() => toValue(options.disabled) ?? false)
|
|
|
|
function isValidModelFile(file: File): boolean {
|
|
const fileName = file.name.toLowerCase()
|
|
const extension = fileName.substring(fileName.lastIndexOf('.'))
|
|
return SUPPORTED_EXTENSIONS.has(extension)
|
|
}
|
|
|
|
function handleDragOver(event: DragEvent) {
|
|
if (isDisabled.value) return
|
|
|
|
if (!event.dataTransfer) return
|
|
|
|
const hasFiles = event.dataTransfer.types.includes('Files')
|
|
|
|
if (!hasFiles) return
|
|
|
|
isDragging.value = true
|
|
event.dataTransfer.dropEffect = 'copy'
|
|
dragMessage.value = t('load3d.dropToLoad')
|
|
}
|
|
|
|
function handleDragLeave() {
|
|
isDragging.value = false
|
|
}
|
|
|
|
async function handleDrop(event: DragEvent) {
|
|
isDragging.value = false
|
|
|
|
if (isDisabled.value) return
|
|
|
|
if (!event.dataTransfer) return
|
|
|
|
const files = Array.from(event.dataTransfer.files)
|
|
|
|
if (files.length === 0) return
|
|
|
|
const modelFile = files.find(isValidModelFile)
|
|
|
|
if (modelFile) {
|
|
await options.onModelDrop(modelFile)
|
|
} else {
|
|
useToastStore().addAlert(t('load3d.unsupportedFileType'))
|
|
}
|
|
}
|
|
|
|
return {
|
|
isDragging,
|
|
dragMessage,
|
|
handleDragOver,
|
|
handleDragLeave,
|
|
handleDrop
|
|
}
|
|
}
|