用途:该技能用于管理汽车品牌 Logo,主要覆盖 Logo 抓取、网页爬取以及存入 Vercel Blob 存储,代码位于 packages/logos/ 包内。适合在新增汽车品牌 Logo、更新 Logo 来源、调试品牌相关问题时使用。
主要能力与结构:包内分为服务层(fetch.ts、list.ts、download.ts)、基础设施层(Vercel Blob service)以及工具层(normalize.ts 品牌名归一化),并附带 scripts/ 下的 fetch-logos.ts 与 upload-to-blob.ts 脚本。
品牌名归一化:normalizeBrandName 将品牌转为小写、去除首尾空格、把空格替换为连字符、移除非字母数字与连字符字符并去重连字符;另设 BRAND_ALIASES 处理常见变体,如 mercedes 映射为 mercedes-benz、vw 映射为 volkswagen、landrover 映射为 land-rover。
抓取逻辑:getLogoUrl 先归一化品牌名,再查 Redis 缓存(键为 logo:url:品牌名,缓存 7 天);未命中时依次尝试 svg、png、jpg 扩展名,通过 HEAD 请求 CDN 地址,成功即写入缓存并返回 URL,全部失败返回 null。
Blob 存储:LogoBlobService 提供 upload、list、delete;上传路径为 logos/品牌名.png,公开访问且不添加随机后缀,同时写入 Redis 缓存;list 按 logos 前缀列出;delete 删除对应文件并清除缓存。
使用方式:可用 pnpm -F @sgcarstrends/logos fetch-logos 从 CDN 抓取,或 pnpm -F @sgcarstrends/logos scrape-logos 从网站爬取。应用中可导入 getLogoUrl 供 API 路由调用,未找到时返回 404;React 组件中可回退到占位图 /images/logo-placeholder.png。
环境变量:需要配置 BLOB_READ_WRITE_TOKEN,示例值 vercel_blob_token_here。
最佳实践:查询前始终归一化品牌名;采用多层缓存(内存→Redis→Blob);为缺失 Logo 提供占位符;批量操作时使用批量上传。Vercel Blob 的最新文档可通过 Context7 获取,包详情见 packages/logos/AGENTS.md。
限制:资料未提供 Logo CDN 基础地址与 Redis 配置细节,亦未说明抓取源覆盖范围、失败重试与速率限制策略。