vue-router路由懒加载

这篇具有很好参考价值的文章主要介绍了vue-router路由懒加载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

路由懒加载指的是打包部署时将资源按照对应的页面进行划分,需要的时候加载对应的页面资源,而不是把所有的页面资源打包部署到一块。避免不必要资源加载。(参考vue项目实现路由按需加载(路由懒加载)的3种方式_小胖梅的博客-CSDN博客_vue懒加载 )

// 非懒加载
import Home from '@/components/Home'

const routes = [
  {
    path: '/home',
    name: 'home',
    component: Home
  }
]

这里有三种方式可以实现vue项目路由跳转时资源的按需加载。

1. vue异步组件

  vue-router配置路由,使用vue的异步组件技术,可以实现按需加载。

  但是,这种情况下每一个组件就会生成一个js文件,不能分类指定chunkName

// vue异步组件
{
  path: '/home',
  name: 'home',
  component: resolve => require(['@/components/home'], resolve)
}

2. 使用import

// const 组件名 = () => import('组件路径');
// 下面2行代码,没有指定webpackChunkName,每个组件打包成一个js文件。
const Home = () => import('@/componnets/home');
const Index = () => import('@/components/index');

// 下面2行代码,指定了相同的webpackChunkName,会合并打包成一个js文件
// 把组件按组分块
const Home = () => import(/* webpackChunkName: 'ImportFuncDemo' */ '@/components/home');
const Index = () => import(/* webpackChunkName: 'ImportFuncDemo' */ '@/components/index')

{
  path: '/home',
  name: 'home',
  component: Home
}, {
  path: '/index',
  name: 'index',
  component: Index
}

3. webpack提供的require.ensure()

  该方法也可指定相同的chunkName,合并打包成一个js文件。

{
  path: '/home',
  name: 'home',
  component: r => require.ensure([], () => r(require('@/components/home')), 'demo')
}, {
  path: '/index',
  name: 'index',
  component: r => require.ensure([], () => r(require('@/components/index')), 'demo')
}, {
  path: '/about',
  name: 'about',
  // 传入空字符串 则每个component会单独生成一个js文件
  component: r => require.ensure([], () => r(require('@/components/index')), '')
}

公司后台项目路由懒加载模式修改(新后台vue2.0)

项目背景:老后台(angular1.x版本)正在迁移新后台(vue2.0)

未修改之前:

打完包之后有156个js文件,这是按照每个路由对应的component生成一个js文件,这就意味着到时候老后台全部迁移到新后台之后,目前大概有800个路由,那就会生成800多个js文件,这种模式的路由懒加载对于后台管理系统其实是没有必要的,所以考虑通过webpackChunkName将各个模块分类,一个一级分类指定一个chunkName。

vue-router路由懒加载

修改之后:

打完包只有25个js文件,看起来就舒服多了。

vue-router路由懒加载

各个大模块路由懒加载修改的格式如下:

在一个大的路由模块下,指定相同的webpackChunkName。

vue-router路由懒加载

修改之后打包生成的文件名格式如下:

hash值之前为自己设置的webpackChunkName名称。

vue-router路由懒加载

这里当时遇到的一个问题如下图所示:

vue-router路由懒加载

如左边红框所示,生成的文件里面多了一个用 '~' 拼接起来的js文件。

这个后来翻到了webpack的splitChunks.automaticNameDelimiter。因为项目中在这三个模块下,都引入了同一个文件(UEditor),并且项目中也并没有指定对应的webpackChunkName,所以webpack内部自动处理,将这个文件单独提取出来,并自动命名,命名规则见webpack官方文档,连接符 '~' 是可配置的。

出现  '~' 连接符的组件引入方式如下:

vue-router路由懒加载

修改之后的引入方式如下:

指定了webpackChunkName,以后其他模块引入富文本UEditor时也请按照此方式引入,命名保持相同。

vue-router路由懒加载

以下是webpack官方文档对automaticNameDelimiter配置的解释。

vue-router路由懒加载

vue-router路由懒加载

vue-router核心原理解析:(参考【第2194期】SPA 路由三部曲之核心原理 )

路由描述了URL和UI之间的映射关系,这种映射是单向的,即URL变化引起UI更新(无需刷新页面)。前端路由最主要的展示方式有2种:

  • 带有hash的前端路由:地址栏URL中有 #,即hash值,不好看,但兼容性高。
  • 不带hash的前端路由:地址栏URL中没有 #,好看,但部分浏览器不支持,还需要后端服务器支持。

