从4个方面优化你的Vue项目
栏目: JavaScript · 发布时间: 5年前
内容简介:两者的区别是:v-if不渲染DOM,v-show会预渲染DOM一般我们在两种常见的情况下会倾向于这样做:
两者的区别是:v-if不渲染DOM,v-show会预渲染DOM
除以下情况使用v-show
,其他情况尽量使用v-if
-
有预渲染需求
-
需要频繁切换显示状态
2、v-for必须加上key,并避免同时使用v-if
一般我们在两种常见的情况下会倾向于这样做:
-
为了过滤一个列表中的项目 比如
v-for="user in users" v-if="user.isActive"
。在这种情形下,请将users
替换为一个计算属性 (比如activeUsers
),让其返回过滤后的列表 -
为了避免渲染本应该被隐藏的列表 比如
v-for="user in users" v-if="shouldShowUsers"
。这种情形下,请将v-if
移动至容器元素上 (比如 ul, ol)
3、事件及时销毁
Vue组件销毁时,会自动清理它与其它实例的连接,解绑它的全部指令及事件监听器,但是仅限于组件本身的事件。
也就是说,在js内使用addEventListener等方式是不会自动销毁的,我们需要在组件销毁时手动移除这些事件的监听,以免造成内存泄露,如:
created() { addEventListener('touchmove', this.touchmove, false) }, beforeDestroy() { removeEventListener('touchmove', this.touchmove, false) } 复制代码
首屏优化
1、图片裁剪、使用webp
-
图片需要裁剪,一般使用二倍图即可
-
尽量使用webp图片
-
如果使用了vue-lazyload插件,可以使用以下方法一键替换webp(替换使用v-lazy指令的图片)
Vue.use(VueLazyload, { error: require('./assets/img/defaultpic_small.png'), filter: { webp (listener: any, options: any) { if (!options.supportWebp) return // listener.src += '.webp' } } }); 复制代码
2、资源提前请求
经测试,Vue项目中各文件的加载顺序为:router.js、main.js、App.vue、[page].vue、[component].vue,如图:
其中,router的加载时间相比于page.vue快近100ms,如果page.vue的文件较多,时间差异会更大 所以,可以在页面挂载、渲染的同时去请求接口数据,如在router.js中请求数据:
import Router from 'vue-router' import store from './store' store.dispatch('initAjax') 复制代码
3、异步路由
使用异步路由可以根据URL自动加载所需页面的资源,并且不会造成页面阻塞,较适用于移动端页面
建议主页面直接import,非主页面使用异步路由
使用方式:
{ path: '/order', component: () => import('./views/order.vue') } 复制代码
4、异步组件
不需要首屏加载的组件都使用异步组件的方式来加载(如多tab),包括需要触发条件的动作也使用异步组件(如弹窗) 使用方式为:v-if来控制显示时机,引入组件的Promise即可
<template> <div> <HellowWorld v-if="showHello" /> </div> </template> <script> export default { components: { HellowWorld: () => import('../components/HelloWorld.vue') }, data() { return { showHello: false } }, methods: { initAsync() { addEventListener('scroll', (e) => { if (scrollY > 100) { this.showHello = true } }) } } } </script> 复制代码
5、使用轻量级插件、异步插件
-
使用webpack-bundle-analyzer查看项目所有包的体积大小,较大的插件包尽量寻找轻量级的替代方案
-
首屏用不到的插件、或只在特定场景才会用到的插件使用异步加载(如定位插件,部分情况可以通过URL传递经纬度;或生成画报插件,需要在点击时触发);插件第一次加载后缓存在本地,使用方式为:
// 以定位插件为例 const latitude = getUrlParam('latitude') const longitude = getUrlParam('longitude') // 如果没有经纬度参数,则使用定位插件来获取经纬度 if (!latitude || !longitude) { // 首次加载定位插件 // webpack4写法,若使用webpack3及以下,则await import('locationPlugin')即可 if (!this.WhereAmI) this.WhereAmI = (await import('locationPlugin')).default // do sth... } 复制代码
6、公用CDN
使用公用的CDN资源,可以起到缓存作用,并减少打包体积
网络优化
1、减少网络请求
浏览器对同一时间针对同一域名下的请求有一定数量限制(一般是6个),超过限制数目的请求会被阻塞
首屏尽可能减少同域名的请求,包括接口和js;按需减少首屏的chunk.js,合并接口请求
2、合理使用preload、dns-prefetch、prefetch
-
preload具有较高的加载优先级,它可以利用间隙时间预加载资源,将加载和执行分离开,不阻塞渲染和document的onload事件
-
每次与域名连接都需要进行DNS解析,使用dns-prefetch可以预解析域名的DNS
-
prefetch会预加载页面将来可能用到的一些资源,优先级较低;对首屏渲染要求较高的项目不建议使用
三者的使用方式,在head标签中添加(vue-cli-3已经做了相应配置):
<head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width,initial-scale=1" /> <link rel="icon" href="/dist/favicon.ico" /> <!-- dns-prefetch写法 --> <link rel="dns-prefetch" href="//www.dpfile.com" /> <title>md-config</title> <!-- preload写法,as属性必须 --> <link href="/dist/css/app.52dd885e.css" rel="preload" as="style" /> <link href="/dist/js/app.05faf3b5.js" rel="preload" as="script" /> <link href="/dist/js/chunk-vendors.04343b1f.js" rel="preload" as="script" /> <!-- prefetch写法 --> <link href="/dist/js/chunk-vendors.04343b1f.js" rel="prefetch" /> </head> 复制代码
3、PWA
PWA支持缓存HTML文档、接口(get)等,降低页面白屏时间 这样即使在弱网甚至断网情况下,也能迅速展示出页面
以上所述就是小编给大家介绍的《从4个方面优化你的Vue项目》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 滴滴开源 移动开发 方面的 4 个项目
- 从3个方面聊聊:交付项目中的谈判
- 大数据方面核心技术有哪些?
- 推荐一些学习方面的公众号
- 产品小白进行产品验收,从这些方面入手
- android常见的性能优化方面的总结
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Unreal Engine 4 Scripting with C++ Cookbook
Sherif, William、Stephen Whittle / 2016-10-24
Unreal Engine 4 (UE4) is a complete suite of game development tools made by game developers, for game developers. With more than 100 practical recipes, this book is a guide showcasing techniques to us......一起来看看 《Unreal Engine 4 Scripting with C++ Cookbook》 这本书的介绍吧!