虽然我们致力于打造美观的前端界面,但是网站的性能同样至关重要。对于各位职业小伙伴来说,了解并提升用户体验是至关重要的。在前文的两期文章中,我们已经详细介绍了如何从代码层面进行性能优化。本期将为大家揭开网络传输层优化的神秘面纱,这也是我们性能三部曲的终极篇——《高效提升用户体验:全方位网页优化策略》。
首先,让我们回顾一下HTTP请求的完整过程,即DNS解析。当浏览器搜索一个网址时,首先会查阅自身的DNS缓存。如果缓存中没有找到相关信息,浏览器则会查找系统自身的DNS缓存。如果仍然没有结果,它会尝试从hosts文件中寻找。最终,在所有上述步骤均未能获取到所需信息的情况下,浏览器将向域名服务器递归查询。
建立TCP链接后,浏览器将以一个随机端口(14><端口>65535)向服务器的WEB程序(如httpd、nginx等)的8端口发送链接请求。连接请求经过TCP/IP4层模型层层封包,最终到达服务器端。这期间会涉及到各种路由设备和局域网内的数据传输。
进入网卡后,数据将传入内核的TCP/IP协议栈。这时,数据会被识别、解封包并逐层剥离。同时,它还可能经过Netfilter防火墙(内核模块)的过滤。最终,当TCP连接建立后,即完成了数据的传输。
接下来是三次握手/四次握手的优化过程。例如,SYN> SYN-ACK > ACK,这确保了客户端与服务器之间的有效沟通。对于HTTPS协议,还有一个ssl握手过程。
Web浏览器发送HTTP请求报文后,由三部分组成:请求行、请求头和请求正文。而Web服务器响应也包含三个部分:状态码、响应头和实体内容。
为了优化网页性能,我们可以采取以下措施:
- 优化DNS解析:利用缓存加快解析速度。
- 使用DNS负载均衡:为同一个主机名配置多个IP地址,实现在应答DNS查询时对每个查询按顺序返回不同解析结果,将客户端的访问引导到不同的机器上。
- 强化缓存性能:
- 强缓存和协商缓存的概念:浏览器在加载资源时会根据HTTP头部信息判断是否命中强缓存。若命中,则直接从缓存中读取资源,不再请求服务器。当强缓存未命中时,浏览器会向服务器发起请求,然后依据资源的HTTP头部验证是否命中协商缓存。
- 缓存的实现:本地磁盘和内存(内存模式主要应于无痕浏览)。实现方式包括Expires、ETag、Last-Modified、Keep-alive以及Cache-Control等。
此外,利用ServiceWorker概念可以实现在后台启动的一条服务 Worker 线程,负责管理资源缓存。结合Web推送通知功能,可实现在离线状态下使用网站,并在断网时提示用户把网站添加至桌面。
兼容性问题:现在所有的浏览器均支持ServiceWorker功能。
接下来,我们可以运用Chrome Devtools进行优化传输资源检查与优化体积。具体来说,可以通过以下工具实现:
- console.log: 不解释
- console.table: 表格形式打印复杂的数据结构
- console.dir: 递归打印对象的所有属性
- console.trace(): 追踪函数的调用轨迹
- console.group()、console.groupEnd(): 分组打印信息
- 带样式打印
最后,我们要检查并删除无用的CSS/JS。
总之,高效提升用户体验需要我们从网络传输层做起,通过对DNS解析、TCP连接以及HTTP请求的优化,实现在各个环节中减少延迟和资源浪费。希望以上策略对大家有所帮助。