整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

好程序员web前端学习路线之异步加载CSS的一些方法

好程序员web前端学习路线之异步加载CSS的一些方法

好程序员web前端教程分享异步加载CSS的一些方法,在我们写页面的时候,我们做最主要的任务就是提高页面的性能和弹性加载速度,以不会延迟页面的呈现的形式来加载CSS。这是因为在默认情况下。

- 浏览器会同步加载外部的CSS

- 在下载和解析CSS时会影响所有页面呈现

这两种情况都会导致潜在的延迟。

当然,这也是在开始渲染页面之前,应该至少加载网站的CSS的一部分,并且为了立即将该初始CSS添加到浏览器,我们建议内联css。对于整体数量较少的网站,仅此一项就足够了,但如果CSS很大(例如,大于15到20kb),它可以帮助性能按优先级将其拆分。拆分后,应该在后台-aka中加载不太关键的CSS异步。在这篇文章中,我的目的是描述我在这些日子的首选方式,这实际上已存在很长的时间段了。

有几种方法可以异步加载CSS,但没有一种方法可以像您期望的那样直观。与script元素不同,没有async或defer属性可以简单地应用于link元素,因此多年来我们维护了loadCSS项目,使得加载异步CSS的过程更加容易。最近,浏览器已经标准化了它们的CSS加载行为,因此可能不再需要像loadCSS这样的专用脚本来处理它们的微小差异

今天,我们掌握了浏览器如何处理各种link元素属性的一些知识,我们可以通过一小段HTML来实现异步加载CSS的效果。在这里,它是异步加载样式表的最简单方法:

<link rel="stylesheet" href="/styles/index.css" media="print" onload="this.media='all'">

这行HTML简洁,但它不是很直观,所以让我们分解这里发生的事情。

首先,将link's media属性设置为print。“打印”是一种媒体type,它说“应用此样式表的基于打印的媒体的规则”,换句话说,当用户尝试打印页面时应用它们。不可否认,我们希望我们的样式表适用于所有媒体(尤其是屏幕)而不仅仅是打印,但通过声明与当前环境不匹配的媒体类型,我们可以实现一个有趣且有用的效果:浏览器将加载样式表没有延迟页面渲染,异步!这很有帮助,但并不是我们想要的全部。我们还希望CSS在加载后实际应用于屏幕环境。为此,我们可以使用该onload属性将link媒体设置为all完成加载。

介绍完了老方子,我们再来看看新药方,是的,同样的!在过去一两年中,我们一直在使用link[rel=preload](而不是rel=stylesheet)来实现与上面类似的模式(分别rel在加载后切换属性而不是media属性)。使用这种方法仍然可以正常工作,但是,使用时需要考虑几个缺点preload。首先,浏览器对于加载的支持依旧不是特别的好因此如果你想依赖它来跨浏览器获取和应用样式表,那么填充(例如一个loadCSS)是必要的。更主要的是,preload尽可能早地获取文件,优先级最高,可能会优先考虑其他重要下载,并且可能比非关键CSS实际需要的优先级更高。

幸运的是,如果你碰巧想要提供的高优先级提取rel=preload(在支持它的浏览器中),你可以将它与上面的模式结合起来。

<linkrel="preload"href="styles/index.css"as="style"onload="this.rel='stylesheet'">

这和之前的方法没什么区别啊!是的确实如此,但是呢,语法上更加好一些。另外就是你仔细点就会发现 as="style"这个属性,所以 preload 不仅仅可以用在 CSS 文件上,而是可以用在绝大多数的资源文件上。

<linkrel="preload"href="styles/index.css"as="script">

我们可以新建一个script标签来指向它:

var script=document.createElement("script");

script.src="scriptfile.js";

document.body.appendChild(script);

在这个时候浏览器就直接从缓存中拿这个文件了,不会再发请求了,因为此前已经加载好了。

那么 preload 中的 as 属性支持哪些资源文件呢?下面这些都可以

· font

· image

· object

· script

· style

不要想太多,只有谷歌太对它做出完美的支持。

也可以用JavaScript来实现:

