Day4:前端路由(进阶篇)

2023-11-15

目标: 持续输出!每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。

主要面向群体:前端开发工程师(初、中、高级)、应届、转行、培训等同学

Day4-今日话题

今天分享的是前端路由的进阶篇,将从路由的实现原理路由懒加载路由预加载等多方面介绍。

路由实现原理

前端路由的实现原理基本上是通过监听浏览器的 URL 变化,然后根据不同的 URL 路径来渲染不同的视图组件,从而实现页面切换和导航。这种机制使得在单页应用(Single Page Application,SPA)中能够实现无需刷新整个页面而只更新部分内容的效果,从而提升用户体验。

主要的原理步骤如下:

1.初始化路由配置 在应用启动时,配置所有可能的路径和其对应的组件,这就构成了路由表。

2.监听 URL 变化 前端框架会监听浏览器的 URL 变化,通常是通过浏览器提供的 popstate 事件或 hashchange 事件来实现。

3.解析 URL 框架会解析当前 URL,提取出路径和可能的查询参数、哈希等信息。

4.匹配路由 框架会根据解析到的路径,在路由表中查找匹配的路由配置。

5.渲染组件 找到匹配的路由配置后,相应的组件会被加载和渲染到页面中,完成页面切换。

6.更新 URL 如果支持历史模式的路由,框架可能会使用 pushState 或 replaceState 方法来更新 URL,以保持 URL 与当前页面状态的一致性。

路由懒加载

路由懒加载(Route Lazy Loading)是一种前端优化技术,它允许在需要时才加载特定页面的代码和资源,以减少初始页面加载时间。懒加载可以提高初始加载速度,因为不会一次性加载所有页面的代码,而是根据需要动态加载。这种技术在单页应用(SPA)中尤其有用,因为它们通常会有多个页面组件。

优点:
  1. 减少初始加载时间: 懒加载只加载当前页面所需的代码,减少了初始加载时间,提高了用户体验。
  2. 降低初始负载: 初始加载的代码量减少,减轻了服务器和网络的负担。
  3. 节省带宽: 懒加载可以避免一次性加载不必要的代码,节省了带宽。
缺点:
  1. 加载延迟: 当用户首次导航到一个新页面时,会产生短暂的加载延迟,因为需要先加载该页面的代码和资源。
  2. 代码分割增加: 如果没有适当地划分代码,可能会导致过多的代码分割,增加了维护的复杂性。
在 Vue 和 React 项目中的实现:

在 Vue2 项目中实现路由懒加载: Vue 提供了 import() 函数,可以在组件需要的时候动态加载代码。这可以通过在路由配置的 component 字段中使用 () => import() 语法来实现。

const routes = [
  {
    path: '/home',
    component: () => import('./views/Home.vue')
  }
];

在 Vue3 项目中实现路由懒加载:

在 Vue 3 中,路由懒加载的实现方式与 Vue 2 有所不同。Vue 3 引入了 defineAsyncComponent 函数来更方便地定义异步组件,这也影响了路由懒加载的写法。以下是在 Vue 3 中实现路由懒加载的示例:

import { createRouter, createWebHistory } from 'vue-router';
import { defineAsyncComponent } from 'vue';

const routes = [
  {
    path'/',
    component: defineAsyncComponent(() => import('./views/Home.vue'))
  },
  {
    path'/about',
    component: defineAsyncComponent(() => import('./views/About.vue'))
  },
  // 其他路由配置
];

const router = createRouter({
  history: createWebHistory(),
  routes
});

export default router;

在这个示例中,我们使用了 Vue 3 提供的 defineAsyncComponent 函数来创建异步组件。在路由配置中,我们将 component 属性的值设置为 defineAsyncComponent 的调用,传入一个返回 import() 的函数,从而实现了路由的懒加载。

在 React 项目中实现路由懒加载: 在 React 中,你可以使用 React.lazy() 函数来实现组件的懒加载。懒加载的组件需要与 Suspense 组件一起使用。

import React, { lazy, Suspense } from 'react';
import { BrowserRouter as Router, Route } from 'react-router-dom';

const Home = lazy(() => import('./views/Home'));

