画布导出的目录名单一来源

- src/components/image-editor/useImageCanvasAssetExportWorkflow.ts:images / media / 3d_models 三个目录名提成 EXPORT_FOLDER 常量,建目录、挑目录与按层分流共用同一份字面量(写错目录名不会编译报错,只会在 zip 里悄悄换目录)
This commit is contained in:
2026-09-24 17:33:02 +08:00
parent 9c2a9383fc
commit 0d2c81a3ce
@@ -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<string, CanvasAssetExportImage>();
const usedFileNames = new Map<string, number>();
const plannedKeys = new Set<string>();