前端开发中,随着业务和页面增加,以组件为基本单位的结构下,组件数量会增长极快,为了优化我们会很显然地想要进行一些工作:

  • 代码分块
  • 懒加载非必要资源文件

非必要资源,指的首次渲染出某页面所不必要的资源,如因为用户操作才出现的图片、弹窗等。

代码分块和懒加载在页面层面具有极大的优化作用,用户很可能只是浏览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.vueHome.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>

出现错误的情形主要有以下几点:

  • 网络连接不通 / 服务器错误
  • 文件不存在(特别注意重新部署后之前版本的文件被删除,而用户还未刷新页面
  • 加载超时(默认是没有超时时间的,不过可以像上面一样通过timeout属性配置,单位ms)

preload 和 prefetch

Vue还为资源文件配置了预加载策略,即使用<link rel="prefetch"><link rel="preload">策略,在build后的index.html文件中或者开发模式下浏览器的Network面板里可以具体查看。关于两者的具体用法这里就不赘述了,这里说一下两者差异之处:preload的优先级比prefetch的高,一般来说当前页面的必要资源可以使用preload策略,当前页面的非必要资源和其他页面的资源使用prefetch策略。

通过配置资源预加载,浏览器为我们预先预先加载资源,在用户用到某些资源时可以及时响应,可以在提升首次加载性能的同时为用户后续的操作提供良好的体验。

prefetch在Safari中暂时还不支持,所以懒加载在Safari中表现地相对较差。

总结

Vue中使用懒加载和代码分块对产品进行优化,简单实用,但是这其中存在着权衡,如果项目较小,打包文件并不大,则可能不需要进行代码分块和懒加载,毕竟http请求也是挺贵的。当项目较大时,使用懒加载和代码分块就可以显著地提升性能,但是同样注意那需要由后来的请求弥补的,但所幸目前大部分浏览器都支持资源预加载策略,搭配使用效果更佳。

  • 异步组件
  • preload
  • Safari prefetch
  • Safari preload

Vue组件代码分块和懒加载相关推荐

  1. 代码中避免懒加载错误_网站设计中应避免的5大错误

    代码中避免懒加载错误 The design of a website plays an imperative role in creating an effective and impressive ...

  2. 手写Vue个人组件库——fl-Lazyimg 图片懒加载

    fl-Lazyimg图片懒加载 基础使用 将img绑定在fl-Lazyimg标签中,设置img的src-data为图片路径即可使用. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上 ...

  3. Vue Router系列之路由懒加载

    文章の目录 一.具体需要 3 步: 1.安装 `@babel/plugin-syntax-dynamic-import` 包. 2.在 babel.config.js 配置文件中声明该插件. 3.将路 ...

  4. vue动态路由和路由懒加载

    目录 1.动态路由 1.配置router 2.使用路由 3.创造用户组件并使用传进来的用户信息 2.路由懒加载 1.懒加载的方式 2.懒加载举例 1.动态路由(通过$route.params获得数据) ...

  5. Concis组件库封装——LazyLoad懒加载

    懒加载组件,支持任意元素进行延迟加载,可以在SPA单页应用首页渲染时减少非可视区的DOM渲染,加快首屏渲染效率,大致用法: <LazyLoad><div><span> ...

  6. Vue组件库实现按需加载功能

    文章目录 简述 示例 原理 babel-plugin-component element-ui按需引入 babel-plugin-import 组件分开打包以及全部打包 组件分开打包 组件全部打包入口 ...

  7. webpack代码分割和懒加载

    代码分割: 分离业务代码 和 第三方依赖 分离业务代码 和业务公共代码 和第三方依赖 分离首次加载 和 访问加载后的代码 常用的:require.ensure() []:denpendencies c ...

  8. 使用Webpack的代码分离实现Vue懒加载(译文)

    当一个Vue的项目体积变得十分庞大的时候,使用Webpack的代码分离功能将Vue Components,routes或Vuex的代码进行分离并按需加载,会极大的提高App的首屏加载速度. 在Vue的 ...

  9. vue延迟渲染组件_性能优化之组件懒加载: Vue Lazy Component 介绍

    这篇文章分享了从遇到前端业务性能问题,到分析.解决并且梳理出通用的Vue 2.x 组件级懒加载解决方案(Vue Lazy Component )的过程. 初始加载资源过多 问题起源于我们的一个页面,下 ...

最新文章

  1. 斯坦福连续发了四年的 AI 报告,今年讲了什么?
  2. C++点操作符和箭头操作符
  3. matlab转c++
  4. MySQL的sql语句分类汇总
  5. 写了个序列化反序列化助手
  6. SAP Spartacus checkout.reducer.ts调用时间点
  7. 打印发现function toUpperCase() { [native code] }
  8. VS Code 1.38 发布,官方图标存储库发布
  9. VirtualBox – Error In supR3HardenedWinReSpawn 问题解决办法
  10. -seo要掌握的20条网站的准则
  11. Python 植物大战僵尸代码实现(2):植物卡片选择和种植
  12. Wing IDE Pro 6 for Mac(Python开发工具)安装破解图文教程
  13. 什么索引?索引的作用是什么?索引运用实例
  14. java使用zpl指令在Zebra打印机上打印条形码
  15. lan pci 联想开机_联想bios设置硬盘启动
  16. 2021-12-21 SWUSTOJ69偷菜时间表(解题思路详解)
  17. 带有下标的赋值维度不匹配。
  18. memcpy、memmove、memcmp、memset函数的使用说明和模拟实现
  19. Linux SA--HugePage,HPET
  20. cad批量转换低版本如何实现?

热门文章

  1. 冲锋衣裤的正确洗涤方式
  2. java ssm热带水果网上商城系统--
  3. Jama包的矩阵操作
  4. 强烈推荐CCNA培训资料PPT_参加培训的时候的资料
  5. python爬取标题和作者时间的小程序
  6. 【我的Android进阶之旅】推荐一款视频转换GIF图片格式的转换工具(Video to GIF)...
  7. 区块链游戏乐块,到底行不行?
  8. C/C++数据结构——道路建设(最小生成树Prim)
  9. houdini 生成中心线:Find the center of a deforming tube
  10. 微博开放SDK初始化后使用报错please init sdk before use it. Wb.install()问题解决