Day4:前端路由(进阶篇)

news2025/1/15 23:41:53

目标: 持续输出!每日分享关于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 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/926866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

传感网应用开发1+X实训室建方案

一、概述 1.1建设背景 从院校实际教学情况与人才培养计划为出发点&#xff0c;贯彻传感网应用开发1X实训室职业技能等级标准&#xff0c;充分考虑传感网应用开发1X实训室从业人员的职业发展路径与成长路径&#xff0c;以职业素养、职业技能、知识水平为主要框架结构&#xff…

无涯教程-进程 - 镜像

现在&#xff0c;我们已经了解了如何获取进程及其父进程的基本信息&#xff0c;是时候来研究进程信息的细节了。 以下是进程镜像的图形表示。 进程镜像(Process Image)到底是什么? 进程镜像是执行程序时所需的可执行文件&#xff0c;该镜像通常包含以下部分- 代码段或文本片段…

三维模型数据加载速度不理想?这三种加载方式供你选择!

在四维轻云平台的使用过程中&#xff0c;有用户反映三维模型数据加载速度较慢。因此&#xff0c;平台推出了默认方式、质量优先、速度优先三种数据加载方式供用户选择。下面就来简单介绍一下这三种加载方式的特点&#xff0c;用户可根据需求选择合适的数据加载方式。 默认方式…

Django(2)-编写你的第一个 Django 应用

创建一个基本的投票应用程序。 它将由两部分组成&#xff1a; 一个让人们查看和投票的公共站点。 一个让你能添加、修改和删除投票的管理站点。 创建应用 $ python manage.py startapp polls每一个应用是一个python包&#xff0c;一个项目可以包含多个应用。 可以看到生成…

Telegraf 本地代码vscode调试

需要安装的软件&#xff1a; golang 1.20vscodevscode推荐的go插件 在RUN按钮中&#xff0c;创建Launch 自动生成launch.json文件&#xff0c;此处增加了&#xff1a;args参数。 {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions…

JS逆向系列之商指针数据解密

文章目录 声明案例地址y解密算法分析ecryptByPrivateKey 解密算法分析写代码前的流程梳理参考代码往期逆向文章推荐声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! 案例地址 aHR0cDovL…

系统上线安全测评需要做哪些内容?

电力信息系统、航空航天、交通运输、银行金融、地图绘画、政府官网等系统再正式上线前需要做安全测试。避免造成数据泄露从而引起的各种严重问题。 那么系统上线前需要做哪些测试内容呢&#xff1f;下面由我给大家介绍 1、安全机制检测-应用安全 身份鉴别 登录控制模块 应提供…

字节一面:post为什么会发送两次请求?

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;因为在前端开发的日常开发中我们总是会与post请求打交道&#xff0c;一个小小的post请求也是牵扯到很多知识点的&#xff0c;博主在这给大家细细道来。 &#x1f680; 作者…

视频尺寸缩小,一键批量剪辑,轻松制作精简版

大家好&#xff01;在视频剪辑中&#xff0c;有时我们需要将大尺寸的视频缩小&#xff0c;以适应特定的需求和平台要求。为了帮助您轻松制作精简版视频&#xff0c;我们推出了一款全新的工具——视频尺寸缩小批量剪辑软件&#xff01;让您一键批量将视频尺寸缩小&#xff0c;轻…

为什么叫源表?源表是如何四象限工作的?

为何称呼为源表&#xff1f; “源”为电压源和电流源&#xff0c;“表”为测量表&#xff1b; “源表”即指一种可作为四象限的电压源或电流源提供精确的电压或电流&#xff0c;同时可同步测量电流值或电压值的测量仪表。&#xff08;恒流源时测电压&#xff0c;恒压源时测电…

手机盖板IR油墨透光率检测仪T03

手机盖板作为手机最外层玻璃面板&#xff0c;其加工一般有落料、倒边、抛光、镀膜、丝印等多道加工工序组成&#xff0c;其中任何一个工序出现差错&#xff0c;都有可能导致手机盖板产生缺陷&#xff0c;例如漏油、透光、IR孔不良、视窗划伤、油墨区划伤、內污、边花等&#xf…

基于Android水果蔬菜果蔬到家商城系统 微信小程序uniAPP的开发与实现

果蔬到家是商家针对用户必不可少的一个部分。在商铺发展的整个过程中&#xff0c;果蔬到家担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类果蔬到家程序也在不断改进。本课题所设计的springboot基于HBuilder X的果蔬到家APP&#xff0c;使用SpringBoot框架&…

Spring Boot 整合MyBatis-Plus

&#x1f600;前言 本篇博文是关于Spring Boot 整合MyBatis-Plus的&#xff0c;希望你能够喜欢&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的…

Qt 获取文件图标、类型 QFileIconProvider

Qt中获取系统图标、类型是通过QFileIconProvider来实现的&#xff0c;具体如下&#xff1a; 一、Qt获取系统文件图标1、获取文件夹图标QFileIconProvider icon_provider;QIcon icon icon_provider.icon(QFileIconProvider::Folder);2、获取指定文件图标QFileInfo file_info(n…

Qt 自定义提示框 右下角冒泡

网页右下角上经常会出现一些提示性的信息&#xff0c;B/S有的东西&#xff0c;C/S当然也可以有&#xff0c;就像QQ的消息提示一样&#xff01; 实现一个类似的东西并不困难&#xff0c;只要想明白原理实现起来就很简单了&#xff01; 实现原理&#xff1a; &#xff08;1&#…

html实现页面切换、顶部标签栏(可删、可切换,点击左侧超链接出现标签栏)

一、在一个页面&#xff08;不跨页面&#xff09; 效果&#xff1a; 代码 <!DOCTYPE html> <html><head><style>/* 设置标签页外层容器样式 */.tab-container {width: 100%;background-color: #f1f1f1;overflow: hidden;}/* 设置标签页选项卡的样式…

OLED效果设计笔记1:显示横向滚动字幕

本文使用芯片&#xff1a;STM32 F103 C8T6 最小系统板 从这个笔记开始&#xff0c;学习一下OLED的一些显示动画效果的实现&#xff0c;尝试自己能够做出一些接近实际产品的界面切换&#xff0c;动画效果设计~ 文章提供源码&#xff0c;测试效果图&#xff0c;原理介绍&#x…

每日一题:leetcode 1267 统计参与通信的服务器

这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表示没有。 如果两台服务器位于同一行或者同一列&#xff0c;我们就认为它们之间可以进行通信。 请你统计并返回能够与至少一台其他服务…

Python“牵手”搜款网(VVIC)商品列表数据,关键词搜索搜款网API接口数据,搜款网API接口申请指南

搜款网&#xff08;VVIC&#xff09;平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;搜款网API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问搜款网平台的数据&#xff0c;包括商品信息、店铺信息、物流…

Cesium 后台返回的图片如何在代码里生成路径

文章目录 需求分析解决 需求 Cesium 中给地球加皮肤&#xff0c;但是皮肤是后台接口返回的图片&#xff0c;是动态值 分析 我们平常所了解到的贴图&#xff0c;路径只能是静态目录下的图片&#xff0c;而去请求后台的图片时出现了跨域&#xff0c;所以这个方法不可行&#…