C M Pandey 原作,授权 New Frontend 翻译。
在这篇文章里,我会跟大家分享我是如何让自己的作品集网站在 0.8 秒内加载完成的。
1. 不要使用太大的 DOM 树
我的作品集网站包含 487 个 DOM 元素,DOM 树的深度是 13,每层最多 20 个子元素。
太大的 DOM 树会拖慢网页:
- 内存
在过大的 DOM 树上应用查询选择器(比如
document.querySelectorAll('li')
)会保存多个节点的引用,这可能占用大量设备内存。 - 网络效能和加载速度
巨大的 DOM 树包含许多节点(有些节点在初次加载时不可见),这会拖慢加载速度,消耗用户的网络流量。
- 用户或脚本与网页产生交互时的运行时性能
此时浏览器需要重新计算节点的位置和样式,因此 DOM 树过大时渲染会变慢。如果样式规则很复杂,渲染性能会雪上加霜。
2. 不要使用巨大的网络载荷
我的作品集网站的网络载荷(payload)大小只有 764 KB。
你的网站的网络载荷大小应该低于 1600 KB。
为了达成这一目标,你可以从以下几个方面着手:
- 延迟请求,按需加载。
- 极简化(minify)、压缩(compress)网络载荷。
- 将 JPEG 图像的压缩级别设置为 85。
永远不要忘记,更大的网络载荷会带来更多的流量成本。
3. 不要使用 GIF
静态图像用 PNG 或 WebP。动画内容考虑使用 MPEG4 或 WebM 视频格式,GIF 图像存储效率低、显示效果差。
你也许会说你需要:
- 自动播放
- 循环播放
- 无声播放
HTML5 的 video
标签完全可以实现这些效果:
<video autoplay loop muted playsinline>
<source src="my-animation.webm" type="video/webm">
<source src="my-animation.mp4" type="video/mp4">
</video>
4. 预加载关键请求
假设页面正加载一个 JS 文件,这个 JS 文件本身会获取另一个 JS 文件和一个 CSS 文件,那么直到这些资源下载、解析、执行完毕前,页面都不会完整显示。
如果浏览器能够在更早的时候发起这些请求,就能节省许多时间。很幸运,预加载链接可以做到这一点。
<link rel="preload" href="style.css" as="style">
5. 少用重定向
重定向会拖慢网页的加载速度。浏览器请求某个重定向资源时,服务器会返回一个 HTTP 响应。接着浏览器必须发起另一个 HTTP 请求,从新的地址获取资源。这些额外的网络往返会拖慢资源的加载速度,可能会拖慢几百毫秒。
与其将移动端用户重定向到移动端版本的页面,不如将网站重新设计成响应式。
6. 预连接重要的第三方站点
使用 preconnect
告诉浏览器提早和重要的第三方站点建立连接。
<link rel="preconnect" href="https://www.google.com">
以上代码会和站点建立连接,并告知浏览器你希望在尽可能早的时候启动这一进程。
7. 使用高效的图像编码
JPEG 图像的压缩级别设为 85 就已经足够好了。你还可以使用多种方式优化图像大小:
- 压缩图像。
- 使用优化图像的 CDN。
- 避免使用 GIF。
- 响应式图像。
- 按需加载图像。
8. 极简化 JavaScript 文件
极简化指移除空格和非必需的代码以创建更小的代码文件的过程。
极简化 JavaScript 文件可以缩小载荷,节省解析时间。
JavaScript Minifier 是一个可以极简化 JavaScript 的在线工具。
9. 极简化 CSS 文件。
相比其他文件,CSS 文件的空格更多。极简化肯定能省下一些字节。再比如颜色值可以极简化成等价的简写形式,比如 #000000
和 #000
是等价的。
CSS Minifier 是一个可以极简化 CSS 的在线工具。
10. 调整图像分辨率
我打赌在网站优化的建议中,这是最常提到的一条。因为图像的大小一般来说要比任何脚本文件大很多,所以尽量避免使用分辨率过大的图像。
你永远不应该上传分辨率大于屏幕渲染尺寸的图像,这毫无意义。
你可以直接修改图像的分辨率,或者使用:
- 响应式图像。
- 支持优化图像的 CDN。
- SVG 图标。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。