function App({
  return (
    <Router>
      <Suspense fallback={<div>Loading...</div>}>
        <Route path="/home" component={Home} />
      </Suspense>
    </Router>

  );
}

以上的代码示例中,import()React.lazy() 函数会在需要时按需加载对应的组件。在懒加载的组件加载完成之前,可以使用 Suspense 组件来显示加载中的状态。

总的来说,路由懒加载是一种优化技术,允许在需要时才加载页面的代码和资源,以提高初始加载速度。在 Vue 和 React 项目中,你可以通过使用特定的语法和函数来实现懒加载,从而提升应用的性能和用户体验。

路由预加载

路由预加载是一种优化技术,它允许在用户访问特定页面之前预先加载该页面所需的资源,以提升页面切换时的加载速度。通常,当用户浏览某个页面时,前端会在后台异步加载该页面所需的 JavaScript、CSS 和其他资源,以便在用户实际访问该页面时能够更快地呈现内容。

优点:
  1. 提升加载速度: 预加载使得页面的必要资源可以在用户导航到该页面之前提前加载,从而减少实际加载时间。
  2. 提升用户体验: 用户在点击链接或导航到新页面时,页面可以更迅速地展示内容,提升整体用户体验。
  3. 减少延迟: 预加载可以减少网络请求的延迟,因为资源已经在后台加载完毕。
缺点:
  1. 资源浪费: 预加载可能会加载一些用户实际上并不会访问的资源,造成资源浪费。
  2. 网络开销: 如果过度预加载大量页面,可能会增加网络开销和服务器负担。
  3. 性能问题: 如果预加载资源过多或者在不合适的时间加载,可能会影响应用的性能。
在 Vue 和 React 项目中的实现:

在 Vue2 项目中实现路由预加载: Vue 提供了一个特殊的 webpackChunkName 注释,允许你为预加载的 chunk 命名。同时,你可以在路由配置的 meta 字段中设置一个标记,然后在路由导航前使用动态 import() 方法来触发预加载。

const routes = [
  {
    path'/home',
    component() => import(/* webpackChunkName: "home" */ './views/Home.vue'),
    meta: { preloadtrue } // 设置预加载标记
  }
];

router.beforeEach((to, from, next) => {
  if (to.meta.preload) {
    const component = to.component();
    component.then(() => next());
  } else {
    next();
  }
});

在 Vue3 项目中实现路由预加载: 在 Vue 3 中,可以使用异步组件的 defineAsyncComponent 函数来更简洁地实现预加载。同时,Vue Router 也提供了一种更优雅的方式来实现路由预加载。

import { createRouter, createWebHistory } from 'vue-router';
import { defineAsyncComponent } from 'vue';

const routes = [
  {
    path'/home',
    component: defineAsyncComponent(() => import('./views/Home.vue')),
    meta: { preloadtrue } // 设置预加载标记
  },
  // 其他路由配置
];

const router = createRouter({
  history: createWebHistory(),
  routes
});

router.beforeEach(async (to, from, next) => {
  if (to.meta.preload) {
    await to.matched[0].components.default();
  }
  next();
});

export default router;

在这个改进的实现中,我们使用了 Vue 3 的新功能 defineAsyncComponent 来创建异步组件,使代码更简洁。在 beforeEach 钩子中,我们使用 await 关键字来等待组件加载完成。

在 React 项目中实现路由预加载: 在 React 项目中,你可以使用 <link> 标签的 rel 属性来触发预加载。

import React from 'react';
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';

const Home = React.lazy(() => import('./views/Home'));

function App({
  return (
    <Router>
      <nav>
        <Link rel="preload" to="/home">Home</Link>
      </nav>
      <React.Suspense fallback={<div>Loading...</div>}>
        <Route path="/home" component={Home} />
      </React.Suspense>
    </Router>

  );
}

总之,路由预加载是一种优化技术,允许在用户访问特定页面之前预先加载页面所需的资源,以提升页面切换的加载速度和用户体验。在 Vue 和 React 项目中,可以通过配置和使用特定的 API 来实现路由预加载。

下一篇文章将分享React相关的知识点,欢迎点赞、关注、转发~ alt

本文由 mdnice 多平台发布

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Day4:前端路由(进阶篇) 的相关文章

  • 如何发布tms xdata server(sqlite)

    1 在fdconnection中将数据库路径设置成 employee db即可 2 在云服务上创建一个文件夹如d sparkle文件夹 3 复制exe sqlite3 dll employee db 数据库 运行 4 结果
  • html表单填写保存,如何从HTML表单读取输入并将其保存在文件中-Golang

    我试图建立一个非常简单的Web服务器 用户可以在其中访问站点并写入一个字符串和一个整数 然后我想保存这两个输入 我的想法是将其保存到一个文本文件中 该文件也可以显示在浏览器 textfile 我不知道关于SO的规范是多少代码可以发布 但是到
  • 【沧海拾昧】MATLAB/Simulink仿真的基本操作

    C0402 沧海茫茫千钟粟 且拾吾昧一微尘 沧海拾昧集 CuPhoenix 阅前敬告 沧海拾昧集仅做个人学习笔记之用 所述内容不专业不严谨不成体系 如有问题必是本集记录有谬 切勿深究 目录 一 新建Simulink仿真 二 几种常用的模块和

随机推荐

  • 【Android】【移动应用开发】APP案列

    1 通讯录功能实现 页面布局代码如下 activity main xml 主界面布局代码
  • 职场上会用Python的人到底有多牛?

    这个人工智能崛起的时代 似乎人人都在聊 Python 从硬件的芯片层面 物联网 一路杀到云端 大数据 人工智能这些炙手可热的领域 无论什么领域 只要它需要编程 都会有Python的身影 下面就和大家一起来聊聊 Python 的好 到底它牛在
  • python3 tkinter 刷新标签图片

    coding utf 8 import tkinter as tk import os class RuKou tk Frame 登入的入口 将要做成运行时显示接口所返回的图片并展示 def init self master None 在这
  • Linux获取当前时间

    1 Linux下与时间有关的结构体 struct timeval int tv sec int tv usec 其中tv sec是由凌晨开始算起的秒数 tv usec则是微秒 10E 6 second struct timezone int
  • 在Markdown中用LaTeX/KaTeX输入公式-csdn

    在Markdown中用LaTeX输入公式 csdn Markdown语法简洁 LaTeX版面优美 相互配合 可以使用Markdown处理大多数的公式输入 LaTeX的教程中 刘海洋的 LaTeX入门 全面专业 其中第1章第2节的示例 杂谈勾
  • TCP之Delay Ack和Nagle算法

    TCP之Delay Ack和Nagle算法 1 Delay Ack TCP是可靠传输 可靠的核心是收到包后回复一个ack来告诉对方收到了
  • 推挽电路 MOS管、推挽输出和开漏输出

    专题5 硬件设计 之 48 推挽电路驱动MOS管 嵌入式工程师成长之路的博客 CSDN博客 推挽驱动 专题2 电子工程师 之 硬件 之 44 MOS管的功能特点 专题2 电子工程师 之 硬件 之 45 AON6244 MOS管数据手册分析
  • java 判断一个对象是否为空对象

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 最近项目中遇到一个问题 在用户没填数据的时候 我们需要接收从前端传过来的对象为null 但是前端说他们一个一个判断特别麻烦 只能传个空对象过来
  • WEBRTC+windows10+vs2017编译全过程

    1 下载depot tools https storage googleapis com chrome infra depot tools zip 下载后将其解压到相应文件夹中 并将其路径添加到系统的环境变量中 2 自动更新工具 管理员权限
  • 04 ZooKeeperAPI实战

    文章目录 04 ZooKeeperAPI实战 1 IDEA环境搭建 2 zk连接创建与关闭 3 创建节点 4 删除节点 5 获取数据和验证连接转移 6 注册watcher监听和监听事件被触发 7 判断节点是否存在和修改节点 8 判断节点是否
  • 机器人到达终点有几条路径(动态规划)

    无障碍版本 A robot is located at the top left corner of a m x n grid marked Start in the diagram below The robot can only mov
  • Python中的“ @”(@)符号有什么作用?

    我正在看一些使用 符号的Python代码 但我不知道它的作用 我也不知道要搜索什么 因为搜索Python文档时会出现 或者当包含 符号时Google不会返回相关结果 1楼 此代码段 def decorator func return fun
  • FreeRTOS死机原因

    1 中断回调函数中没有使用中断级API xxFromISR 函数 xSemaphoreGiveFromISR uart busy HighterTask 正确 xSemaphoreGive uart busy 错误 2 比configMAX
  • Docker搭建Hadoop集群

    目录 1 拉取centos镜像 2 基础镜像配置 基于centos构建hadoopbase镜像 3 集群环境配置 1 创建3个容器 2 配置网络 3 配置主机和ip的映射关系 4 配置3个节点的免密登录 4 搭建hadoop集群 1 安装h
  • FISCO BCOS——SmartDev-Contract——MarriageEvidence结婚证书合约案例分析

    MarriageEvidence结婚证书合约案例分析 一 合约场景分析 二丶基础合约介绍 1 角色合约 1 功能说明 2 接口说明 3 使用说明 2 存证合约 1 功能说明 2 接口说明 3 使用说明 三丶业务合约介绍 1 结婚证书合约 1
  • 瞬时极性法对正负反馈的判断方法_如何判断放大电路中的反馈及类型?

    负反馈放大器可组合成四种类型 即 电流串联 电流并联 电压串联 电压并联四种负反馈类型 正负反馈的判断 正负反馈的判断使用瞬时极性法 瞬时极性是一种假设的状态 它假设在放大电路的输入端引入一瞬时增加的信号 这个信号通过放大电路和反馈回路回到
  • android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项

    1 Android手机目前常见的分辨率 1 1 手机常见分辨率 4 3 VGA 640 480 Video Graphics Array QVGA 320 240 Quarter VGA HVGA 480 320 Half size VGA
  • 来也科技面试--小白面试日记

    我们所度过的每个平凡的日常 也许就是连续发生的奇迹 1 自我介绍 说得有点少 下面应该再准备的多一点 2 然后问了我不是本专业的 有没有学过数据结构这些 之后就问了算法题这些 3 冒泡排序的时间复杂度为多少 O n n 然后写一下冒泡排序的
  • 在IntelliJ IDEA上将WSDL生成Java代码

    最近接触了一个android项目 但是需要自己用webService的方法获取数据 而且只给了一个wsdl的地址 今天介绍如何利用wsdl生成Java客户端并且进行测试 一 安装一个IntelliJ IDEA Windows平台 自行选择x
  • Day4:前端路由(进阶篇)

    目标 持续输出 每日分享关于web前端常见知识 面试题 性能优化 新技术等方面的内容 主要面向群体 前端开发工程师 初 中 高级 应届 转行 培训等同学 Day4 今日话题 今天分享的是前端路由的进阶篇 将从路由的实现原理 路由懒加载 路由