remix图标本地化
This commit is contained in:
@@ -0,0 +1,168 @@
|
||||
# 中国烟草AI合同及卷宗审核系统 - 图标优化解决方案
|
||||
|
||||
## 🎯 问题描述
|
||||
|
||||
### 原始问题
|
||||
1. **首次访问图标不显示**: 由于RemixIcon字体文件加载时机问题,首次访问页面时图标可能不显示,需要刷新页面才能正常显示
|
||||
2. **内网部署资源依赖**: 系统将部署到无法访问外网的内网环境,需要将所有外部资源本地化
|
||||
|
||||
### 技术原因分析
|
||||
- **字体加载延迟**: 图标字体文件较大(173KB-2.6MB),首次加载时可能在页面渲染后才完成
|
||||
- **缓存机制**: 浏览器第二次访问时字体文件已被缓存,因此图标能正常显示
|
||||
- **外部依赖**: 原本通过`import "remixicon/fonts/remixicon.css"`从npm包导入
|
||||
|
||||
## ✅ 解决方案实施
|
||||
|
||||
### 1. 字体文件本地化
|
||||
```bash
|
||||
# 复制字体文件到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`,包含:
|
||||
|
||||
```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.tsx` 的 `links` 函数中添加:
|
||||
|
||||
```typescript
|
||||
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`:
|
||||
```typescript
|
||||
// 注释掉原始导入
|
||||
// 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类型支持字体文件:
|
||||
```nginx
|
||||
location ~* \.(woff2|woff|ttf|eot|svg)$ {
|
||||
add_header Access-Control-Allow-Origin *;
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
```
|
||||
|
||||
### 性能优化建议
|
||||
- [ ] 启用gzip压缩减少传输大小(可减少60-80%)
|
||||
- [ ] 设置合适的缓存策略(建议1年)
|
||||
- [ ] 如需减小部署包,可删除不需要的字体格式
|
||||
|
||||
### 可选优化
|
||||
```bash
|
||||
# 仅保留现代浏览器格式(可减少80%+文件大小)
|
||||
rm public/fonts/remixicon.ttf
|
||||
rm public/fonts/remixicon.eot
|
||||
rm public/fonts/remixicon.svg
|
||||
```
|
||||
|
||||
## 🚀 效果验证
|
||||
|
||||
使用提供的检查脚本验证优化效果:
|
||||
```bash
|
||||
powershell -ExecutionPolicy Bypass -File "scripts/check-local-resources.ps1"
|
||||
```
|
||||
|
||||
**预期结果:**
|
||||
- ✅ 所有字体文件本地化完成
|
||||
- ✅ 无外部依赖检测
|
||||
- ✅ 构建成功
|
||||
- ✅ 系统准备好内网部署
|
||||
|
||||
## 📝 维护说明
|
||||
|
||||
### 版本更新
|
||||
当需要更新RemixIcon版本时:
|
||||
1. 更新 `package.json` 中的 remixicon 版本
|
||||
2. 重新复制字体文件到 `public/fonts/`
|
||||
3. 更新 `app/styles/remixicon-local.css` 中的图标定义
|
||||
|
||||
### 监控建议
|
||||
- 定期检查字体文件加载性能
|
||||
- 监控首屏渲染时间
|
||||
- 验证图标在不同浏览器中的显示效果
|
||||
|
||||
---
|
||||
|
||||
**总结**: 通过字体本地化、预加载优化和加载策略改进,成功解决了图标首次加载问题,并确保系统可在内网环境稳定部署。
|
||||
Reference in New Issue
Block a user