From 0d2c81a3ce1be6e988b49017252008456f22765b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Thu, 24 Sep 2026 17:33:02 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=BB=E5=B8=83=E5=AF=BC=E5=87=BA=E7=9A=84?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E5=90=8D=E5=8D=95=E4=B8=80=E6=9D=A5=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/components/image-editor/useImageCanvasAssetExportWorkflow.ts:images / media / 3d_models 三个目录名提成 EXPORT_FOLDER 常量,建目录、挑目录与按层分流共用同一份字面量(写错目录名不会编译报错,只会在 zip 里悄悄换目录) --- .../useImageCanvasAssetExportWorkflow.ts | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/components/image-editor/useImageCanvasAssetExportWorkflow.ts b/src/components/image-editor/useImageCanvasAssetExportWorkflow.ts index aefc6acc3..9009b84dd 100644 --- a/src/components/image-editor/useImageCanvasAssetExportWorkflow.ts +++ b/src/components/image-editor/useImageCanvasAssetExportWorkflow.ts @@ -50,16 +50,29 @@ function hasReadableLayerExportSource(layer: CanvasLayer) { return hasReadableAssetSource(layer.src, layer.objectKey); } -type CanvasAssetExportFolderName = 'images' | 'media' | '3d_models'; +/** + * 导出目录名。名字在「挑目录」「建目录」「按层分流」三处都要用, + * 只留这一份字面量:写错目录名不会编译报错,只会在 zip 里悄悄换目录。 + */ +const EXPORT_FOLDER = { + images: 'images', + media: 'media', + models: '3d_models', +} as const; + +type CanvasAssetExportFolderName = + (typeof EXPORT_FOLDER)[keyof typeof EXPORT_FOLDER]; /** 导出目录按媒体族分:图片 `images/`、音视频 `media/`、3D 模型 `3d_models/`。 */ function resolveLayerExportFolderName( layer: CanvasLayer, ): CanvasAssetExportFolderName { if (layer.assetKind === 'model3d') { - return '3d_models'; + return EXPORT_FOLDER.models; } - return (layer.mediaType ?? 'image') === 'image' ? 'images' : 'media'; + return (layer.mediaType ?? 'image') === 'image' + ? EXPORT_FOLDER.images + : EXPORT_FOLDER.media; } /** zip 目标目录:三类各一个,模型不进图片目录。 */ @@ -67,10 +80,10 @@ function resolveExportTargetFolder( folderName: CanvasAssetExportFolderName, folders: { imagesFolder: JSZip; mediaFolder: JSZip; modelsFolder: JSZip }, ) { - if (folderName === '3d_models') { + if (folderName === EXPORT_FOLDER.models) { return folders.modelsFolder; } - if (folderName === 'media') { + if (folderName === EXPORT_FOLDER.media) { return folders.mediaFolder; } return folders.imagesFolder; @@ -496,11 +509,14 @@ export function useImageCanvasAssetExportWorkflow({ const rootFolderName = `${projectName}-${archiveLabel}`; const zip = new JSZip(); const rootFolder = zip.folder(rootFolderName) ?? zip; - const imagesFolder = rootFolder.folder('images') ?? rootFolder; - const mediaFolder = rootFolder.folder('media') ?? rootFolder; + const imagesFolder = + rootFolder.folder(EXPORT_FOLDER.images) ?? rootFolder; + const mediaFolder = + rootFolder.folder(EXPORT_FOLDER.media) ?? rootFolder; // 3D 资源导出的是模型本体(.glb/.gltf/.fbx),混进 images/ 会让人以为 // zip 里是坏图片,所以单独一个目录。 - const modelsFolder = rootFolder.folder('3d_models') ?? rootFolder; + const modelsFolder = + rootFolder.folder(EXPORT_FOLDER.models) ?? rootFolder; const imageByKey = new Map(); const usedFileNames = new Map(); const plannedKeys = new Set();