Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Vue.js应用性能优化二

Vue.js应用性能优化二

作者头像
前端知否
发布于 2020-03-23 09:53:20
发布于 2020-03-23 09:53:20
2.3K0
举报
文章被收录于专栏:前端知否前端知否

Vue.js中的延迟加载和代码拆分文章中,我们了解了代码拆分是什么,它如何与Webpack一起工作以及如何在Vue应用程序中使用延迟加载来使用它。

现在我们将深入研究代码,并学习最有用的Vue.js应用程序代码分割模式。

通过使用以下技术,我们能够将初始bundle的大小减少70%并使其在眨眼间加载。

应用规模增长带来的问题

Vue-router是一个库,允许自然地将我们的Web应用程序拆分为单独的页面。每个页面都是与某个特定URL路径关联的路由

知道这一点,我们有一个简单的应用程序,具有以下结构:

所有js代码都被打包到一个文件 — app.js

您可能已经注意到,根据我们访问的路由,我们可能不需要Home.vue或About.vue(依赖lodash)但它们都在相同的app.js包中,无论路由用户是什么,都会被下载访问。浪费下载和解析时间!

如果我们只是多下载了一个路由,那这并不是什么大问题。但你可以想象,随着这个应用程序越来越大,任何新的添加都意味着在首次访问时下载更大的bundle。

当1秒的时间足以让用户心里犯嘀咕,并且(可能)离开我们的网站时,这是不可接受的!

不同延迟,用户的心理反应:

  • 0 - 100ms,感觉很快
  • 100 - 300ms 可以接受的延迟等待
  • 300 - 1000ms 盯着网页,明显感觉到延迟
  • 1000+ms 心里开始嘀咕,要不要离开
  • 10,000+ms 先去别的地方逛逛吧,稍后见

使用vue-router进行基于路由的代码分割

为了避免弄巧成拙,我们只需要使用我们在前一篇文章中学习的动态导入语法,为每个路由创建单独的bundle。

像Vue.js中的其他所有东西一样 - 它非常简单。我们只需要在那里动态导入组件,而不是将组件直接导入到路径对象中。仅当解析给定路线时才会下载路线组件。

所以不要像这样静态导入路径组件:

我们需要动态导入它,这将创建一个包含此路由的新bundle作为入口点:

知道了这一点,让我们看看我们的捆绑和路由如何与动态导入一样:

home.js,about.js 都被拆分成单独的bundle

通过此设置,webpack将创建三个包:

  • app.js - 我们的主要包含应用程序入口点(main.js)和每个路由所需的库/组件
  • home.js - home页面bundle,只有在输入/路径时才会下载
  • about.js - about页面bundle(依赖 lodash),只有在输入路径为/about时才会下载

bundle名称不是webpack生成的真实名称,以便于理解。Webapck实际上正在生成类似0.js 1.js等,具体取决于您的webpack配置。

这种技术几乎适用于所有应用,并且可以提供非常好的效果。

在许多情况下,基于路由的代码拆分将解决您的所有性能问题,并且可以在几分钟内应用于几乎任何应用程序!

Vue生态系统中的代码拆分

您可能正在使用Nuxt或vue-cli来创建您的应用程序。如果是这样,重要的是要知道它们都有关于代码拆分的一些自定义行为:

  • 在vue-cli 3中,默认情况下将预取所有延迟加载的块。我们将在稍后学习如何使用预取(prefetching)。
  • 在Nuxt中,如果我们使用Nuxt路由系统,所有页面路由都是开箱即用的

现在让我们来看看非常流行且常用的反模式,它会减弱基于路由的代码拆分效果。

Vendor bundle 反模式

vendor包(第三方类库)通常用于包含node_modules中所有模块的单独js文件的上下文中。

虽然可以将所有内容放在这里,将所有依赖项保存在一个地方并缓存它们,感觉上可能很好,但这种方法带来了将所有路由打包在一起时遇到的相同问题:

黄色模块,都是vendor

你看到了问题吗?即使我们只需要在一个路由中使用lodash(它是其中一个依赖项),但是现在它被捆绑在vendor.js中以及所有其他依赖项中,因此它将始终下载。

将所有依赖项打包在一个文件中听起来很好,但会使您的应用加载时间更长。我们可以做得更好!

