所以我一直在用 Lighthouse 查看 Chrome 的新审核面板,并慢慢改进我网站的指标。它目前位于 95(性能)、97(可访问性)和 75(最佳实践)。
我开始浏览这些建议,并点击了几个部分的“了解更多”链接。因此,我现在正在阅读 Google Developers 网站。然而,对我的问题特别重要的两篇文章是Render-Blocking Resources和Render-Blocking CSS。
来自Render-Blocking Resources文章,这里是最重要的摘录(CSS 文章作为一个整体基本上更详细地进行了这一点):
- 对于关键脚本,请考虑将它们内联到您的 HTML 中。对于非关键脚本,请考虑使用
async
ordefer
属性对其进行标记。请参阅添加与 JavaScript 的交互性以了解更多信息。- 对于样式表,考虑将样式拆分为不同的文件,按媒体查询组织,然后
media
为每个样式表链接添加一个属性。加载页面时,浏览器仅阻止第一次绘制以检索与用户设备匹配的样式表。请参阅渲染阻止 CSS以了解更多信息。- 对于非关键的 HTML 导入,用
async
属性标记它们。作为一般规则,async
应尽可能与 HTML 导入一起使用。
现在,为了让我的网站达到目前的分数,这是目前的情况。(我应该注意,如果可能的话,我确实计划利用它们。这只是网站目前的情况。)
当前的实现
- 该网站 100% 设计为移动优先,并兼容 240 像素到 3840 像素宽度的设备分辨率。我正在使用自适应设计,有几个断点。
- 我正在使用 HTTPS。
- 我正在使用图标精灵。
- 我正在使用非缩小的 CSS 和 JavaScript,分成几个文件,因为站点主题仍在开发中。CSS 文件包含媒体查询。
<a>
元素正在使用target="_blank"
并且rel="noopener"
不存在。<script>
元素没有使用async
或defer
属性。- 我没有使用 HTTP/2 或服务人员。
- 我通过 cPanel(“优化网站”)启用了 GZIP 压缩,针对所有内容。(如果平均加载时间更快,我准备将其限制为 HTML、PHP、CSS、JavaScript、纯文本和 XML [我计划运行一个基准测试来测试这两种场景,每个场景加载 10 次——我还没有机会对此进行测试]。)
问题
主 CSS 文件相当大(目前为 75 kiB)。除此之外,还有已经缩小的 jQuery 文件 (95 kiB),以及几个特定于网站某些区域的较小的 CSS 文件。由于我的站点(微处理器信息库)的性质,用户还应该在一次访问中查看多个页面。
为了遵守上面概述的准则,我正在考虑拆分 CSS 文件,使其不仅依赖于当前站点的部分,而且还通过媒体查询,通过使用属性的<link>
元素链接到它们,media
与 CSS 文件本身中的查询相比。
对于 JavaScript,我正在考虑将所有async
脚本组合在一个文件中,并将所有defer
脚本组合在另一个文件中。我假设将 jQuery API 代码与其他自写函数分组没有问题?
好的。有我的计划,但在退后一步思考如何实施时,有几个问题引起了我的注意,我希望你们能帮助我做出决定。这种思考过程对我来说是非常新的(部分原因是我以前从未有过这种规模的网站),所以任何输入都会很棒。
问题
由于所有 CSS 文件都已下载,无论它们是否被使用,我不确定是否一个大的主 CSS 文件是最好的方法,或者是否有更多的 HTTP 请求并按媒体类型/查询和部分拆分的网站。无论采用何种方法,CSS 都会被缩小。
<link rel="stylesheet" href="reset-min.css"> <!-- ~ 1.5 kiB; all media types --> <link rel="stylesheet" href="layout-min.css"> <!-- ~ 50 kiB; internal @media --> <link rel="stylesheet" href="color-min.css"> <!-- ~ 25 kiB; internal @media --> <!-- 3 HTTP requests; 76.5 kiB Main CSS file split into "layout" and "color" for easy editing in the future. --> vs. <link rel="stylesheet" href="reset-min.css"> <!-- ~ 1.5 kiB; all media types --> <link rel="stylesheet" href="global-screen.css" media="screen"> <!-- ~ 7 kiB; site-wide elements --> <link rel="stylesheet" href="color-screen.css" media="screen"> <!-- ~ 10 kiB --> <link rel="stylesheet" href="database-screen.css" media="screen"> <!-- 20 kiB; not on all pages --> <link rel="stylesheet" href="global-print.css" media="print"> <!-- ~ 6 kiB; site-wide elements --> <link rel="stylesheet" href="color-print.css" media="print"> <!-- ~ 7 kiB --> <link rel="stylesheet" href="database-print.css" media="print"> <!-- ~ 7 kiB; not on all pages --> <!-- 7 HTTP requests; 58.5 kiB CSS files split into "global/database" and "color" for easy editing in the future. -->
第一个问题也适用于 JavaScript 文件。我有我的函数的主 JS 文件,以及 jQuery API 文件。但是,由于函数将被
async
或defer
属性分割,这将导致更多的 HTTP 请求,但大小更小。JS 也会被缩小。<script src="jquery-min.css"> <!-- ~ 95 kiB; local --> <script src="scripts-min.css"> <!-- ~ 21.3 kiB --> <!-- 2 HTTP requests; 116.3 kiB --> vs. <script src="scripts-async-min.css" async> <!-- ~ 108.1 kiB; includes jQuery API --> <script src="scripts-defer-min.css" defer> <!-- ~ 4.3 kiB --> <!-- 2 HTTP requests; 112.4 kiB -->
我的最后一个问题实际上是关于减少网页加载的罪魁祸首——jQuery API 文件和网络字体。由于它们无论如何都会占用 HTTP 请求,您是否建议直接从 jQuery CDN 和 Google 外包,而不是在本地托管文件?我提出这一点是因为我假设 CDN 的服务速度会更快。但是,我会尽可能利用服务人员来减少下载文件的需要。
谢谢你!
感谢您阅读这篇长文。我知道我可能已经介绍了太多细节,但我不想遗漏任何可能很重要的内容。