医程通前端性能优化

做减法

  1. 去掉对用户影响较少同时耗时较多的请求(如:选择医院定位功能,可移至用户点击地方筛选的时候调用)
  2. 删除冗余代码

删除冗余代码

一些无用的代码及时去除

删除无用代码



图片懒加载与压缩

  1. 图片延迟加载(适合于多图片加载页面)
  2. 响应式图片(根据屏幕大小自动加载合适分辨率图片)

限制图片上传

⚠️需求 后续迭代需要限制医院logo的图片大小,目前人手不足可手动更换,可以将图片更换为15KB以内

医院头像

⚠️注意 : 目前医院头像后台上传没有限制,合适的尺寸为 分辨率126*126,jpg / png格式

实现懒加载

  1. 预加载默认图片
<!-- 预加载一个loading动画 -->
<img src="loading.gif" data-src="src/image"
1
2
  1. 监听页面滚动,滚动到视窗后,将data-src替换为真实的src
function landlord(event) {
    for (var i = n; i < imgNum; i++) {
        if (img.eq(i).offset().top < parseInt($(window).height()) + parseInt($(window).scrollTop())) {
            if (img.eq(i).attr("src").indexOf('loading')) {
                var src = img.eq(i).attr("data-src");
                img.eq(i).attr("src", src);
                n = i + 1;
            }
        }
    }
}

landlord();
$(window).scroll(landlord)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

webp图片格式

技术来源:Google开发的有损和无损压缩的图片格式,支持透明度,同时支持动图。

根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使这些 PNG 文件经过其他压缩工具压缩之后,WebP 还是可以减少 28% 的文件大小。

测试结果

在无损的情况下,肉眼几乎看不出区别,经过png无损压缩后依然能大小减少了33%左右的体积,确实如google的测试相近。

而且使用有损压缩90%下更是夸张地减少了84%的体积,不过过于鲜艳的颜色会有所丢失,肉眼查看差距不大,相比下能减少如此之多的图片大小绝对值得使用。

2

兼容性问题

⚠️注意:万年不支持Webp的苹果在今年推出的新系统也默认支持该格式。 Apple Adds WebP Image Support in Safari 14. iOS 14 and macOS 11 Big Sur.

绿色标记为支持版本,其中安卓4以上原生支持。现在市面上几乎全面支持webp格式,即便不支持也可以使用替换方案去保底。

webp支持情况-20201217兼容性测试 Can I Use在新窗口打开

<picture>
    <!-- source都不支持,img才会显示 -->
  <source type="image/svg+xml" srcset="pyramid.svg">
  <source type="image/webp" srcset="pyramid.webp">
  <img src="pyramid.png">
</picture>
1
2
3
4
5
6

使用腾讯智图gulp插件

智图pc端下载在新窗口打开,可手动压缩和转格式应用

==压缩最优选择「原图压缩」,经过其他工具压缩或转格式效果并不是最好的==

智图API接入在新窗口打开,由于需要node服务的支持,目前项目的技术栈无法实现。

小结

响应式图片

  1. 可应用于体积较大页面,如:康众/健康会员的切图。
  2. 大胆使用webp格式减少图片体积,同时使用png作为候补
  3. 简单图形使用SVG替代(如:「我的」页面)

懒加载应用

  1. 预加载默认图片,用户通过滑动后再加载图片

规范HTML、CSS、JS

  1. 嵌入在表头的style将其分离到样式表中,减少阻塞
  2. 使用flexbox布局,减少多标签div+p+span嵌套

改造:利用查询表循环生成DOM

案例:布局

.flex {
    display: flex;
    justify-content: space-between;
}

.flex p {
    white-space: nowrap;
    width: 50%;
}

.flex li span {
    text-align: justify;
    /* 英文与数字换行 */
    word-break: break-all;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

JS可配置化生成DOM

const array = [
    { "姓名": data[0].name },
    { "卡号": data[0].bankCard },
    { "手机号码": data[0].phone },
]

/** jq方法更简单
* $('<li class="flex"><p>${Object.keys(data)}</p><span>${Object.values(data)}</span></li>').appendTo(#39;#list')
*/
let html = ''
array.map(data => {
    html += `<li class="flex"><p>${Object.keys(data)}</p><span>${Object.values(data)}</span></li>`
})
window.list.innerHTML = html
1
2
3
4
5
6
7
8
9
10
11
12
13
14

实现效果 ↓

flex+li布局


减少意大利面条代码

随着状态增多,代码量翻倍增长

ftl与js dom


相比ftl <#if><#else>页面更清晰,代码数量更少。

增加==哈希表 / 数组 / 对象==形成查询表可有效减少状态判断的复杂性,思路更加清晰。

数据与html标签分离1

数据与html标签分离2



end.

上次更新:
作者: Aziz-pang