CSS性能优化:可以试一试内联CSS?

在互联网的早期,网站主要用于显示基于文本的信息。慢慢地,我们的连接速度得到了提高,用户能够相当快地下载高分辨率图像和视频。现在,网站做的不仅仅是以文本形式提供必要的信息。随着CSS和JavaScript框架、插件的很多等等,网站变得越来越复杂。在播放所有这些操作后,加载所有这些所需的所有文件可能需要一些时间。

更快的网站可以带来更好的用户体验,这可以使一个网站的成功产生巨大的变化。开发人员可以做什么来开始改进性能?开发人员可以做的一件事非常有帮助,就是内联关键CSS和异步加载非关键CSS。在这篇文章中,我们将一个个讨论这些要点,并帮助您提高网站的性能。

什么是关键 CSS?

项目中的关键 CSS 是用于设置网站以上内容样式的 CSS。以上内容是用户首先在您的网站上看到的,其中可以包括导航和其他元素。因此,尽快调整网站的样式和呈现这一部分非常重要。

有一件事,我想在这里提到,你的访问者可能使用无数的设备与不同的视口访问您的网站。因此,上述内容本身不会有太大帮助。要解决此问题,您还应考虑与基本布局和排版相关的任何 CSS 也至关重要。

现代 Web 开发实践通常建议您将关键 CSS 内联。它会被放置在您的网页,像这样:

<!doctype html>
<html><head><title>An Optimized Web Page</title><style type="text/css"> (Your minified critical CSS would be here) </style></head><body>(Your markup)</body>
</html>

为什么内联是必要的?

如果您前往 Google PageSpeed Insights 并分析您的网页之一,您可能会看到有关通过内联关键 CSS 和异步加载渲染阻止样式表来优化 CSS 交付的警告。

浏览器不会呈现网页的上述内容,除非它们已加载所有 CSS 文件。当需要加载大量文件时,这可能是一个大问题。

并非所有用户都有快速的互联网连接,等待库、CSS 和 JavaScript 加载后,他们才能实际访问他们来的内容,这会非常令人沮丧。即使快速互联网的用户在某些情况下也可能会失去连接,例如当他们通过隧道时。此时,如果您的网站已将关键 CSS 中装,并且在显示主要内容之前不加载其他文件,则他们仍然能够访问主要内容。

下图说明了常规网页和优化网页的区别。如您了解,优化版本将允许用户提前 0.5 秒访问内容。当需要加载大量额外的库时,改进将更为明显。

您应该内联关键 CSS 吗?

这取决于情况。如果您没有使用任何繁重的框架或库,并且您自己的 CSS 文件也具有小尺寸,则您可能不需要内联您的 CSS。

如果使用像 Bootstrap 这样的框架,则可能没有使用框架提供的所有功能。在这种情况下,您只需从框架的样式表中提取关键 CSS,然后异步加载实际框架。这将显著提高您的网站速度。

