Files
2025-05-30 21:42:44 +08:00

5.3 KiB
Raw Permalink Blame History

中国烟草AI合同及卷宗审核系统 - 图标优化解决方案

🎯 问题描述

原始问题

  1. 首次访问图标不显示: 由于RemixIcon字体文件加载时机问题,首次访问页面时图标可能不显示,需要刷新页面才能正常显示
  2. 内网部署资源依赖: 系统将部署到无法访问外网的内网环境,需要将所有外部资源本地化

技术原因分析

  • 字体加载延迟: 图标字体文件较大(173KB-2.6MB),首次加载时可能在页面渲染后才完成
  • 缓存机制: 浏览器第二次访问时字体文件已被缓存,因此图标能正常显示
  • 外部依赖: 原本通过import "remixicon/fonts/remixicon.css"从npm包导入

解决方案实施

1. 字体文件本地化

# 复制字体文件到public目录
cp node_modules/remixicon/fonts/remixicon.* public/fonts/

复制的文件清单:

  • remixicon.woff2 (173KB) - 现代浏览器优先格式
  • remixicon.woff (237KB) - 广泛兼容格式
  • remixicon.ttf (557KB) - 系统字体备选
  • remixicon.eot (557KB) - IE浏览器支持
  • remixicon.svg (2.6MB) - 旧版浏览器备选

2. CSS文件本地化

创建 app/styles/remixicon-local.css,包含:

@font-face {
  font-family: "remixicon";
  src: url('/fonts/remixicon.eot'); /* IE9*/
  src: url('/fonts/remixicon.eot#iefix') format('embedded-opentype'),
  url("/fonts/remixicon.woff2") format("woff2"),
  url("/fonts/remixicon.woff") format("woff"),
  url('/fonts/remixicon.ttf') format('truetype'),
  url('/fonts/remixicon.svg#remixicon') format('svg');
  font-display: swap; /* 优化字体加载显示策略 */
}

关键优化:

  • 使用本地路径 /fonts/ 替代相对路径
  • 启用 font-display: swap 提供更好的加载体验
  • 包含完整的3000+图标定义

3. 字体预加载优化

app/root.tsxlinks 函数中添加:

export function links() {
  return [
    { rel: "stylesheet", href: styles },
    { rel: "stylesheet", href: remixiconStyles }, // 本地化CSS
    // 预加载关键字体文件,解决首次加载问题
    { rel: "preload", href: "/fonts/remixicon.woff2", as: "font", type: "font/woff2", crossOrigin: "anonymous" },
    { rel: "preload", href: "/fonts/remixicon.woff", as: "font", type: "font/woff", crossOrigin: "anonymous" },
    // ... 其他资源
  ];
}

预加载优势:

  • 确保字体文件在页面渲染前开始下载
  • 优先加载最重要的格式(woff2, woff)
  • 使用 crossOrigin="anonymous" 确保跨域兼容性

4. 移除外部依赖

修改 app/root.tsx:

// 注释掉原始导入
// import "remixicon/fonts/remixicon.css";

// 使用本地化版本
import remixiconStyles from "~/styles/remixicon-local.css?url";

📊 性能对比

优化前

  • 首次加载图标不显示
  • 依赖外部npm包资源
  • 字体文件加载时机随机
  • 无法在内网环境部署

优化后

  • 首次加载图标立即显示
  • 完全本地化,无外部依赖
  • 字体文件预加载,确保及时可用
  • 支持内网部署
  • 更好的字体加载策略(font-display: swap

🔧 技术实现细节

字体加载优化策略

  1. 格式优先级: woff2 > woff > ttf > eot > svg
  2. 预加载顺序: 优先加载woff2和woff格式,覆盖99%+现代浏览器
  3. fallback机制: 提供完整的格式支持链,确保兼容性

浏览器兼容性

  • Chrome/Firefox/Safari: woff2 格式(最优)
  • IE 11+: woff 格式
  • IE 9-10: eot 格式
  • 旧版移动浏览器: svg 格式备选

内网部署优化

  • 所有资源路径使用绝对路径 /fonts/
  • 无CDN或外部API依赖
  • 可通过nginx/Apache等静态服务器直接托管

📋 部署检查清单

服务器配置

  • 确保 public/fonts/ 目录在生产环境中可访问
  • 配置正确的MIME类型支持字体文件:
    location ~* \.(woff2|woff|ttf|eot|svg)$ {
        add_header Access-Control-Allow-Origin *;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
    

性能优化建议

  • 启用gzip压缩减少传输大小(可减少60-80%)
  • 设置合适的缓存策略(建议1年)
  • 如需减小部署包,可删除不需要的字体格式

可选优化

# 仅保留现代浏览器格式(可减少80%+文件大小)
rm public/fonts/remixicon.ttf
rm public/fonts/remixicon.eot  
rm public/fonts/remixicon.svg

🚀 效果验证

使用提供的检查脚本验证优化效果:

powershell -ExecutionPolicy Bypass -File "scripts/check-local-resources.ps1"

预期结果:

  • 所有字体文件本地化完成
  • 无外部依赖检测
  • 构建成功
  • 系统准备好内网部署

📝 维护说明

版本更新

当需要更新RemixIcon版本时:

  1. 更新 package.json 中的 remixicon 版本
  2. 重新复制字体文件到 public/fonts/
  3. 更新 app/styles/remixicon-local.css 中的图标定义

监控建议

  • 定期检查字体文件加载性能
  • 监控首屏渲染时间
  • 验证图标在不同浏览器中的显示效果

总结: 通过字体本地化、预加载优化和加载策略改进,成功解决了图标首次加载问题,并确保系统可在内网环境稳定部署。