点击上方 "程序员小乐"关注, 星标或置顶一起成长

第一时间与你相约

每日英文

Some happened could not forget, even forget also only temporarily don't remember.

有些事发生了就不可能忘记, 即使忘记也只是暂时的记不起。

每日掏心话

对自己狠一点,逼自己努力,再过五年你将会感谢今天发狠的自己、恨透今天懒惰自卑的自己。我始终相信一句话:只有自己足够强大,才不会被别人践踏。

来自:我是你的超级英雄 | 责编:乐乐

链接:juejin.im/post/5d548b83f265da03ab42471d

程序员小乐(ID:study_tech)第 679 次推文 图片来自网络

往日回顾:微软下达死命令,新规明年1月14日生效,全球5亿用户集体遭殃

00 前言

Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 DOM 以及如何最高效地操作 DOM;但 Vue 项目中仍然存在项目首屏优化、Webpack 编译配置优化等问题,所以我们仍然需要去关注 Vue 项目性能方面的优化,使项目具有更高效的性能、更好的用户体验。

本文是作者通过实际项目的优化实践进行总结而来,希望读者读完本文,有一定的启发思考,从而对自己的项目进行优化起到帮助。本文内容分为以下三部分组成:

  • Vue 代码层面的优化;
  • webpack 配置层面的优化;
  • 基础的 Web 技术层面的优化。

辛苦整理良久,还望手动点赞鼓励~

github地址为:github.com/fengshi123/…,汇总了作者的所有博客,也欢迎关注及 star ~

01 代码层面的优化

1.1、v-if 和 v-show 区分使用场景

v-if 是 真正 的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建;也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

v-show 就简单得多, 不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 的 display 属性进行切换。

所以,v-if 适用于在运行时很少改变条件,不需要频繁切换条件的场景;v-show 则适用于需要非常频繁切换条件的场景。

1.2、computed 和 watch 区分使用场景

computed: 是计算属性,依赖其它属性值,并且 computed 的值有缓存,只有它依赖的属性值发生改变,下一次获取 computed 的值时才会重新计算 computed 的值;

watch: 更多的是「观察」的作用,类似于某些数据的监听回调 ,每当监听的数据变化时都会执行回调进行后续操作;

运用场景:

  • 当我们需要进行数值计算,并且依赖于其它数据时,应该使用 computed,因为可以利用 computed 的缓存特性,避免每次获取值时,都要重新计算;
  • 当我们需要在数据变化时执行异步或开销较大的操作时,应该使用 watch,使用 watch 选项允许我们执行异步操作 ( 访问一个 API ),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。

1.3、v-for 遍历必须为 item 添加 key,且避免同时使用 v-if

(1)v-for 遍历必须为 item 添加 key

在列表数据进行遍历渲染时,需要为每一项 item 设置唯一 key 值,方便 Vue.js 内部机制精准找到该条列表数据。当 state 更新时,新的状态值和旧的状态值对比,较快地定位到 diff 。

(2)v-for 遍历避免同时使用 v-if

v-for 比 v-if 优先级高,如果每一次都需要遍历整个数组,将会影响速度,尤其是当之需要渲染很小一部分的时候,必要情况下应该替换成 computed 属性。

推荐:

    • {{ user.name }}

    computed: { activeUsers: function () { return this.users.filter(function (user) { return user.isActive }) }}

不推荐:

  • {{ user.name }}

1.4、长列表性能优化

Vue 会通过 Object.defineProperty 对数据进行劫持,来实现视图响应数据的变化,然而有些时候我们的组件就是纯粹的数据展示,不会有任何改变,我们就不需要 Vue 来劫持我们的数据,在大量数据展示的情况下,这能够很明显的减少组件初始化的时间,那如何禁止 Vue 劫持我们的数据呢?可以通过 Object.freeze 方法来冻结一个对象,一旦被冻结的对象就再也不能被修改了。

  • export default { data: () => ({ users: {} }), async created() { const users = await axios.get("/api/users"); this.users = Object.freeze(users); }};

1.5、事件的销毁

Vue 组件销毁时,会自动清理它与其它实例的连接,解绑它的全部指令及事件监听器,但是仅限于组件本身的事件。如果在 js 内使用 addEventListene 等方式是不会自动销毁的,我们需要在组件销毁时手动移除这些事件的监听,以免造成内存泄露,如:

  • created() { addEventListener('click', this.click, false)},beforeDestroy() { removeEventListener('click', this.click, false)}

1.6、图片资源懒加载

对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载, 等到滚动到可视区域后再去加载。这样对于页面加载性能上会有很大的提升,也提高了用户体验。我们在项目中使用 Vue 的 vue-lazyload 插件:

(1)安装插件

  • npm install vue-lazyload --save-dev

(2)在入口文件 man.js 中引入并使用

  • import VueLazyload from 'vue-lazyload'

然后再 vue 中直接使用

  • Vue.use(VueLazyload)

或者添加自定义选项

  • Vue.use(VueLazyload, {preLoad: 1.3,error: 'dist/error.png',loading: 'dist/loading.gif',attempt: 1})

(3)在 vue 文件中将 img 标签的 src 属性直接改为 v-lazy ,从而将图片显示方式更改为懒加载显示:

以上为 vue-lazyload 插件的简单使用,如果要看插件的更多参数选项,可以查看 vue-lazyload 的 github 地址。

1.7、路由懒加载