在vue-router中,这两种展示形式,被定义成两种模式,即Hash模式与History模式。前端路由实现原理很简单,本质上就是检测URL的变化,截获URL地址,通过解析、匹配路由规则实现UI更新。

① Hash模式

一个完整的URL包括:协议、域名、端口、虚拟目录、文件名、参数、锚。

vue-router路由懒加载

Hash值指的是URL地址中的锚部分,也就是# 后面的部分。hash也称作锚点,是用来做页面定位的,与hash值对应的DOM id显示在可视区域内。在HTML5的history新特性出现前,基本都是使用监听hash值来实现前端路由的。hash值更新有一下几个特点:

  • hash值是网页的标志位,HTTP请求不包含锚部分,对后端无影响
  • 因为HTTP请求不包含锚部分,所以hash值改变时,不触发网页重载
  • 改变hash值会改变浏览器的历史纪录
  • 改变hash值会触发window.onhashchange()事件

而改变hash值的方式有3种:

  • a标签使锚点值变化,例:<a href="#/home"></a>
  • 通过设置window.location.hash的值
  • 浏览器前进键(history.forword())、后退键(history.back())

综上所述,这3种改变hash值的方式,并不会导致浏览器向服务器发送请求,浏览器不发出请求,也就不会刷新页面。hash值改变,触发全局的window对象上的hashchange事件。所以hash模式路由就是利用hashchange事件监听URL的变化,从而进行DOM操作来模拟页面跳转。

② History模式

主要应用了History API新增的两个方法:pushState()、replaceState(),均具有操纵浏览器历史记录的能力。

history.pushState(state, title, URL),该方法共接收3个参数:

  • state:用于存储该URL对应的状态对象,可以通过history.state获取
  • title:标题,目前浏览器并不支持
  • URL:定义新的历史URL记录,需要注意,新的URL必须与当前URL同源,不能跨域

pushState函数会向浏览器的历史记录中国添加一条,history.length的值会+1,当前浏览器的URL变成了新的URL。需要注意的是:仅仅将浏览器的URL变成了新的URL,页面不会加载、刷新。

history.replaceState(state, title, URL)

replaceState的使用与pushState非常相似,都是改变当前的URL,页面不刷新。区别在于replaceState是修改了当前的历史记录项而不是新建一个,history.length的值保持不变。

window.onpopstate()

为了配合history.pushState()或者history.replaceState(),HTML5还新增了一个事件,用于监听URL历史记录改变:window.onpopstate。

官方对于window.onpopstate()事件的描述是这样的:

每当处于激活状态的历史记录条目发生变化时,popstate事件就会在对应的window对象上触发。如果当前处于激活状态的历史记录条目是由history.pushState()方法创建,或者由history.replaceState()方法修改过的,则popstate事件对象的state属性包含了这个历史记录条目的state对象的一个拷贝。调用history.pushState()或者history.replaceState()不会触发popstate事件。popstate事件只会在浏览器某些行为下触发,比如点击后退、前进按钮(或者在Javascript中调用 history.back()、history.foward()、history.go()方法),此外,a标签的锚点也会触发该事件。

结合上述,在浏览器支持 pushState 的情况下,hash 模式路由也可以使用 pushState 、replaceState 和 popstate 实现。pushstate 改变 hash 值,进行跳转,popstate 监听 hash 值的变化。小小的剧透,vue-router 中不管是 hash 模式,还是 history 模式,只要浏览器支持 history 的新特性,使用的都是 history 的新特性进行跳转。文章来源地址https://www.toymoban.com/news/detail-402300.html

