静态资源在传输方面通用优化就是压缩体积,减少加载时间,
还涉及到http协议和浏览器并发连接限制,如果升级到HTTP2,这些就是降维打击了。
另外重点就是利用浏览器缓存
最后就是具体的使用到资源自身的优化手段。
1 HTML
- 压缩
- 减小iframes使用(iframe会阻塞onload)事件,必要时可动态加载
- 压缩空白符,删除注释
- 减少HTML嵌套关系,减少DOM节点数量
- 避免 table 布局
- CSS/Javascript尽量外链
- 提前声明字符编码,让浏览器快速确定如何渲染内容
- 语义化编码,是代码结构清晰,利于搜索引擎
2 CSS
3 IMG
3.0 使用
避免空src的图片
img标签设置alt属性,提高加载失败时的用户体验
设置图片的宽高,防止reflow
3.1 格式
常用的web图片格式有:JPEG/JPG、PNG、WebP、Base64、SVG
如蓝湖支持的图片导出格式:
3.2 懒加载
3.2.1 原生支持
<img src="./example.jpg" loading="lazy" alt="zhangxinxu">
兼容性等存在问题,参考
浏览器IMG图片原生懒加载loading=”lazy”实践指南(张鑫旭)
3.2.2 js实现
react-lazy-load-image-component
3.3 渐进式图片(Progressive JPEGs)
Baseline JPEG和Progressive JPEG的区别:一个由上而下渲染,一个先模块后清晰,
可以在ps导出是设置
参考:https://www.jianshu.com/p/e1b9d9aa9fc0
3.4 响应式图片
<img srcset="foo-160.jpg 160w,
foo-320.jpg 320w,
foo-640.jpg 640w,
foo-1280.jpg 1280w"
sizes="(max-width: 440px) 100vw,
(max-width: 900px) 33vw,
254px"
src="foo-1280.jpg">
3.5 使用base64Url减少请求
缺点是转成base64,体积变大,所以适合小图标,比如webpack默认小于8Kb才会转成base64
3.6 使用雪碧图合并图标
减少图片请求,在http2协议下可以放弃了,大型网站静态资源都升级到http2了
4 JS
5 font
@font-face {
font-family: Alibaba-PuHuiTi-Medium;
src: url('./Alibaba-PuHuiTi-Medium.otf') format('truetype');
}
h2 {
font-family: Alibaba-PuHuiTi-Medium;
}
如果使用第三方字体,浏览器会等到该字体文件加载完成后再去渲染相关文字,而该字体文件体积越大,首次加载越缓慢并且会阻塞页面文字的渲染。
解决:
减小字体资源体积
- 文字预渲染:font-display: swap
3. 字体预加载:<link rel="preload" href="/static/Alibaba-PuHuiTi-Medium.otf" as="font" type="font/otf" crossorigin>
- 文字预渲染:font-display: swap
6 网络优化
- 减少http请求数,合并js/css/img, 合理内嵌js/css
- 合理设置服务端缓存,提高二次加载速度
- 避免重定向
- 使用dns-prefetch, 进行dns预解析
- 采用域名分片技术,解决浏览器同域名限制6个并发问题
- 采用CDN加速
- 开启Gzip:
一般nginx会对静态文件Gzip压缩,但是也有要求,大小要大于1Kb,效果才好
某个项目,就发现这个情况,不会启用Gzip
最后,,nginx 服务器对 gzip 的配置项中,有一项是:gzip_min_length, 用来配置启用 gzip 压缩文件的最小体积。因为 gzip 压缩对原本体积就很小的资源文件压缩的效果也并不好,甚至可能出现使用 gzip 压缩体积很小的文件,压缩后的体积反而比压缩之前更大。所以通常会设置 gzip_min_length 1k,只有文件的体积超过了 1k,服务器才启用 gzip 压缩此文件。
- 加载数据优先级:preload(预先请求当前页面需要的资源)prefetch(将来页面要用到的资源)将数据缓存到http缓存中