XiaoShang Replay


  1. 新增加的组件
  • 表单元素和Vuex
  • c-accordion
  1. 新使用的第三方组件
  • portal-vue
  • vue-virtual-scroller
  • preload-webpack-plugin
  • html-critical-webpack-plugin
  1. 一些坑
  • 微信签名失败
  • 微信分享接口调用失败的原因
  • 微信浏览器中刷新页面

4.思考

  • code split粒度
  • 不要使用匿名函数 anonymous function(for debugging)

5.其他

  • vue official style guide

1. 新增加的组件

表单元素和Vuex

通过vuex同步不同表单元素之间的值,即使表单元素在不同页面之中

// store.js
const state = {
  val: 'Hello World!'
}

const mutations = {
  changeMsg (state, msg) {
    state.val = msg
  }
}

export default new Vuex.Store({
  state,
  mutations
})
// 组件内通过computed属性读取/修改Vuex中的变量
  export default {
    name: 'Input1',
    data () {
      return {}
    },
    computed: {
      message: {
        get () {
          return this.$store.state.val
        },
        set (value) {
          this.$store.commit('changeMsg', value)
        }
      }
    }
  }
input1

)

Input2

修改Input1的值,在不同页面的Input2的值页也被修改了

晓商中搜索的条件筛选组件使用了相同的原理


晓商-条件筛选
晓商-搜索结果页

c-accordion 手风琴菜单

晓商-我的关注

为了避免浏览器的reflow/layout, 菜单的折叠/展开的过渡效果没有使用transiton: max-height(PS: height: auto & transition: height 是不会产生动画效果的),而是通过transform实现。

为什么?

what is reflow

what is reflow

what forces layout/reflow

transition: max-height 真的会导致reflow/layout 吗

  .accordion-item-content {
    max-height: 240px;
    transition: max-height .3s;
  }
每一帧都有layout过程

通过transform 实现

每一帧都没有layout过程

How

vue中transition-group的也使用了FLIP原理

accordion-menu 折叠时的动画原理

2. 新使用的第三方组件

portal-vue

PortalVue is a set of two components that allow you to render a component's template (or a part of it) anywhere in the document - even outside of your the part that is controlled by your Vue App!

DEMO: http://runjs.cn/detail/gmg2uql3

why portal-vue

vue-virtual-scroller

问题:随着列表的向下滚动,会加载更多的数据,同时生产更多的DOM节点。

为了防止页面中的DOM节点无限制地增长,使用了vue-virtual-scroller。该组件会随着滚动条的位置,自动删除离开视窗的DOM节点,插入新的进入视窗的DOM节点。

滚动位置变化了,DOM节点的数目几乎不变

preload-webpack-plugin

问题:使用路由级别的异步加载,页面跳转时,会停顿一下,等页面顶部的下条条消失才会发生跳转。

A Webpack plugin for automatically wiring up asynchronous (and other types) of JavaScript chunks using <link rel='preload'>. This helps with lazy-loading.

what is preload good for?
what is preload good for? -- 中文翻译

Prefetch

<link rel=“prefetch”>但Preload与这两者不同,<link rel=“prefetch”>的作用是告诉浏览器加载下一页面可能会用到的资源,注意,是下一页面,而不是当前页面。因此该方法的加载优先级非常低(自然,相比当前页面所需的资源,未来可能会用到的资源就没那么重要了),也就是说该方式的作用是加速下一个页面的加载速度

资源加载的优先级可以通过DevTool查看

