vue懒加载组件怎样使用,有什么要注意的
Admin 2022-09-13 群英技术资讯 634 次浏览
今天这篇给大家分享的知识是“vue懒加载组件怎样使用,有什么要注意的”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,对此分享发大家做个参考,希望这篇“vue懒加载组件怎样使用,有什么要注意的”文章能帮助大家解决问题。前端开发中,随着业务和页面增加,以组件为基本单位的结构下,组件数量会增长极快,为了优化我们会很显然地想要进行一些工作:
非必要资源,指的首次渲染出某页面所不必要的资源,如因为用户操作才出现的图片、弹窗等。
代码分块和懒加载在页面层面具有极大的优化作用,用户很可能只是浏览dashboard页面,可能根本就不会去看详情等页面,那我们就不必将详情页面的代码和dashboard页面代码混在一起,用户看某个页面时只加载那个页面对应的资源即可,可以较大地提升用户体验。本文就在Vue工程下如何在组件层面配置代码分块和懒加载进行讲解。
本文在@vue/cli 3以上版本。
一般来说,Vue中使用某组件过程大致如下:
<script>
// Home.vue
import HelloWorld from '@/components/HelloWorld.vue'
export default {
components: {
HelloWorld,
},
}
</script>
这是我们最熟悉的方式了,我们在访问Home.vue时,Webpack为我们保证了HelloWorld.vue一定是存在的,这是由依赖关系决定的(Home.vue依赖于HelloWorld.vue)。
这很正常对吧,但是如果HelloWorld.vue是非必要资源呢,比如需要用户点击一个按钮才会出现的弹窗或者是默认隐藏的内容,只当某些条件触发时才出现的页面区域呢?如果是上述情况,当我们访问Home.vue时显然没必要马上就将HelloWorld.vue请求过来,而且配置方法也及其简单:
<template>
<div class="home">
<button @click="() => showHello = true">Hello</button>
<HelloWorld v-if="showHello" />
</div>
</template>
<script>
// Home.vue
export default {
components: {
HelloWorld: () => import('@/components/HelloWorld.vue'), // A
},
data() {
return {
showHello: false,
}
},
}
</script>
只需像A行一样简单处理一下即可一举两得:HelloWorld.vue会被打包成独立为单独的js文件,而且只有当我们点击按钮时,这个独立的js文件才会被请求,这样能够减小主代码块的体积。
简单分析一下:import()会返回一个组件Promise,现在基本上所有的打包工具都理解此语法,而且还会触发Webpack的代码分块(Webpack 2之后)。
注意:Vue不会在意某个组件,直到它要被渲染出来。以上例来说,只有当我们触发了按钮,HelloWorld.vue才有了意义。
即使所有组件都可以配置懒加载,但是别滥用,大部分情况下只对非必要资源配置懒加载即可,像上例如果HelloWorld.vue是Home.vue中是一直存在的,那样配置懒加载可能会适得其反,加载了Home.vue对应的js文件后会马上请求HelloWorld.vue对应的js文件,如果HelloWorld.vue对应的js文件比较小,那得到的收益可能不足以抵消一次http请求带来的消耗。
组件懒加载虽然好处极多,但仍有缺陷,如上例点击按钮后需等待HelloWorld.vue对应的js文件被请求执行后页面才会做出相应变化,这就涉及到加载状态和错误状态的处理(虽然一般情况下不会有问题,因为都是些小文件,加载极快,但也有例外),所幸Vue也为我们考虑到了这些:
<script>
// Home.vue
import LoadingComponent from '@/components/Loading'
export default {
components: {
HelloWorld: () => ({
component: import('@/components/HelloWorld.vue'),
loading: LoadingComponent, // 加载HelloWorld.vue对应js文件中展示
delay: 300, // loading的延迟生效时间
}),
},
data() {
return {
showHello: false,
}
},
}
</script>
从用户体验方面来说,般来说500ms内的响应时间还不至于失去用户的注意力,所以可以为loading配置一个延迟时间,默认200ms内加载完成不会出现loading,当然也可以像上面一样手动设置一下delay,单位ms。
<script>
// Home.vue
import ErrorComponent from '@/components/Error'
export default {
components: {
HelloWorld: () => ({
component: import('@/components/HelloWorld.vue'),
error: ErrorComponent, // 加载HelloWorld.vue对应js文件失败时展示,如文件不存在
timeout: 2000, // 文件加载的超时时间,超出时间未加载完成,会触发ErrorComponent
}),
},
data() {
return {
showHello: false,
}
},
}
</script>
出现错误的情形主要有以下几点:
Vue还为资源文件配置了预加载策略,即使用<link rel="prefetch">和<link rel="preload">策略,在build后的index.html文件中或者开发模式下浏览器的Network面板里可以具体查看。关于两者的具体用法这里就不赘述了,这里说一下两者差异之处:preload的优先级比prefetch的高,一般来说当前页面的必要资源可以使用preload策略,当前页面的非必要资源和其他页面的资源使用prefetch策略。
通过配置资源预加载,浏览器为我们预先预先加载资源,在用户用到某些资源时可以及时响应,可以在提升首次加载性能的同时为用户后续的操作提供良好的体验。
prefetch在Safari中暂时还不支持,所以懒加载在Safari中表现地相对较差。
Vue中使用懒加载和代码分块对产品进行优化,简单实用,但是这其中存在着权衡,如果项目较小,打包文件并不大,则可能不需要进行代码分块和懒加载,毕竟http请求也是挺贵的。
当项目较大时,使用懒加载和代码分块就可以显著地提升性能,但是同样注意那需要由后来的请求弥补的,但所幸目前大部分浏览器都支持资源预加载策略,搭配使用效果更佳。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
目前关于cocos开发俄罗斯方块的文章几乎寥寥无几,因此本文将主要介绍如何通过CocosCreator Typescript制作简单的俄罗斯方块游戏,代码具有一定价值,感兴趣的同学可以学习一下
今天我们来学习JS的变量提升与函数提升的内容,对于JS的变量提升与函数提升究竟是什么提升呢?顺序是怎样的呢?接下来我们一一的详细的了解一下。
HTML+JS实现监控切屏功能,下文有实例供大家参考,对大家了解操作过程或相关知识有一定的帮助,而且实用性强,希望这篇文章能帮助大家,下面我们一起来了解看看吧。
不少朋友应该都有玩过俄罗斯方块小游戏吧,俄罗斯方块是个很经典的小游戏,下面我们就来尝试一下用JS实现实现俄罗斯方块游戏,下文有实现思路和代码,感兴趣的朋友可以参考学习。
这篇文章主要给大家分享 JavaScript中document.activeELement焦点元素介绍,下面文章围绕了document.activeElement属性展开详细内容,需要的朋友可以参考一下,希望对大家有所帮助
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008