- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在测试我创建的网络的性能。我尝试使用 Google's Page Speed和GT Metrix .在每个应用程序中产生不同的性能结果。
我试图在 Top Issue GT Matrix 中查看结果,app.css
中的渲染资源存在问题。我试图通过使用下面的代码来解决这个问题,初始渲染结果看起来不太好。
谁能帮我解决这个问题?
<link rel="stylesheet" href="http://103.148.190.87/css/app.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link rel="stylesheet" href="http://103.148.190.87/css/app.css">
</noscript>
最佳答案
当浏览器请求您的页面时,它需要 HTML 和 CSS 才能正确呈现出现在“首屏”的任何内容。
“首屏”本质上是指无需滚动即可在屏幕上看到的任何内容。
关键 CSS 是呈现首屏内容所需的所有 CSS。
如果您的网站恰好是用 JS 呈现的,那么您还需要使用我在下面描述的类似技术来处理/呈现初始页面内容所需的 JS。但是这个答案是针对CSS的(原理是一样的,只是方法不同)。
如果您的样式在外部样式表中,浏览器必须执行以下操作:
如果有人使用高延迟连接(例如 4G,到服务器的往返时间可能为 300 毫秒或更长),那么对 CSS 的额外网络请求确实会降低页面速度。
相反,我们想要做的是提供立即呈现首屏内容所需的所有样式,这样就不需要进一步的网络请求。
原理很简单,但要做到正确可能相当困难,可能需要一点耐心。
有很多方法可以做到这一点,但它们通常取决于您的构建过程、堆栈等。
原则上,虽然您正在寻找一种工具,可以将首屏的 HTML 映射到与这些元素匹配的 CSS 类和样式。该工具随后应为您导出这些样式。
不幸的是,我还没有看到一个 100% 有效的工具,所以我建议你使用一个工具来获取大部分样式,然后(在内联关键 CSS 之后 - 见下文)删除所有外部样式表和查看是否有无法正确呈现的内容。在包含外部 CSS 的页面上检查它们并复制样式。
如果您在设计网站时没有考虑到这一点,这可能会很费力,但这是值得的。
一旦确定了关键 CSS,您只需将其内联即可。
这只是意味着您将其缩小,然后将其添加到您的网站中 <style>
页面顶部的标记。
这又回到了我在介绍中所说的部分。一旦你内联了所有的样式,浏览器就拥有了渲染页面所需的一切,而无需另一个网络请求。这极大地帮助了您的 First Contentful Paint、Largest Contentful Paint(通常)等。
现在您已经内联了关键的 CSS,您只剩下两个步骤了:
<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="styles.css"></noscript>
Here's how it works:
link rel="preload" as="style"
requests the stylesheet asynchronously. You can learn more about preload in the Preload critical assets guide.- The
onload
attribute in thelink
allows the CSS to be processed when it finishes loading.- "nulling" the
onload
handler once it is used helps some browsers avoid re-calling the handler upon switching therel
attribute.- The reference to the stylesheet inside of a
noscript
element works as a fallback for browsers that don't execute JavaScript.
取自https://web.dev/defer-non-critical-css/
为了说明这一点,我们假设我们有一个网站,其中有一个简单的英雄部分出现在首屏之上。只需要三个 CSS 类就可以使这个英雄部分正常工作,因此我们为它内联 CSS。
<style>
.hero{
min-width: 100%;
height: 100vh;
background: #333;
}
.hero h1{
position: relative;
float: left;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #fff;
}
section{
width: 75%;
margin: 0 auto;
padding-top: 20px;
}
</style>
然后我们使用您描述的方法加载其余的 CSS:
<link rel="preload" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css"></noscript>
<!-- normal styles that appear below the fold -->
<link rel="preload" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css"></noscript>
<!-- all styles required for above the fold -->
<style>
.hero{
min-width: 100%;
height: 100vh;
background: #333;
}
.hero h1{
position: relative;
float: left;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #fff;
}
section{
width: 75%;
margin: 0 auto;
padding-top: 20px;
}
</style>
<!-- above the fold -->
<section class="hero">
<h1>Above the fold - all required styles inlined</h1>
</section>
<!-- below the fold -->
<section class="below">
<h2>Below the fold, all classes in external style sheet</h2>
<p class="lead">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero. </p>
<p>Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. </p>
<p>Nulla metus metus, ullamcorper vel, tincidunt sed, euismod in, nibh. Quisque volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam nec ante. Sed lacinia, urna non tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis turpis. Nulla facilisi. Ut fringilla. Suspendisse potenti. Nunc feugiat mi a tellus consequat imperdiet. Vestibulum sapien. Proin quam. </p>
<p class="h4">Etiam ultrices. Suspendisse in justo eu magna luctus suscipit. Sed lectus. Integer euismod lacus luctus magna. Quisque cursus, metus vitae pharetra auctor, sem massa mattis sem, at interdum magna augue eget diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi lacinia molestie dui. Praesent blandit dolor. Sed non quam. In vel mi sit amet augue congue elementum. Morbi in ipsum sit amet pede facilisis laoreet. Donec lacus nunc, viverra nec, blandit vel, egestas et, augue. Vestibulum tincidunt malesuada tellus. Ut ultrices ultrices enim. </p>
<p>Curabitur sit amet mauris. Morbi in dui quis est pulvinar ullamcorper. Nulla facilisi. Integer lacinia sollicitudin massa. Cras metus. Sed aliquet risus a tortor. Integer id quam. Morbi mi. Quisque nisl felis, venenatis tristique, dignissim in, ultrices sit amet, augue. Proin sodales libero eget ante. Nulla quam. Aenean laoreet. </p>
</section>
关于css - 如何消除渲染阻塞资源(app.css)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68035757/
对于一个简单的聊天程序,我使用了一个通过 boost::python 包装的 c 库。 使用 PyQT 编写了一个简单的 GUI。接收消息是通过阻塞调用完成的lib说。对于独立刷新的 GUI,通信部分
当我创建以下内容时,我试图创建一个可以被异常终止的线程类(因为我试图让线程等待一个事件): import sys class testThread(threading.Thread): def
我正在用 Haskell 编写服务器,我想在客户端断开连接后显式关闭它们。当我调用 hClose ,线程将阻塞,直到客户端关闭其一侧的句柄。有没有办法让它在不阻塞的情况下关闭? 提前致谢! 最佳答案
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: garbage collection Operation 我有几个相关问题。 1.JAVA垃圾收集器运行时,是否占用
我有一个 Angular 函数,它在初始 URL 中查找“列表”参数,如果找到,就会出去获取信息。否则我想获得地理位置。如果存在 URL 参数,我不想获取地理位置。我使用的术语是否正确? constr
我读了很多关于锁定数据库、表和行的文章,但我想要较低的锁定,比如只锁定“操作”,我不知道如何调用它,假设我在 php 中有函数: function update_table() { //que
在我的多线程 mfc 应用程序中,m_view->SetScrollPos 处于阻塞状态并且所有应用程序都被卡住。 View 是在另一个线程中创建的,这是这种行为的原因吗? //SetScrollPo
FreeSwitch 软件在几天内运行良好(~3 - 5 天),然后由于 FreeSwitch 被阻止,新的来电请求被接受!!正在进行的调用继续他们的 session ,他们的调用似乎没有受到影响,但
我有一组按钮,当鼠标悬停在这些按钮上时,它们会改变颜色。这些的 CSS 以这种方式运行: #navsite ul li button { height: 60px; width: 60
由于某些原因,当我调用 WSARecvFrom 时,该函数在接收到某些内容之前不会返回。 _socket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, N
我了解一些关于 Oracle 阻塞的知识——更新如何阻塞其他更新直到事务完成,写入者如何不阻塞读取者等。 我理解悲观和乐观锁定的概念,以及有关丢失更新等典型银行教科书示例。 我也理解 JDBC 事务隔
在两个代码点之间,我是否可以判断进程是否已被内核抢占,或者更确切地说,当时是否有任何其他代码在同一处理器上运行? //Point A some_type capture = some_capture(
这是我在 Oracle 的面试问题。 有一个堆栈,即使堆栈已满,push 操作也应该等到它完成,即使堆栈为空,pop 操作也应该等到它完成。 我们怎样才能做到这一点? 我的回答 让一个线程做push
我想知道是否有人可以告诉我如何有效地使用循环平铺/循环阻塞进行大型密集矩阵乘法。我正在用 1000x1000 矩阵做C = AB。我按照 Wikipedia 上的循环平铺示例进行操作,但使用平铺得到的
我正在阅读有关绿色线程的内容,并且能够理解这些线程是由 VM 或在运行时创建的,而不是由操作系统创建的,但我无法理解以下语句 When a green thread executes a blocki
我正在创建的 JavaScript API 具有以下结构: var engine = new Engine({ engineName: "TestEngine", engineHost
ChildWindow 是一个模态窗口,但它不会阻塞。有没有办法让它阻塞?我基本上想要一个 ShowDialog() 方法,该方法将调用 ChildWindow.Show() 但在用户关闭 Child
我需要一些关于如何调试 10.6 版本下的 Cocoa 并发问题的指导。我正在将“for”循环转换为使用 NSOperations,但大多数时候,代码只是在循环的某个时刻卡住。我可以在控制台中看到 N
我正在使用 ReportViewer 控件和自定义打印作业工作流程,这给我带来了一些问题。我的代码看起来有点像这样: ids.ForEach(delegate(Guid? guid)
我有以下成功复制文件的代码。但是,它有两个问题: progressBar.setValue() 之后的 System.out.println() 不会打印 0 到 100 之间的间隔(仅打印“0”直到
我是一名优秀的程序员,十分优秀!