File size: 4,052 Bytes
27131f4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
/**
* 生产环境矢量图形导出配置
* 统一管理所有矢量图形导出相关的配置参数
*/
// 环境检测
export const ENVIRONMENT = {
isProduction: () => process.env.NODE_ENV === 'production',
isHuggingface: () => {
if (typeof window === 'undefined') return false;
return (
window.location.hostname.includes('hf.space') ||
window.location.hostname.includes('huggingface.co')
);
},
isDevelopment: () => process.env.NODE_ENV === 'development'
};
// 性能配置
export const PERFORMANCE_CONFIG = {
// 渲染超时时间(毫秒)
RENDER_TIMEOUT: ENVIRONMENT.isProduction() ? 10000 : 15000,
// Canvas渲染配置
CANVAS: {
DEFAULT_SCALE: ENVIRONMENT.isHuggingface() ? 1 : 2,
MAX_SCALE: 4,
QUALITY: 0.9,
BACKGROUND_COLOR: null
},
// SVG处理配置
SVG: {
MAX_SIZE_BYTES: 1024 * 1024, // 1MB
MIN_DIMENSION: 1,
MAX_DIMENSION: 4096,
SERIALIZATION_TIMEOUT: 5000
},
// 性能监控
MONITORING: {
ENABLED: ENVIRONMENT.isProduction(),
MAX_METRICS_COUNT: 100,
OPERATIONS: {
SVG_TO_BASE64: 'svg2base64',
CANVAS_RENDER: 'canvas_render',
HTML_EXPORT: 'html_export',
DIMENSION_CHECK: 'dimension_check'
}
}
};
// 错误处理配置
export const ERROR_CONFIG = {
// 重试配置
RETRY: {
MAX_ATTEMPTS: 3,
DELAY_MS: 1000,
BACKOFF_MULTIPLIER: 2
},
// 降级策略
FALLBACK: {
ENABLE_CANVAS_FALLBACK: true,
ENABLE_SIMPLIFIED_SVG: true,
ENABLE_PLACEHOLDER: true,
PLACEHOLDER_COLOR: '#f5f5f5',
PLACEHOLDER_TEXT: 'Vector'
},
// 日志配置
LOGGING: {
VERBOSE: !ENVIRONMENT.isProduction(),
ERROR_ONLY: ENVIRONMENT.isProduction(),
INCLUDE_STACK_TRACE: !ENVIRONMENT.isProduction()
}
};
// 导出格式配置
export const EXPORT_CONFIG = {
// HTML导出
HTML: {
INCLUDE_INLINE_SVG: true,
OPTIMIZE_SVG_SIZE: true,
REMOVE_VECTOR_EFFECTS: true,
ENSURE_NAMESPACES: true
},
// 图像导出
IMAGE: {
DEFAULT_FORMAT: 'png' as const,
SUPPORTED_FORMATS: ['png', 'jpeg', 'webp'] as const,
DEFAULT_QUALITY: 0.9,
USE_CORS: true
},
// Base64配置
BASE64: {
PREFIX: 'data:image/svg+xml;base64,',
ENCODING: 'utf-8' as const,
VALIDATE_OUTPUT: true,
MIN_LENGTH: 100
}
};
// 兼容性配置
export const COMPATIBILITY_CONFIG = {
// 浏览器特性检测
FEATURES: {
CANVAS_SUPPORT: () => {
try {
const canvas = document.createElement('canvas');
return !!(canvas.getContext && canvas.getContext('2d'));
} catch {
return false;
}
},
SVG_SUPPORT: () => {
try {
return !!(document.createElementNS &&
document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect);
} catch {
return false;
}
},
BLOB_SUPPORT: () => {
try {
return typeof Blob !== 'undefined';
} catch {
return false;
}
}
},
// 平台特定优化
PLATFORM_OPTIMIZATIONS: {
HUGGINGFACE: {
PREFER_SIMPLE_RENDERING: true,
REDUCE_LOGGING: true,
OPTIMIZE_MEMORY: true,
USE_MINIMAL_FALLBACKS: true
},
MOBILE: {
REDUCE_SCALE: true,
OPTIMIZE_PERFORMANCE: true,
LIMIT_CONCURRENT_RENDERS: true
}
}
};
// 验证配置
export const VALIDATION_CONFIG = {
DIMENSIONS: {
MIN_WIDTH: 1,
MIN_HEIGHT: 1,
MAX_WIDTH: 8192,
MAX_HEIGHT: 8192
},
SVG_ATTRIBUTES: {
REQUIRED: ['xmlns'],
FORBIDDEN: ['vector-effect'],
OPTIONAL: ['viewBox', 'width', 'height']
},
OUTPUT: {
MIN_BASE64_LENGTH: 50,
MAX_BASE64_LENGTH: 10 * 1024 * 1024, // 10MB
VALID_PREFIXES: ['data:image/svg+xml;base64,', 'data:image/png;base64,']
}
};
// 导出统一配置对象
export const VECTOR_EXPORT_CONFIG = {
ENVIRONMENT,
PERFORMANCE_CONFIG,
ERROR_CONFIG,
EXPORT_CONFIG,
COMPATIBILITY_CONFIG,
VALIDATION_CONFIG
} as const;
export default VECTOR_EXPORT_CONFIG; |