vanblog的渲染机制
编辑
2025-06-12
建站教程
00

目录

🎯 什么是渲染?为什么很重要?
📊 渲染原理图解
🔄 为什么需要渲染?
🎭 渲染时机分析
✅ 增量渲染逻辑完整性检查
🎯 文章操作的增量渲染(已优化)
🏷️ 标签操作的增量渲染(已优化)
🎯 activeArticleById 方法的完整覆盖
🏷️ 标签操作的精确渲染
🚀 性能提升效果
🔄 数据一致性保证
📊 渲染策略总结

🎯 什么是渲染?为什么很重要?

渲染 = 把动态数据转换成静态HTML文件的过程

VanBlog使用Next.js的 ISR(Incremental Static Regeneration 增量静态再生成) 技术:

📊 渲染原理图解

graph TB
    subgraph "数据层"
        DB[("MongoDB<br/>2k文章+4w标签")]
        Cache["内存缓存<br/>Tag Provider"]
    end
    
    subgraph "渲染层"
        ISR["ISR Provider<br/>增量静态再生成"]
        WEB["Next.js Website<br/>静态文件生成"]
    end
    
    subgraph "静态文件"
        HTML["HTML页面<br/>• 首页 /<br/>• 文章页 /post/[id]<br/>• 标签页 /tag/[name]<br/>• 分类页 /category/[name]<br/>• 列表页 /page/[p]"]
    end
    
    subgraph "用户访问"
        USER["用户浏览器"]
        CDN["CDN/Nginx<br/>静态文件服务"]
    end
    
    DB --> Cache
    Cache --> ISR
    ISR --> WEB
    WEB --> HTML
    HTML --> CDN
    CDN --> USER
    
    classDef database fill:#ff9999
    classDef render fill:#99ccff  
    classDef static fill:#99ff99
    classDef user fill:#ffcc99
    
    class DB,Cache database
    class ISR,WEB render
    class HTML static
    class USER,CDN user

🔄 为什么需要渲染?

  1. 静态化优势:HTML文件直接提供,比数据库查询快1000倍+
  2. SEO友好:搜索引擎可以直接抓取完整HTML内容
  3. CDN缓存:静态文件可以分发到全球CDN节点
  4. 服务器负载低:不需要每次请求都查数据库

🎭 渲染时机分析

graph TB
    subgraph "需要全量渲染的操作"
        CRON["定时任务每天2AM"]
        INIT["系统初始化"]
        SITE["站点配置变更"]
        MENU["导航菜单变更"]  
        MOMENT["动态管理"]
        CATEGORY["分类管理"]
        LAYOUT["布局设置"]
    end
    
    subgraph "使用增量渲染的操作"
        ARTICLE["文章CRUD-activeArticleById"]
        TAG["标签操作-精确渲染"]
        ABOUT["关于页面-activeAbout"]
        LINK["友链管理-activeLink"]
    end
    
    subgraph "渲染结果"
        FAST["快速更新10-60秒"]
        SLOW["全站重建原10-30分钟"]
    end
    
    CRON --> SLOW
    INIT --> SLOW  
    SITE --> SLOW
    MENU --> SLOW
    MOMENT --> SLOW
    CATEGORY --> SLOW
    LAYOUT --> SLOW
    
    ARTICLE --> FAST
    TAG --> FAST
    ABOUT --> FAST
    LINK --> FAST

✅ 增量渲染逻辑完整性检查

🎯 文章操作的增量渲染(已优化)

typescript
展开代码
// packages/server/src/controller/admin/article/article.controller.ts // ✅ 文章操作使用精确的增量渲染 this.isrProvider.activeArticleById(id, 'update', beforeObj); // 更新 this.isrProvider.activeArticleById(data.id, 'create'); // 创建 this.isrProvider.activeArticleById(id, 'delete', beforeObj); // 删除

activeArticleById方法会精确渲染

  • 文章本身:/post/${id}
  • 相关标签页:/tag/${tagName}
  • 相关分类页:/category/${categoryName}
  • 聚合页面://timeline/tag/category
  • 分页页面:所有/page/[p]页面

🏷️ 标签操作的增量渲染(已优化)

typescript
展开代码
// packages/server/src/controller/admin/tag/tag.controller.ts // ✅ 标签操作使用精确的增量渲染 this.isrProvider.activeUrl('/tag', false); // 标签列表页 this.isrProvider.activePath('tag'); // 所有标签页面 this.isrProvider.activeUrl(`/tag/${encodeURIComponent(name)}`, false); // 特定标签页

🎯 activeArticleById 方法的完整覆盖

当文章发生变化时,会精确渲染以下页面:

  1. 文章相关页面

    • 当前文章:/post/${id}
    • 前一篇文章:/post/${pre.id}
    • 后一篇文章:/post/${next.id}
  2. 标签相关页面

    • 新标签页:/tag/${newTag}(更新后的标签)
    • 旧标签页:/tag/${oldTag}(更新前的标签)
  3. 分类相关页面

    • 新分类页:/category/${newCategory}
    • 旧分类页:/category/${oldCategory}
  4. 聚合页面

    • 首页:/(文章列表)
    • 时间线:/timeline(按时间排序)
    • 标签首页:/tag(所有标签)
    • 分类首页:/category(所有分类)
  5. 分页页面

    • 所有分页:/page/1, /page/2, ...(通过activePath('page')

🏷️ 标签操作的精确渲染

标签同步、重命名、删除操作都只渲染必要的页面:

  • 标签列表页:/tag
  • 特定标签页:/tag/${tagName}
  • 相关标签页:通过activePath('tag')渲染所有标签页

🚀 性能提升效果

优化前(全量渲染)

  • 渲染时间:10-30分钟
  • 渲染页面:2000+页面
  • 服务器负载:极高

优化后(增量渲染)

  • 渲染时间:10-60秒
  • 渲染页面:5-20页面
  • 服务器负载:低

🔄 数据一致性保证

增量渲染不仅性能好,还能保证数据一致性:

  1. 文章变更:相关的所有页面都会更新
  2. 标签变更:包含该标签的所有页面都会更新
  3. 分类变更:该分类下的所有文章页面都会更新
  4. 聚合页面:首页、时间线等始终保持最新

📊 渲染策略总结

text
展开代码
📈 高频操作(已优化为增量渲染): ✅ 文章 CRUD → activeArticleById → 5-20页面 ✅ 标签操作 → 精确渲染 → 1-5页面 ✅ 关于页面 → activeAbout → 1页面 ✅ 友链管理 → activeLink → 1页面 ⚡ 低频操作(保持全量渲染): 📅 定时任务 → 每天1次 → 全站 🔧 站点配置 → 偶尔修改 → 全站 📝 布局设置 → 很少修改 → 全站
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!