$(window).load(function () {

//异步延迟加载样式

var link=$('<link />');

link.attr('href', '/styles/index.css');

link.attr('rel', 'stylesheet');

link.appendTo($('head'));

link.load(function () {

console.info('加载成功...');

});

本内容伪原创文章,转载请注明出处。

C#中,你可以使用System.Net.Http.HttpClient来从网页获取HTML内容,然后使用System.Text.RegularExpressions.Regex来解析和提取HTML中的<title>标签内容。以下是一个简单的示例,演示了如何执行此操作:

csharpusing System;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

class Program
{
    static readonly HttpClient client=new HttpClient();

    static async Task Main(string[] args)
    {
        try
        {
            // 要抓取内容的网页URL
            string url="http://example.com";
            
            // 发送HTTP GET请求获取网页内容
            string htmlContent=await client.GetStringAsync(url);

            // 正则表达式,用于匹配<title>标签内的内容
            string titlePattern=@"<title>(.+?)</title>";

            // 使用Regex.Match方法查找匹配项
            Match match=Regex.Match(htmlContent, titlePattern);

            // 如果找到了匹配项
            if (match.Success)
            {
                // 提取<title>标签内的内容
                string title=match.Groups[1].Value;

                // 输出提取到的title
                Console.WriteLine("网页标题: " + title);
            }
            else
            {
                Console.WriteLine("未找到<title>标签。");
            }
        }
        catch (HttpRequestException e)
        {
            Console.WriteLine("\nException Caught!");
            Console.WriteLine("Message :{0} ", e.Message);
        }
    }
}

在这个示例中,我们首先创建了一个HttpClient实例,然后使用GetStringAsync方法异步获取网页的HTML内容。接下来,我们定义了一个正则表达式titlePattern,用于匹配<title>标签中的文本。Regex.Match方法用于在HTML内容中查找匹配项。如果找到匹配项,我们就从匹配结果中提取出标题文本并打印出来。

请注意,使用正则表达式解析HTML可能不是最可靠的方法,因为HTML的结构可能会非常复杂,并且正则表达式可能无法正确处理所有情况。在实际应用中,建议使用HTML解析库(如AngleSharp或HtmlAgilityPack)来解析HTML文档,这样可以更健壮和准确地提取所需的信息。

下面是一个使用HtmlAgilityPack库提取网页标题的示例:

csharpusing System;
using System.Net.Http;
using HtmlAgilityPack;
using System.Threading.Tasks;

class Program
{
    static readonly HttpClient client=new HttpClient();

    static async Task Main(string[] args)
    {
        try
        {
            // 要抓取内容的网页URL
            string url="http://example.com";
            
            // 发送HTTP GET请求获取网页内容
            string htmlContent=await client.GetStringAsync(url);

            // 加载HTML内容到HtmlDocument对象
            HtmlDocument doc=new HtmlDocument();
            doc.LoadHtml(htmlContent);

            // 使用XPath查询找到<title>元素并获取其InnerText
            var titleNode=doc.DocumentNode.SelectSingleNode("//title");
            if (titleNode !=null)
            {
                string title=titleNode.InnerText;
                Console.WriteLine("网页标题: " + title);
            }
            else
            {
                Console.WriteLine("未找到<title>标签。");
            }
        }
        catch (HttpRequestException e)
        {
            Console.WriteLine("\nException Caught!");
            Console.WriteLine("Message :{0} ", e.Message);
        }
    }
}

在这个示例中,我们使用了HtmlAgilityPack库来加载HTML内容,并使用XPath查询来定位<title>标签。这种方法通常比使用正则表达式更加稳定和可靠。在使用HtmlAgilityPack之前,你需要通过NuGet安装它:

bashInstall-Package HtmlAgilityPack

或者,如果你使用.NET Core CLI,可以运行:

一天,老板不满地说:“喂,你这C#爬虫怎么连标题都没给我抓回来?我需要的是一份完整的报告,包括所有网页的标题,赶紧给我重新抓一遍!”那一刻,我仿佛看到了老板眼中闪烁的怒火,感受到了他对我工作的失望。

我仿佛看到了老板眼中闪烁的怒火,就像是火山即将爆发前的预兆。我心里咯噔一下,知道这次可能玩大了。

我赶紧赔着笑脸说:“老板,真不好意思,这次是我的失误。我马上就去给您抓回那些‘逃跑’的标题!”

其实我心里暗笑,因为那些标题我早就抓回来了,只是故意没展示出来。这可是职场生存法则啊,不能一次交出所有秘密,得留点悬念,让老板对你始终保持期待和好奇。你觉得这样做对吗?欢迎讨论,哈哈!

代码其实很简单:

// 使用XPath查询获取title标签
HtmlNode titleNode=doc.DocumentNode.SelectSingleNode("//title");
//这行代码是使用C#的HtmlAgilityPack库来从HTML文档中提取<title>标签的内容。
//目的是从doc表示的HTML文档中选择第一个<title>标签,并将这个标签的节点对象赋值给titleNode变量。
如果要获取<title>标签中的文本内容,这样写:
string titleText=titleNode?.InnerText;
这里,?.是一个null条件运算符,如果titleNode为null(也就是说没有找到<title>标签),
则titleText会被赋值为null,否则,它会被赋值为<title>标签中的文本内容。

这个代码是怎么使用的呢?下面我解释下实现过程:

        static string? ParseTitleData(string htmlContent)
        {
            if (string.IsNullOrEmpty(htmlContent))
            {
                return null;
            }
            HtmlDocument doc=new HtmlDocument();
            doc.LoadHtml(htmlContent);
            // 使用XPath查询获取title标签
            HtmlNode titleNode=doc.DocumentNode.SelectSingleNode("//title");
            if (titleNode !=null)
            {
                // 获取title节点的文本内容
                string titleText=titleNode.InnerText.Trim();
                return "页面标题: " + titleText;
            }
            else
            {
                // 如果没有找到title标签,返回null
                return null;
            }
        }
//这段代码定义了一个名为 ParseTitleData 的静态方法,
//它接受一个 htmlContent 字符串作为输入,并试图从中解析出网页的标题。
//该方法使用 HtmlAgilityPack 库来解析 HTML 内容。

是不是很简单?这个方法的目的是从给定的 HTML 内容中提取网页的标题。如果成功找到标题,它会返回一个包含 "页面标题: " 和实际标题的字符串。如果 HTML 内容为空、null 或不包含 <title> 标签,它会返回 null。

看效果:


完整代码是包括如何异步获取网页内容的。如果有朋友需要的话,请关注我并留言,今天就写到这吧,太晚了,休息啦!