传统后端路由与前端路由的区别

83 阅读3分钟

传统后端路由与前端路由的区别

传统后端路由

  1. 页面刷新

    • 每次路由跳转都会向服务器发送请求,服务器返回完整的 HTML 页面。
    • 页面会完全刷新,导致白屏现象。
  2. 用户体验

    • 页面加载速度较慢,用户需要等待服务器响应。
    • 每次跳转都需要重新加载资源,体验不够流畅。
  3. SEO 友好

    • 由于每个页面都有独立的 URL 和 HTML 内容,传统后端路由对搜索引擎更友好。
  4. 实现方式

    • 使用 <a> 标签进行跳转,服务器根据 URL 返回对应的页面。

前端路由

  1. 无刷新跳转

    • 前端路由通过 JavaScript 操作浏览器的 history API 实现 URL 的变化,无需向服务器请求完整页面。
    • 页面局部更新,避免白屏现象。
  2. 用户体验

    • 跳转速度快,页面切换流畅。
    • 资源通常在首次加载时获取,后续跳转只需加载必要的数据。
  3. SEO 挑战

    • 需要配合服务端渲染(SSR)或静态生成(SSG)来优化 SEO。
  4. 实现方式

    • 使用 react-router-dom 等前端路由库,通过 Link 组件或 history.pushState 实现跳转。

底层机制详解

1. hashchange 事件

  • 定义
    hashchange 是浏览器提供的事件,当 URL 的哈希部分(# 后的内容)发生变化时触发。
  • 特点
    • 不会触发页面刷新。
    • 适用于简单的前端路由实现。
  • 示例
    window.addEventListener("hashchange", (event) => {
      event.preventDefault(); // 阻止默认行为
      console.log("Hash changed:", location.hash);
    });
    location.hash = "#about"; // 改变哈希值
    

2. pushStatereplaceState

  • 定义
    pushStatereplaceState 是 HTML5 history API 的方法,用于操作浏览器的历史记录。

  • 区别

    • pushState:添加一个新的历史记录条目。
    • replaceState:替换当前的历史记录条目。
  • 特点

    • 不会触发页面刷新。
    • 可以改变 URL,但不会向服务器发送请求。
  • 示例

    document.querySelector("button").addEventListener("click", (event) => {
      event.preventDefault(); // 阻止默认行为
      history.pushState({ page: 1 }, "Title", "/page1"); // 添加历史记录
    });
    

3. popstate 事件

  • 定义
    当用户点击浏览器的前进或后退按钮时,popstate 事件会触发。

  • 特点

    • 适用于监听用户的历史记录导航行为。
    • 结合 pushStatereplaceState 实现复杂的前端路由。
  • 示例

    window.addEventListener("popstate", (event) => {
      event.preventDefault(); // 阻止默认行为
      console.log("Location changed:", location.pathname);
      console.log("State:", event.state);
    });
    history.pushState({ page: 1 }, "Title", "/page1");
    history.back(); // 触发 popstate
    

对比总结

特性传统后端路由前端路由
页面刷新每次跳转刷新整个页面无刷新,局部更新
用户体验响应慢,白屏现象快速流畅,无白屏
SEO 支持原生支持需配合 SSR 或 SSG
实现复杂度简单,依赖服务器复杂,需前端框架支持
资源加载每次跳转重新加载首次加载后复用资源

总结

通过 hashchangepushStatepopstate 等底层机制,前端路由实现了无刷新页面的跳转和 URL 管理。这种机制不仅提升了用户体验,还为单页应用(SPA)的开发提供了强大的支持。