很久不写博文了,本文做为我使用半年 vue 框架的经验小结,随便谈谈,且本文只适用于 vue-cli 初始化的项目或依赖于 webpack 打包的项目。css
前几天看到你们说 vue 项目越大越难优化,带来不少痛苦,这是避免不了的,问题终究要解决,框架的性能是没有问题的,各大测试网站都有相关数据。下面进入正题html
所谓的基础优化是任何 web 项目都要作的,而且是问题的根源。HTML,CSS,JS 是第一步要优化的点vue
分别对应到 .vue 文件内的,<template>,<style>,<script>
,下面逐个谈下 vue 项目里都有哪些值得优化的点webpack
语义化标签,避免乱嵌套,合理命名属性等等标准推荐的东西就不谈了。ios
模板部分帮助咱们展现结构化数据,vue 经过数据驱动视图,主要注意一下几点web
v-if
,第二个维度在没有权限限制下根据用户点击的频次选择,频繁切换的使用 v-show
,不频繁切换的使用 v-if
,这里要说的优化点在于减小页面中 dom 总数,我比较倾向于使用 v-if
,由于减小了 dom 数量,加快首屏渲染,至于性能方面我感受肉眼看不出来切换的渲染过程,也不会影响用户的体验。v-if="isShow && isAdmin && (a || b)"
,这种表达式虽然说能够识别,可是不是长久之计,当看着不舒服时,适当的写到 methods 和 computed 里面封装成一个方法,这样的好处是方便咱们在多处判断相同的表达式,其余权限相同的元素再判断展现的时候调用同一个方法便可。item.id
做为 key,假如数组数据是这样的 ['a' , 'b', 'c', 'a']
,使用 :key="item"
显然没有意义,更好的办法就是在循环的时候 (item, index) in arr
,而后 :key="index"
来确保 key 的惟一性。<style scoped>
将样式文件锁住,目的很简单,再好用的标准也避免不了多人开发的麻烦,约定命名规则也可能会冲突,锁定区域后尽可能采用简短的命名规则,不须要 .header-title__text
之类的 class,直接 .title
搞定。.fl -- float: left
到全局文件里去,而后又要 .clear
,如今的浏览器还不至于弱到非要用 float
去兼容,彻底能够 flex,grid 兼容性通常,功能其实 flex 布局均可以实现,float 会带来布局上的麻烦,用过的都知道不相信解释坑了。至于其余通用的规范这里不赘述,相关文章不少。vue-router
这部分也是最难优化的点,说下我的意见吧。vuex
export default {}
内的方法顺序一致,方便查找对应的方法。我我的习惯 data、props、钩子、watch、computed、components。{{ isEditing ? 编辑中 : 保存 }}
:width="" :heigth=""
不要 :option={}
,细化的好处是只传须要修改的参数,在子组件 props 里加数据类型,是否必传,以及默认值,便于排查错误,让传值更严谨。this.$store.dispatch('update', { ... })
vue 的组件化深受你们喜好,到底组件拆到什么程度算是合理,还要因项目大小而异,小型项目能够简单几个组件搞定,甚至不用 vuex,axios 等等,若是规模较大就要细分组件,越细越好,包括布局的封装,按钮,表单,提示框,轮播等,推荐看下 Element 组件库的代码,没时间写这么详细能够直接用 Element 库,分几点进行优化vue-cli
vue-router 除了切换路由,用的最多的是处理权限的逻辑,关于权限的控制这里不赘述,相关 demo 和文章有许多,那么说到优化,值得一提的就是组件懒加载axios
中文官网连接如上,例子以下
const Foo = r => require.ensure([], () => r(require('./Foo.vue')), 'group-foo') const Bar = r => require.ensure([], () => r(require('./Bar.vue')), 'group-foo') const Baz = r => require.ensure([], () => r(require('./Baz.vue')), 'group-foo')
这段代码将 Foo, Bar, Baz 三个组件打包进了名为 group-foo
的 chunk 文件,固然啦是 js 文件
其他部分正常写就能够,在网站加载时会自动解析须要加载哪一个 chunk,虽然分别打包的整体积会变大,可是单看请求首屏速度的话,快了好多。
vuex 面临的问题和解决方案有几点
token: state => state.token
,单单的取值,尽可能不要作数据转换,须要转换的点在于多个地方用相同的字段,可是结构不一样的状况(不多出现)。上面说了代码方面的规范和优化,下面说下重点的打包优化,前段时间打包的 vender bundle 足足 1.4M,app bundle 也有 270K,app bundle 能够经过组件懒加载解决,vender 包该怎么解决?
有人会质疑是否是没压缩或依赖包没去重,其实都作了就是看到的 1.4M。
解决方法很简单,打包 vender 时不打包 vue、vuex、vue-router、axios 等,换用国内的 bootcdn 直接引入到根目录的 index.html 中。
例如:
<script src="//cdn.bootcss.com/vue/2.2.5/vue.min.js"></script> <script src="//cdn.bootcss.com/vue-router/2.3.0/vue-router.min.js"></script> <script src="//cdn.bootcss.com/vuex/2.2.1/vuex.min.js"></script> <script src="//cdn.bootcss.com/axios/0.15.3/axios.min.js"></script>
在 webpack 里有个 externals,能够忽略不须要打包的库
externals: { 'vue': 'Vue', 'vue-router': 'VueRouter', 'vuex': 'Vuex', 'axios': 'axios' }
此时的 vender 包会很是小,若是不够小还能够拆分其余的库,此时增长了请求的数量,可是远比加载一个 1.4M 的 bundle 快的多。
本文谈的优化能够解决部分性能问题,实际开发细节不少,总之按着规范写代码,团队的编码风格尽可能统一,处理细节上多加思考,大部分性能问题都能迎刃而解。
文章出自 orange 的 我的博客 http://orangexc.xyz/