语义化标签,避免乱嵌套,合理命名属性等等标准推荐的东西就不谈了。css
模板部分帮助咱们展现结构化数据,vue 经过数据驱动视图,主要注意一下几点html
v-if
,第二个维度在没有权限限制下根据用户点击的频次选择,频繁切换的使用 v-show
,不频繁切换的使用 v-if
,这里要说的优化点在于减小页面中 dom 总数,我比较倾向于使用 v-if
,由于减小了 dom 数量,加快首屏渲染,至于性能方面我感受肉眼看不出来切换的渲染过程,也不会影响用户的体验。v-if="isShow && isAdmin && (a || b)"
,这种表达式虽然说能够识别,可是不是长久之计,当看着不舒服时,适当的写到 methods 和 computed 里面封装成一个方法,这样的好处是方便咱们在多处判断相同的表达式,其余权限相同的元素再判断展现的时候调用同一个方法便可。循环调用子组件时添加 key。vue
item.id
做为 key,假如数组数据是这样的 ['a' , 'b', 'c', 'a'],使用 :key="item"
显然没有意义,更好的办法就是在循环的时候 (item, index) in arr
,而后 :key="index"
来确保 key 的惟一性。<style scoped>
将样式文件锁住,目的很简单,再好用的标准也避免不了多人开发的麻烦,约定命名规则也可能会冲突,锁定区域后尽可能采用简短的命名规则,不须要 .header-title__text
之类的 class,直接 .title
搞定。这部分也是最难优化的点,说下我的意见吧。webpack
{{ isEditing ? 编辑中 : 保存 }}
:width="" :heigth="" 不要 :option={}
,细化的好处是只传须要修改的参数,在子组件 props 里加数据类型,是否必传,以及默认值,便于排查错误,让传值更严谨。this.$store.dispatch('update', { ... })
在项目开发过程之中,若是把全部的组件的布局写在一个组件中,当数据变动时,因为组件代码比较庞大,vue 的数据驱动视图更新会比较慢,形成渲染过慢,也会形成比较差的体验效果。因此要把组件细分,好比一个组件,能够把整个组件细分红轮播组件、列表组件、分页组件等。
组件细化是有必要的,那组件细化到什么程度算是合理,还要因项目大小而异,小型项目能够简单几个组件搞定,甚至不用 vuex,axios 等等,若是规模较大就要细分组件,越细越好,包括布局的封装,按钮,表单,提示框,轮播等,推荐看下 Element 组件库的代码,没时间写这么详细能够直接用 Element 库,分几点进行优化:ios
在平时的demo中,可能不会碰见这个需求。当页面不少,组件不少的时候,SPA页面在首次加载的时候,就会变的很慢。这是由于vue首次加载的时候把可能一开始看不见的组件也一次加载了,这个时候就须要对页面进行优化,就须要异步组件了。
在路由index.js里(路径: src/router/index.js
),经过require方式或者import()方式动态加载组件。像下面这样:web
{ path: '/home', name: 'home', component:require('@views/home').default }
或者vue-router
{ path: '/home', name: 'home', component:() => import('@views/home') }
vue-router 除了切换路由,用的最多的是处理权限的逻辑,关于权限的控制这里不赘述,相关 demo 和文章有许多,那么说到优化,值得一提的就是 组件懒加载vuex
中文官网连接如上,例子以下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 面临的问题和解决方案有几点
基于上面一条,说下每一个过程里面要作什么,先后端数据必定会有不一致的地方,或是数据结构,或是字段命名,那么究竟应该在哪一步处理数据转换的逻辑呢?有人会说其实哪一步均可以实现,其实否则,个人建议以下
上面说了代码方面的规范和优化,下面说下重点的打包优化,前段时间打包的 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 快的多。