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;