Vue 代码优化

  • 给v-for循环项加上key提高diff计算速度
    • 为什么加key会提高diff计算速度

      经过旧头新头、旧尾新尾、旧头新尾、旧尾新头四次交叉比对后,都没有匹配到值得比对的节点,这时如果新节点有key的话。可以通过map直接获得值得对比的旧节点的下标,如果没有key的话,就要通过循环旧节点数组用sameVnode方法判断新节点和该旧节点是否值得比较,值得就返回该旧节点的下标。显然通过map比通过循环数组的计算速度来的快。

    • 什么是diff计算

      对于渲染watcher触发时会执行vm._update(vm._render(), hydrating),在vm._undata方法中会调用vm.patch,而vm.patch指向patch方法,diff计算是指在调用patch方法开始,用sameVnode方法判断节点是否值得比较,若不值得直接新节点替换旧节点后结束。值得对比进入patchVnode方法,分别处理一下几种情况,若新旧节点都有文本节点,新节点下的文本节点直接替换旧节点下的文本节点,如果新节点有子节点,旧节点没有子节点,那么直接把新节点查到旧节点的父级中,如果新节点没有子节点,旧节点有子节点,那么旧节点的父级下的子节点都删了。如果新旧节点都有子节点,进入updateChildren方法,通过旧头新头、旧尾新尾、旧头新尾、旧尾新头四次交叉比对,如果值得对比再进入patchVnode方法,如果都不值得对比,有key用map获得值得对比的旧节点,没有key通过循环旧节点获得值得对比的旧节点。当新节点都对比完,旧节点还没对比完,将还没对比完的旧节点删掉。当旧节点都对比完,新节点还没对比完,将新节点添加到最后一个对比过的新节点后面,完成diff计算。

  • 提前处理好数据解决v-if和v-for必须同级的问题

因为当Vue处理指令时,v-for比v-if具有更高的优先级,意味着v-if 将分别重复运行于每个v-for循环中。
可以在computed中提前把要v-for的数据中v-if的数据项给过滤处理了。

<template>
  <div>
    <div v-for="item in userList" :key="item.id" v-if="item.age > 18">
      {{ item.name }}
    </div>
  </div>
</template>

<script type="text/ecmascript-6">
  export default {
    data() {
      return {
        userList: [
          {
            id: 1,
            name: 'test-1',
            age: 20
          },
          {
            id: 2,
            name: 'test-2',
            age: 17
          }
        ]
      }
    }
  }
</script>

修改为

<template>
  <div>
    <div v-for="item in userComputedList" :key="item.id">
      {{ item.name }}
    </div>
  </div>
</template>

<script type="text/ecmascript-6">
  export default {
    components: {
      userComputedList: () => {
        return this.userList.filter(function (item) {
          return item.age > 18
        })
      }
    },
    data() {
      return {
        userList: [
          {
            id: 1,
            name: 'test-1',
            age: 20
          },
          {
            id: 2,
            name: 'test-2',
            age: 17
          }
        ]
      }
    }
  }
</script>
  • 开启optimization.minimize来压缩js代码

    optimization.minimize选项有两个值true和false,为true开启压缩js代码,为false关闭压缩js代码。
    在生产环境中默认为true,在开发环境中默认为false。
    如果你在开发环境不需要用debug调试代码,可以也设置为true来压缩js代码,提高页面加载速度。
    在vue.config.js中这么配置

    module.exports = {
      configureWebpack: config => {
        return {
          optimization:{
            minimize: true
          }
        }
      }
    }
    
  • 在Nginx上开启gzip压缩
    • <font color=#FF7F50 size=3 face="黑体">gzip</font>:on | off ,默认为off,on为开启gzip,off为关闭gzip。
    • <font color=#FF7F50 size=3 face="黑体">gzip_min_length</font>:number,压缩起点,文件大于多少才进行压缩,单位默认为字节,也可用k表示千字节。
    • <font color=#FF7F50 size=3 face="黑体">gzip_comp_level</font>:压缩级别,1-9,数字越大,压缩后的大小越小,也越占用CPU,花费时间越长。
    • <font color=#FF7F50 size=3 face="黑体">gzip_types</font>:需要进行压缩的文件类型。类型去Response headers中看Content-Type属性。
    • <font color=#FF7F50 size=3 face="黑体">gzip_buffers</font>:number size,设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。如原始数据大小为17K,则申请 (17/4)*4 = 17k内存。
    • <font color=#FF7F50 size=3 face="黑体">gzip_http_version</font>:设置gzip压缩针对的HTTP协议版本以上。
    • <font color=#FF7F50 size=3 face="黑体">gzip_vary</font>:on | off,是否在http header中添加Vary:Accept-Encoding,on表示添加。Vary:Accept-Encoding告诉代理服务器缓存两种版本的资源:压缩和非压缩,避免一个浏览器不支持压缩资源,而先请求了服务器,服务器缓存了非压缩的资源,然后一个浏览器支持压缩资源,再去请求了服务器,结果得到非压缩资源,但是又去解压它,结果会出错。所以建议设置为on。
http {
  gzip              on;
  gzip_min_length   1k;
  gzip_comp_level   5;
  gzip_types        application/javascript image/png image/gif image/jpeg text/css text/plain;
  gzip_buffers      4 4k;
  gzip_http_version 1.1;
  gzip_vary         on;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358