Preload

  • 资源的提前加载
    preload 一个基本的用法是提前加载资源,尽管大多数基于标记语言的资源能被浏览器的预加载器(Preloader)尽早发现,但不是所有的资源都是基于标记语言的,比如一些隐藏在 CSS 和 Javascript 中的资源。当浏览器发现自己需要这些资源时已经为时已晚,所以大多数情况,这些资源的加载都会对页面渲染造成延迟。
    现在,有了 preload,你可以通过一段类似下面的代码对浏览器说,”嗨,浏览器!这个资源你后面会用到,现在就加载它吧。“
    <link rel="preload" href="late_discovered_thing.js" as="script">
  • 对字体的提前加载
    <link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>
  • 动态加载,但不执行
    难道我们不是已经有了<script async>? <scirpt async>虽好,但却会阻塞 window 的 onload 事件。某些情况下,你可能希望这样,但总有一些情况你不希望阻塞 window 的 onload 。
  • 响应式加载
    通过 Preload,我们可以提前加载资源,利用 media 属性,浏览器只会加载需要的资源。
    <link rel="preload" as="image" href="map.png" media="(max-width: 600px)">
    <link rel="preload" as="script" href="map.js" media="(min-width: 601px)">

# 带你玩转prefetch, preload, dns-prefetch,defer和async

prefetch支持情况

preload支持情况
使用preload-webpack-plugin后的效果

html-critical-webpack-plugin

解决的问题: 加快首屏渲染速度


使用了html-critical-webpack-plugin后,首屏渲染时间发生在657.04ms

没有使用html-critical-webpack-plugin,首屏渲染时间发生在1.32s

原理:利用headless browser,检测出首屏渲染的css,然后将这部分css插入到index.html文件中

缺点:critical css因为在index.html中,增大了index.html文件的体积,同时失去了被缓存的可能

扩展阅读:understanding-critical-css

一些坑

  • 微信签名失败
    可能是url编码(encodeURIComponent)的原因导致的
  • 微信分享接口调用失败
    要在每次进入页面前(如beforeEnter),都进行权限验证配置注入
export const wxConfig = () => {
  if (!isWXEnv()) { return; }
  Vue.http.get('/wechat/signature', {
    params: {
      // url: window.encodeURIComponent(window.location.href)
      url: window.encodeURIComponent(window.location.href.split('#')[0])
    }
  }).then(response => {
    const result = response.body;
    // 配置信息
    debugFlag && alert('wxConfig called');
    window._wx.config({
      debug: isDevEnv(),
      appId: result.data.appId,
      timestamp: result.data.timestamp,
      nonceStr: result.data.nonceStr,
      signature: result.data.signature,
      jsApiList: [
        'onMenuShareTimeline',
        'onMenuShareAppMessage',
        'hideMenuItems',
        'showMenuItems',
        'showAllNonBaseMenuItem'
      ]
    });
  }, e => { alert(`WX权限验证配置注入失败--${JSON.stringify(e)}`); });
};

一些思考

code split的粒度

  • 每个组件都异步加载?
    优点: 组件可以被缓存起来,一次请求,多次复用
    缺点: js代码被分割成太多的小文件,js文件请求数增加。服务器压力?
  • 只是基于路由的异步加载?
  • 全部被多次复用的组件可以使用相同的chunkName,打成一个包
js文件加载情况

不要使用匿名函数 anonymous function(for debugging)

anonymous function
(() => {
      throw new Error('can we get arrow name ?');
})();
named function
const testArrowErrorTrack = () => {
  throw new Error('can we get arrow name ?');
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • UI组件element ★11612 - 饿了么出品的Vue2的web UI工具套件 Vux ★7503 - 基于...
    董董董董董董董董董大笨蛋阅读 8,499评论 6 123
  • 来源:github.com Vue.js开源项目速查表:https://www.ctolib.com/cheats...
    zhangtaiwei阅读 11,593评论 1 159
  • 暖冬夜市上的香料酒 葡萄酒加卤料包 喝完我就晕了……
    chem2018阅读 164评论 0 0
  • 16.5.24(英语课 我想抄英语作文) 天空阴沉沉的,天空在忧郁吗? 我喜欢古灵阁,还有里面的妖精。 听风...
    喵_酱_阅读 198评论 0 0
  • 被蹂躏了一晚的我,怎叫一个惨字了得啊!真是对沈竹,无话说了。重要的问题是,我现在连说话的力气都无。 腰酸,背痛...
    君兮阅读 1,185评论 0 2