到了这里,关于vue-router路由懒加载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • vue-router(路由)详细教程

    路由是一个比较广义和抽象的概念,路由的本质就是 对应关系 。 在开发中,路由分为: ​ 后端路由 ​ 前端路由 后端路由 概念:根据不同的用户 URL 请求,返回不同的内容 本质:URL 请求地址与服务器资源之间的对应关系 [外链图片转存失败,源站可能有防盗链机制,建议将

    2024年02月04日
    浏览(11)
  • 【Vue-Router】路由传参

    【Vue-Router】路由传参

    list.json login.vue reg.vue App.vue index.ts reg.vue item?.name ,item?.price ,item?.id ,他们如果不使用可选链操作符会出现报错: \\\'__VLS_ctx.item\\\' is possibly \\\'undefined\\\'. login.vue 注意: 传递 params 参数时,若使用 to 的对象写法,必须使用 name 配置项,不能用 path 。 传递 params 参数时,需要提前在规

    2024年02月13日
    浏览(10)
  • vue-router路由模式详解

    vue-router路由模式详解

    目录 一. vue-router(前端路由)有两种模式,hash模式和history模式 二、路由模式解析 三、两种模式的区别 1、hash模式  2、history路由 (3)popstate实现history路由拦截,监听页面返回事件 一. vue-router(前端路由)有两种模式,hash模式和history模式 1.hash 就是指 url 后面的 # 号以及后

    2024年02月03日
    浏览(17)
  • vue3使用vue-router嵌套路由(多级路由)

    vue3使用vue-router嵌套路由(多级路由)

    Vue3 嵌套路由的使用和 Vue2 相差不大,主要的区别是 Vue3 的路由实例化使用了 createApp() 方法,所以实例化路由时需要传入根组件。另外,Vue3 的路由对象除了包含 Vue2 中的导航守卫、导航钩子和解析守卫等功能外,还新增了 meta prop 和 route prop。 在使用嵌套路由时,建议将路由

    2024年02月03日
    浏览(10)
  • Vue3配置路由(vue-router)

    Vue3配置路由(vue-router)

    紧接上篇文章,vue3的配置与vue2是有所差别的,本文就讲述了如何配置,如果本文对你有所帮助请三连支持博主。 下面案例可供参考 使用npm命令进行安装 : npm install vue-router@4 完成后我们打开项目根目录下的 package.json 文件: 如下即为成功 这里创建 view目录,然后在view目录

    2023年04月12日
    浏览(13)
  • 路由,vue-router的基本用法,vue-router的常见用法$route.params、$router.push、$router.replace、$router.go

    路由,vue-router的基本用法,vue-router的常见用法$route.params、$router.push、$router.replace、$router.go

    路由(英文: router)就是 对应关系 。 SPA指的是一个web网站只有唯一的一个HTML页面, 所有组件的展示与切换 都在这唯一的一个页面内完成。此时, 不同组件之间的切换 需要通过 前端路由 来实现。 *结论:*在SPA项目中, 不同功能之间的切换 ,要 依赖于前端路由 来完成! 通俗

    2024年01月16日
    浏览(15)
  • 5.10 Vue配置路由(vue-router)

    5.10 Vue配置路由(vue-router)

    官方网站:https://v3.router.vuejs.org/zh/installation Vue Router 是 Vue.js 官方提供的一种路由管理工具,它可以帮助开发者管理 Vue.js 应用程序的路由,并实现路由跳转、参数传递、嵌套路由等功能。Vue Router 可以将一个单页面应用分成多个视图,在不同的路由之间进行切换,从而实现了

    2024年02月08日
    浏览(14)
  • Vue3的vue-router路由详解

    Vue3的vue-router路由详解

    这篇文章是接着【三分钟快速搭建Vue3+webpack项目】的内容做的开发,有基础的可以跳过 【三分钟快速搭建Vue3+webpack项目】,直接看以下的内容。 Vue3的vue-router路由详解: 首先安装路由依赖模块: 所需代码文件如下图: 图1   所需要的主要文件: index.html、index.js、App.vue in

    2024年02月01日
    浏览(10)
  • vue-router 路由元信息meta

    meta原信息是一个可以给路由记录携带一个对象的字段(字段名只能为meta,其他的设置了也没用),你可以在这个字段里存一些信息,例如该路由地址是否需要身份验证、该地址是否需要导航栏等。 获取方式如下: vue-router官方例子如下,是一个根据meta判断该路径是否需要验

    2024年02月13日
    浏览(10)
  • Vue-Router(4) 学习之动态路由二

    1. 动态路由表 dynamic_routes 说明:depthFlagArr,show_ivl_menu 是判断是否加载路由的标识 2. 路由控制 private_routes.ts 使用pinia作为全局store,控制包括路由权限、userinfo、token等动态信息   3. 菜单栏 显示在左侧的导航栏 4. 问题思考         4.1 动态路由刷新404         4.2 动态路由与

    2024年02月12日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包