如果按照基于路由的代码分割方式,会确保所有依赖的代码被下载。但同时也会重复下载一些相同的依赖。比如两个路由页面中都依赖lodash的情况。

让我们假设Home.vue也需要lodash。

在这种情况下,从/about(About.vue)导航到/(Home.vue)将最终导致两次下载lodash。

它仍然比下载大量的冗余代码更好,但是如果我们已经有了这种依赖,那么重用它就没有意义了,对吧?

这是webpack splitChunksPlugin可以帮助我们的地方。只需将这几行添加到webpack配置中,我们就会将公共依赖项分组到一个单独的包中,以便共享它们。再说的清楚一些,几个路由页面共享的依赖,会单独抽取出来打包,而其他页面不会下载这个共享包。整个应用有一个全局共享的vendor bundle。

在chunks属性中,我们只是告诉webpack应该优化哪些代码块。您可能已经猜到了,将此属性设置为all,这意味着它应该优化所有代码块。

您可以在webpack文档中阅读有关此过程的更多信息

总结

按路由拆分代码是降低初始bundle大小的最佳(也是最简单)方法之一。在下一部分中,我们将了解所有其他小部件(Vuex存储和单个组件),这些部件也可以从主bundle中减掉并且懒加载。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端知否 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vue.js应用性能优化三
在上一篇Vue.js应用性能优化二中,我们学习了足够强大的模式,可以显着提高应用程序的性能 - 按照路由分割代码。虽然按照路由拆分代码非常有用,但在用户访问我们的站点后,仍然有很多内部代码不需要。在本系列的这一部分中,我们将重点关注代码拆分我们的状态管理 - Vuex模块。
前端知否
2020/03/23
1.5K0
Vue.js应用性能优化三
​(非软文)Webpack从入门到实战搭建Vue脚手架(一万字总结)
安装依赖包 (-D 将依赖记录成开发依赖, 只是开发中需要用的依赖, 实际上线不需要的)
Vam的金豆之路
2021/12/01
1.3K0
webpack性能优化(1):分隔/分包/异步加载+组件与路由懒加载
webpack ensure相信大家都听过。有人称它为异步加载,也有人说做代码切割,那这个家伙到底是用来干嘛的?其实说白了,它就是把js模块给独立导出一个.js文件的,然后使用这个模块的时候,webpack会构造script dom元素,由浏览器发起异步请求这个js文件。
周陆军博客
2023/03/18
1.4K0
webpack性能优化(2):splitChunks用法详解
之前写的《webpack性能优化(0):webpack性能优化概况-优化构建速度》、《webpack性能优化(1):分隔/分包/异步加载+组件与路由懒加载》
周陆军博客
2023/03/18
1.9K0
抛开vue-cli,一步步搭建vue+webpack环境
敲代码没有高亮简直蛋疼,简单带过下 sublime打开 —→ 点击Preferences下的Package Control —→ 输入install package回车 过一会儿 —→ 再输入vue syntax highlight回车,安装完毕 —→ 点击sublime选择vue component,即高亮
杨肆月
2019/08/15
6140
抛开vue-cli,一步步搭建vue+webpack环境
前端性能优化
本来想写一篇实用而又全面的性能优化文章,很多大佬已经写了非常好,我就不再造轮子了。我这篇文章就归纳整理一下吧,方便后续我或他人学习使用。
Dawnzhang
2022/05/10
1.4K0
前端性能优化
vue.js应用开发笔记
用户1141560
2017/12/21
2.6K1
vue.js应用开发笔记
Nuxt.js实战:Vue.js的服务器端渲染框架
首先,确保你已经安装了Node.js和yarn或npm。然后,通过命令行创建一个新的Nuxt.js项目:
天涯学馆
2024/06/06
1.4K0
记一次 Nuxt.js 登录页性能优化(性能提升十倍加)
最近有测试和 local 投诉,我们管理系统的登录页面经常加载很久,常常会有页面已经出来了,但是点击登录毫无反应,直到全部加载后才能登录。于是,他们提出让我们去优化。
coder_koala
2020/11/10
3.4K0
记一次 Nuxt.js 登录页性能优化(性能提升十倍加)
Vue官网开发实践:从零开始构建一个现代化的单页应用
在阅读这篇文章前,推荐一篇“好”文章:【鸿蒙技术分享:探索 HarmonyOS 开发之旅】
lyushine
2024/11/26
3610
VueJS + Webpack 代码分割的三种方式
对单页应用实行代码分割,是提高页面加载速度的一种很好的方式。因为用户不必在一次请求里加载完所有的代码,能够更快的看到页面并进行交互,这将会提升用户体验(特别是在移动端);同时因为 Google 会给加载缓慢的网站降权,代码分割也对 SEO 有好处。
疯狂的技术宅
2019/03/27
2.6K0
VueJS + Webpack 代码分割的三种方式
前端框架与库 - Vue.js 组件与路由
Vue.js 是一款流行的前端框架,以其简洁的 API 和高效的虚拟 DOM 更新机制著称。在 Vue.js 中,组件和路由是构建复杂应用的两大基石。本文将深入浅出地探讨 Vue.js 的组件系统和路由管理,包括常见问题、易错点及避免策略,并附带代码示例。
Jimaks
2024/07/15
2490
使用 Vue.js 和 Flask 实现全栈单页面应用
在本教程中,我将向大家展示如何使用前端的 Vue.js 单页面应用和后端的 Flask 进行交互。
疯狂的技术宅
2019/03/27
2.9K0
使用 Vue.js 和 Flask 实现全栈单页面应用
怎样为你的 Vue.js 单页应用提速
我有一个项目用了 Vue.js 来构建单页应用程序。随着上线日期的临近,性能优化的工作变得越来越重要。在本文中,我收集了有关在加载时间和渲染性能方面提高 Vue.js 应用性能的所有知识。
疯狂的技术宅
2020/05/11
3.1K0
怎样为你的 Vue.js 单页应用提速
Vue 中的懒加载:优化性能的秘密武器
在现代 Web 开发中,性能优化是至关重要的。随着单页应用(SPA)的普及,页面加载时间变得越来越长,用户体验也受到了影响。为了解决这个问题,懒加载(Lazy Loading)成为了一种常用的技术。本文将深入探讨在 Vue.js 中如何实现懒加载,以及在使用过程中需要注意的事项。
Front_Yue
2024/08/15
2900
Vue 中的懒加载:优化性能的秘密武器
为 Vue 的惰性加载加一个进度条
通常用 Vue.js 编写单页应用(SPA)时,当加载页面时,所有必需的资源(如 JavaScript 和 CSS 文件)都会被一起加载。在处理大文件时,这可能会导致用户体验不佳。
疯狂的技术宅
2020/10/22
3.4K0
为 Vue 的惰性加载加一个进度条
构建Vue.js组件的10个技巧
Vue.js提供了两种加载组件的方法:一种在Vue实例全局,另一种在组件级别。两种方法都有其自身的优点。
前端知否
2020/03/23
2.3K0
构建Vue.js组件的10个技巧
Vue.js中的延迟加载和代码拆分
虽然现在网络环境和电子设备变得越来越好,但是保持应用程序快速加载变得越来越困难。在本系列中,我将深入研究我们在实践中使用的Vue性能优化技术,并且您可以在Vue.js应用程序中使用它们,使应用程序快速加载并顺利执行。我的目标是让这个系列成为关于Vue应用程序性能的全面而完整的指南。
前端知否
2020/03/23
8.5K0
Vue.js中的延迟加载和代码拆分
vue项目性能优化-前端加分项
Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 DOM 以及如何最高效地操作 DOM;但 Vue 项目中仍然存在项目首屏优化、Webpack 编译配置优化等问题,所以我们仍然需要去关注 Vue 项目性能方面的优化,使项目具有更高效的性能、更好的用户体验。本文是作者通过实际项目的优化实践进行总结而来,希望读者读完本文,有一定的启发思考,从而对自己的项目进行优化起到帮助。本文内容分为以下三部分组成:
bb_xiaxia1998
2022/09/30
7370
Vue之Router(二)
  为什么会有动态路由呢?因为在一般的项目中,都会涉及到用户登陆的操作,我们希望某某用户登陆某个网页的时候,能够在该网页的UURL地址上显示用户的登录名或者用户ID等的信息。 动态路由就是根据不同的用户将在网页的URL中动态追加登录名或者ID等信息。 比如:
yuanshuai
2022/08/22
7970
Vue之Router(二)
相关推荐
Vue.js应用性能优化三
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档