- 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/
有人告诉我,如果我只有一个“东西”,比如家(不是多个家),我应该在 routes.rb 中使用资源 :home,而不是资源 :home。但是当我查看路由时,POST 函数似乎想要 home#creat
Activity 开始。这些代码框架顺利通过。 // Initialize array adapters. One for already paired devices and //
资源 search-hadoop.com search-hadoop.com索引所有邮件列表,非常适合历史搜索。当你遇到问题时首先在这里搜索,因为很可能有人已经遇到了你的问题。 邮件列表 在A
我是 WPF 的新手,正在努力使用位于单独程序集中的样式。这就是我正在做的:- 我有一个带有\Themes 文件夹的类库项目,其中包含一个“generic.xaml”,它合并了\Themes 内的子文
我正在编写一个使用虚拟树状文件结构的插件。基本上它就像一个包含文件的标准文件系统,区别在于这些文件实际上并不存在于文件系统中的特定位置,而只是 java 对象。 这些当前由使用 SettingProv
如果我在 XAML 中使用以下内容,我会收到错误消息: 错
我正在使用 laravel 资源来获取 api 的数据: return [ 'id' => $this->id, 'unread' =>
我有以下 pom.xml: 4.0.0 mycompany resource-fail 0.0.1-SNAPSHOT BazBat
许多GDI +类都实现IDisposable,但是我不确定何时应该调用Dispose。对于使用new或静态方法(例如Graphics.CreateGraphics)创建的实例来说,这很明显。但是,由属
我正在构建一组 RESTful 资源,其工作方式如下:(我将使用“people”作为示例): 获取/people/{key} - 返回一个人对象 (JSON) GET/people?first_nam
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一个使用 $resource 的简单 Controller : var Regions = $resource('mocks/regions.json'); $scope.regions =
在 Azure 门户中,如何查看不同资源之间的依赖关系。我特别想查看哪些资源正在使用我要删除的存储。 最佳答案 您可以使用应用程序洞察应用程序 map 来执行此操作: 您还可以打开存储帐户的日志记录:
我正在使用 ionic 生成资源(图标和启动画面)。我正在使用 ionic v2.1.0 和 cordova v6.4.0。 到目前为止我一直在使用(它在以前的版本中工作): cordova plat
是否可以使用 Assets 包含子文件夹中的文件? 示例:[base_url]/assets/css/pepper-grinder/jquery-ui-1.8.11.custom.min.css 最佳
我正在阅读一些尝试教授 Android 开发的书。在书中,作者概述了 res/下的一些目录。他提到 res/menu 包含基于 XML 的菜单规范。他还提到了保存“通用文件”的 res/raw。当我创
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我在服务器上使用 express-resource。在我的 AngularJS Controller 中: var User = $resource('/services/users/:use
因此,每当我运行我的应用程序时,它都会立即崩溃并给出以下错误: No package identifier when getting value for resource number 0x00000
对于我正在创建的(网络)应用程序,我需要使用基本身份验证在我的 UIWebView 中加载页面。 现在设置我使用的授权 header : NSString *result = [NSString st
我是一名优秀的程序员,十分优秀!