Vue 是单页面应用,可能会有很多的路由引入 ,这样使用 webpcak 打包后的文件很大,当进入首页时,加载的资源过多,页面会出现白屏的情况,不利于用户体验。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应的组件,这样就更加高效了。这样会大大提高首屏显示的速度,但是可能其他的页面的速度就会降下来。

路由懒加载:

  • const Foo = () => import('./Foo.vue')const router = new VueRouter({ routes: [ { path: '/foo', component: Foo } ]})

1.8、第三方插件的按需引入

我们在项目中经常会需要引入第三方插件,如果我们直接引入整个插件,会导致项目的体积太大,我们可以借助 babel-plugin-component ,然后可以只引入需要的组件,以达到减小项目体积的目的。以下为项目中引入 element-ui 组件库为例:

(1)首先,安装 babel-plugin-component :

  • npm install babel-plugin-component -D

(2)然后,将 .babelrc 修改为:

  • { "presets": [["es2015

oracle性能优化求生指南_Vue项目性能优化--实践指南,网上最全最详细相关推荐

  1. vue引入cdn Vue 优化Vue引入 cdn vue cdn Vue优化引入CDN vue 项目 CDN优化

    vue引入cdn Vue 优化Vue引入 cdn vue cdn Vue优化引入CDN vue 项目 CDN优化 未引入 CDN前 main.js 更改CDN方式引入 在 vue.config 中引入 ...

  2. 个人信息安全影响评估指南_发布 | 网络安全标准实践指南—移动互联网应用程序(App)收集使用个人信息自评估指南...

    关于发布<网络安全标准实践指南-移动互联网应用程序(App)收集使用个人信息自评估指南>的通知 信安秘字[2020] 40号 各有关单位: 为落实<网络安全法>相关要求,围绕中 ...

  3. vue dve环境static无法被外部访问_vue项目性能优化(代码层面)

    点击上方蓝字关注我哦1v-if与v-show区分使用场景 v-if是真正的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建:也是惰性的:如果在初始渲染时条件为假,则什么 ...

  4. 性能优化工作笔记001---springcloud项目性能优化_工作经验随时更新

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 1.能在内存中操作的,尽量内存中操作,比如,可以获取一次数据,对数据用代码进行,检索 而不是每次都 ...

  5. CoreOS实践指南(三):系统服务管家Systemd

    [编者按]作为一个操作系统,CoreOS 采用了高度精简的系统内核及外围定制,将许多原本需要复杂人工操作或者第三方软件支持的功能在操作系统级别进行了实现,同时剔除了其他对于服务器系统非核心的软件,比如 ...

  6. python最佳实践指南试题_8.1. 关于这份指南

    与 Tcl.Perl.Ruby.Scheme 以及 Java 类似,Python 是一门用途广泛的高级编程语言.它的一些关键特性有: 语法清晰.可读性极佳 Python 的设计哲学着眼于可读性,它以缩 ...

  7. 学习笔记:ORACLE 性能优化求生指南

    第一章.ORACLE性能调优:一种系统化方法 数据库优化顺序:     1.调整SQL,PL/SQL 代码及优化物理设计(分区,索引)尽可能的减少应用的请求:     2.减少对锁,闩锁,缓存及ORA ...

  8. ssas连接oracle性能,Analysis Services(SSAS) 性能优化

    1.聚合选项中添加聚合,以空间换时间提升性能. 如下图: 性能提升百分比越高,聚合数越高,生成的Cube越大,这就是以空间换时间. 2.修改SSAS服务器上的线程池配置选项.提升并发数. 通过X:\P ...

  9. vuejs项目性能优化 - 总结篇

    首页等页面加载慢?打包编译后css/js文件过大?试试压缩.路由懒加载等技术 打包编译后,过大的文件如:app.css.app.js.vendor.js 本着 "开发环境".&qu ...

最新文章

  1. MalformedObjectNameException: Invalid character '' in value part of property
  2. vscode使用教程python-用VScode配置Python开发环境
  3. Android布局管理器-使用TableLayout表格布局管理器实现简单的用户登录页面
  4. jQuery 陷阱。。。。
  5. scrum与第一次teamwork
  6. 大数据在医疗保健中的真正愿景
  7. The requested URL was not found on the server
  8. 阿里巴巴Linux开源镜像站 华为Linux开源镜像站 Linux宝塔面板
  9. IAR #pragma optimize 指令
  10. ubuntu安装php5.3
  11. Spring的IoC理解,代码进行详解
  12. keystone nova v2 python
  13. java相关求助---Java泛型的理解与等价实现---------没有完全明白啊...请大神指导...
  14. The Unique MST 判断生成树是否唯一
  15. 漫画 | Redis常见面试问题
  16. lightgbm algorithm case of kaggle(下)
  17. C++ 获取当前运行程序的路径
  18. python文本自动伪原创_现在有哪些好用的伪原创工具?
  19. PowerDesigner 反向工程获取数据库表结构
  20. 小蚂蚁学cURL笔记(1)

热门文章

  1. 用js内置对象XMLHttpRequest 来用ajax
  2. loadrunner:关联操作
  3. linux内核代码container_of
  4. NOIP2010 提高组 机器翻译
  5. 用MFC消息映射机制自定义消息
  6. [转载] 【python】str与json类型转换
  7. [转载] 用python语言设计计时器
  8. 通过docker-composer启动容器nginx,并完成spring.boot的web站点端口转发
  9. hector与gmapping总结
  10. 【CSS3】CSS多列属性(Multi-column)