内联时,可以缓存样式表。HTML 通常不缓存(这样做通常不是个好主意!这意味着两者之间偶尔会有区别。更新时请记住这一点!此外,每次用户加载您的网站时,输入的 CSS 都会产生一些额外的页面权重。例如,如果网站的每一页上都有 30kB 的内联 CSS,则单个用户 10 个页面浏览量将花费用户 300kB。这听起来可能没什么大不了的,但数据在世界某些地区(以及一些3G/4G数据计划)非常昂贵。确保您计划内联的CSS对您的网页真正至关重要,并且您并不是内联所有内容。

查找关键 CSS

手动查找关键 CSS 将是一项令人生畏和枯燥的任务。幸运的是,有可用的工具可以帮助您快速完成。

使用grunt

如果你熟悉grunt构建系统,有一个插件,使这个过程更容易 - 流行的咕咕批评插件。如果您喜欢 Gulp 或使用 npm,请参阅以下部分,了解如何使用这些内容执行此过程。

首先,您需要使用以下命令安装插件:

npm install grunt-critical --save-dev

您还需要创建 。这将包含所有代码,用于为插件设置各种选项,包括视口维度以及源文件和目标文件的路径。下面是一个示例:Gruntfile.js

module.exports = function(grunt) {grunt.initConfig({critical: {extract: {options: {base: './',width: 1024,height: 768,minify: true},src: 'path/to/initial.html',dest: 'path/to/final.html'}}});grunt.loadNpmTasks('grunt-critical');grunt.registerTask('default', ['critical']);};

在我们的包装函数中,我们使用 方法指定所有配置选项。在这种情况下,我指定了一个基本目录,其中要写入源文件和目标文件。我还将 选项设置为 。这给了我插件提取的关键CSS的最终分明版本。该属性包含要操作的源文件的位置。属性包含需要保存最终输出的位置。grunt.initConfigminifytruesrcdest

如果文件是样式表,则生成的 CSS 将保存到文件以供将来使用。但是,如果属性是标记文件(HTML、PHP 等),则 CSS 是 inlined,现有样式表被包装在 JavaScript 函数中,以便异步加载它们。还为禁用 JavaScript 的用户添加了一个块。还有其他选项可供选择。您可以访问关键文档上的选项的完整列表。destdestnoscript

现在,您可以通过键入控制台来运行插件:grunt

C:\path\to\project>grunt

如果您的初始文件有以下标记:

<!doctype html>
<html><head><title>The Optimizer</title><link rel="stylesheet" href="link/to/stylesheet"></head><body><div>All the markup stuff</div></body>
</html>

现在看起来像:

<!doctype html>
<html><head><title>The Optimizer</title><style type="text/css">Minified Inlined CSS</style><script id="loadcss">JavaScript to load styles asynchronously...</script><noscript><link rel="stylesheet" href="link/to/stylesheet"></noscript></head><body><div>All the markup stuff</div></body>
</html>

正如你所看到的,这个插件做你所有的工作为你。现在,如果您使用 PageSpeed 分析网页,您应该获得更好的分数。以我的情况来说,比分从86改为95。

还有其他的插件可用于G朗特,实现类似的壮举 -咕咕批评和咕咕笔的纸。但是,使用这些插件时,您必须指定从中提取关键 CSS 的样式表。

使用 npm 模块

关键是由艾迪·奥斯马尼创建的npm包,它包含了咕咕关键插件使用的功能。您可以使用 Grunt 使用它来提取和内联关键路径,或使用 JavaScript 和 npm 从网页的折叠 CSS 上方。要安装该包,您需要运行:

npm install critical --save-dev

安装包后,您需要在项目目录中创建一个 JavaScript 文件,并在中放入以下代码。

var critical = require('critical');critical.generate({inline: true,base: 'initial/',src: 'homepage.html',dest: 'final/homepage.html',width: 1366,height: 768
});

您可以指定一组选项来创建优化的网页。将内联设置为将生成包含 CSS 的 HTML 页面,否则将生成 CSS 文件。和 选项设置目标视口的尺寸。还有很多其他选项,如小化内联CSS,你可以在关键的npm包的文档找到。优化网页的标记将类似于咕咕插件的输出。truewidthheight

可供您使用的另一个 npm 模块是关键 css模块。此模块从提供的 URL 生成关键 CSS。生成的CSS可以使用回调函数进一步处理,因为咕咕插件基于此包。

使用Gulp

如果您更乐于使用 Gulp,Addy Osmani 建议 Gulp 用户直接使用关键 npm 模块。他在"关键GitHub"页面上为Gulp 用户提供的示例如下所示:

var critical = require('critical').stream;// Generate & Inline Critical-path CSS
gulp.task('critical', function () {return gulp.src('dist/*.html').pipe(critical({base: 'dist/', inline: true, css: ['dist/styles/components.css','dist/styles/main.css']})).pipe(gulp.dest('dist'));
});

关键团队还有一个示例 Gulp 项目,显示了这一点。

还有一个吞咽临界 css 插件来生成关键 CSS。但是,这一个工作通过从您的CSS中提取某些选择器类型,而不是通过检测上面折叠的元素等。

更多资源

另一个可用的工具是乔纳斯·奥尔森的"关键路径CSS"生成器。您只需输入页面 URL,然后提供要从中提取关键 CSS 的所有 CSS。单击"创建关键路径 CSS"按钮后将输出您的 CSS。

关于CSS-Tricks的文章概述了如何使用CSS预处理器来编写关键折叠CSS。此外,SitePoint 还发表了一篇关于优化关键呈现路径的优秀文章,您可以阅读该文章,以便更深入地了解该主题。

结论

您是否应该内联关键CSS取决于用户的访问模式和网站的结构。如果您的网站是一个寻呼机,并且访问者不会经常访问它,或者如果您有一个包含框架和插件的复杂网站,则内联关键 CSS 可以显著提高性能。

内联的唯一关注是,它每次访问都会增加额外的页面权重。这可以通过使用 Cookie 和仅在第一次访问期间发送关键 CSS 来缓解,同时仍以异步方式加载完整的 CSS 文件,然后进行缓存。这是有点复杂,但你得到两个最好的两个。

您是否尝试过在您自己的项目中内联 CSS?改进显著吗?你给其他开发者提什么建议吗?让我们知道在评论。

CSS性能优化:可以试一试内联CSS?相关推荐

  1. 前端性能优化-CSS性能优化

    文章目录 一.内联首屏关键CSS 二.异步加载CSS 异步加载的几种方式 1.js动态创建样式表link元素,并插入到DOM中. 2.设置media属性 3.设置rel属性 4. rel=" ...

  2. 提高C++性能的编程技术笔记:内联+测试代码

    内联类似于宏,在调用方法内部展开被调用方法,以此来代替方法的调用.一般来说表达内联意图的方式有两种:一种是在定义方法时添加内联保留字的前缀:另一种是在类的头部声明中定义方法. 虽然内联方法的调用方式和 ...

  3. CSS性能优化的几个技巧

    前言 随着互联网发展至今,对于网站来说,性能显的越来越重要了,CSS作为页面渲染和内容展现的重要环节,影响着用户对整个网站的第一体验.所以,我们需要重视与CSS相关的性能优化. 项目开发初期我们可能因 ...

  4. [19/06/05-星期三] CSS基础_样式表的位置(内联、内部、外部样式)、块元素(div)、内联元素(span)、常用的选择器...

    一.概念 CSS(Cascading Style Sheets,层叠样式表) 可以用来为网页创建样式表,通过样式表可以对网页进行装饰. 所谓层叠,就是可以将整个网页想象成是一层一层的结构,层次高的将会 ...

  5. ajax使用html()后样式无效,jquery.ajax使用字符串拼接后内联css样式失效

    问题所在: 是这样的,我使用ajax调用了一串json数据,使用字符串拼接的方法动态插入div容器.结果css并没有对动态插入的内容加css样式. 代码描述: css使用的内联,在head部分, jq ...

  6. android html转pdf工具,android – 使用iText库将html转换为pdf时未应用hr的内联CSS

    我是.NET开发人员,因此代码在C#中.但是你应该能够轻松翻译以下内容. iText是一个PDF优先的库,[X] HTML解析非常复杂,因此在这方面并不完整.每当解析[X] HTML并且事情不按预期的 ...

  7. css内联样式_如何覆盖内联CSS样式

    css内联样式 本文写于2009年,至今仍是我们最受欢迎的帖子之一. 如果您想了解有关CSS的更多信息,您可能会发现这篇有关CSS技术的文章对视网膜显示非常感兴趣. CSS的最强大功能之一就是层叠. ...

  8. css语法,常用css语法,内部样式表,外部样式表,内联样式表, 样式优先级问题

    1.css语法: 2.css常用属性: 3.内部样式表: 在head标签中书写style标签,然后在style标签中书写css,style标签具有type属性,属性值为"text/css&q ...

  9. react里面 内联css样式怎么样_React.js内联样式最佳做法

    小编典典 目前还没有很多"最佳实践".我们中那些使用内联样式作为React组件的人仍在进行大量试验. 全部还是全部? 我们所称的"样式"实际上包括许多概念: 布 ...

最新文章

  1. 读书:历史 -- 东印度公司
  2. 图解|深入理解Linux高性能网络架构的那些事
  3. Android Hook ActivityThread mH 消息
  4. 开发中总结的dart相关的技巧
  5. Dynamics CRMのアップデートインポートツール移植的准备步骤与有用的网页
  6. 美链BEC合约漏洞技术分析 1
  7. 视界云:CDN{内容分发网络} 知识详解
  8. jq动态渲染后获取不到元素高度_浏览器的渲染机制
  9. Linux 管理员技术
  10. C#设计模式:迭代器模式(Iterator Pattern)
  11. 左栏固定,右栏自适应
  12. .net的XML对象序列化VS WCF中xml序列化问题
  13. 华为企业网络常用图标大全(附PPT下载)
  14. 内存碎片产生原因及终极解决办法
  15. 微信无法直接打开淘宝链接是怎么回事?
  16. 消息队列——RabbitMQ消息队列集群
  17. jquery form自动绑定表单内容
  18. win7怎么打开注册表
  19. opera 浏览器头 不是opera 打头
  20. JavaScript从入门到放弃到精通

热门文章

  1. 值类型和引用类型的区别,应该很全的。
  2. 一个封装比较完整的FTP类——clsFTP
  3. AMQP 和 RabbitMQ 入门
  4. 如何用 javascript 做一个高逼格的进度条
  5. 8 个 jQuery 的 PDF 浏览插件
  6. Ubuntu输入密码登陆后又跳回到登录界面
  7. Flex组件的行为和动画效果(实例)
  8. 【AI视野·今日CV 计算机视觉论文速览 第237期】Thu, 30 Sep 2021
  9. MXNet.gluon——图像I/O
  10. 设计模式——单例模式详解