分类: 学习

  • 如何通过预加载 (Preload) 关键资源以提高网站加载速度

    如何通过预加载 (Preload) 关键资源以提高网站加载速度

    预加载允许您指定在页面加载期间立即或很快需要的资源(例如字体、图像、JavaScript 和 CSS)。 在您网站的每个页面的<head>…</head>部分顶部添加一个link rel='preload'标签。

    比如:

    <link rel=‘preload’ href=‘font.woff2’ as=‘font’ type=‘font/woff2’ crossorigin>
    <link rel=’preload’ href=’font.woff2′ as=’font’ type=’font/woff2′ crossorigin>
    <link rel='preload' href='font.woff2' as='font' type='font/woff2' crossorigin>

    打开网页时,浏览器会从服务器请求HTML文档,解析其内容,并为引用资源提交单独请求。作为开发人员,您知道页面需要的所有资源以及哪些资源最为重要。您可以使用这些知识提前请求关键资源,加快加载的过程。本文介绍了如何使用 <link> 来达成此目的。

    预加载的工作原理

    预加载最适合用于浏览器通常较晚发现的资源。

    预加载后期资源

    在本例中,Pacifico字体是在样式表通过 @font-face 规则定义的。浏览器只有在完成下载和解析样式表后才会加载字体文件。

    通过预加载某个资源,您希望浏览器可以比正常发现它更早地获取该资源,因为您认为它对当前页面很重要。

    预加载某个资源

    在本例中,已预加载了Pacifico字体,所以下载会与样式表并行进行。

    关键请求链代表着浏览器优先处理和获取的资源顺序。 Lighthouse会将位于该链第三层的资产识别为后期发现的资产。您可以使用预加载关键请求审计来确定要预加载的资源。

    预加载关键请求

    您可以通过在HTML文档的头部添加带有 rel="preload" 的 <link> 标记来预加载资源:

    <link as=“script” href=“critical.js”>
    <link as=”script” href=”critical.js”>
    <link as="script" href="critical.js">

    浏览器会缓存预加载的资源,以便在需要时立即可用。(它不会执行脚本或应用样式表。)

    在实施预加载后,包括Shopify、Financial Times和Treebo在内的许多网站在以用户为中心的指标(例如Time to InteractiveFirst Contentful Paint)等方面,都实现了1秒的改进。

    浏览器会根据情况执行诸如 preconnect 和 prefetch 等资源提示。而另一方面,preload 对浏览器来说是强制性的。现代浏览器已经非常擅长对资源进行优先级排序,这就是为什么谨慎使用 preload 并且只预加载最关键的资源那么重要。

    load 事件后大约3秒会触发Chrome中的控制台警告。

    谨慎使用 preload

    所有现代浏览器均支持 preload

    有助于修复以下两种类型的警告:

    1.预加载密钥请求

    预加载关键请求是Web字体的常见警告。Font Awesome是您可能会看到的一种非常常见的字体。

    预加载关键请求

    预加载关键请求

    2.渲染阻塞资源

    通过预加载,您还可以修复渲染阻塞资源警告,因为资产以非阻塞方式加载。

    消除渲染阻塞资源

    消除渲染阻塞资源

    如果您正在预加载图像,它还可以帮助降低最大内容绘制 (LCP) 时间。

    可预加载资源

    有许多不同的资源可以预加载。

    公共资源

    • font: 字体文件。
    • script: JavaScript文件。
    • style: CSS样式表。
    • image: 图像文件 ( .jpg.png.webp)。

    其他资源

    • audio: 音频文件
    • document: 旨在由 <frame><iframe>嵌入的HTML文档。
    • embed:要嵌入到 <embed> 元素中的资源。
    • fetch:要通过fetch或XHR请求访问的资源,例如ArrayBuffer或JSON文件。
    • object:要嵌入到 <object> 元素中的资源。
    • track: WebVTT文件。
    • worker:一个JavaScript网络worker或共享worker。
    • video: 视频文件。

    注意:在撰写本文时,Chrome存在一个未解决的bug,即预加载请求比其他更高优先级资源的获取速度更快。在解决此问题之前,请注意预加载的资源如何“跳过队列”并比应有的时间更早地被请求。

    预加载CSS中定义的资源

    在浏览器下载并解析CSS文件之前,不会发现这些文件中使用 @font-face 规则定义的字体或背景图像。预加载这些资源可确保在下载CSS文件之前获取它们。

    预加载CSS文件

    如果您使用了关键CSS方法,那么CSS将分成两部分。渲染首屏内容所需的关键CSS内联在文档的 <head> 中,非关键CSS通常使用JavaScript延迟加载。在加载非关键CSS之前等待JavaScript执行会导致用户滚动时呈现延迟,因此最好使用 <link> 更快地启动下载。

    预加载JavaScript文件

    由于浏览器不执行预加载的文件,因此预加载有助于将获取与执行分开,这可以改善Time to Interactive等指标。如果您拆分JavaScript包并仅预加载关键块,则预加载效果最佳。

    如何实现rel=preload

    实现 preload 最简单的方法是在文档的 <head> 中添加一个<link> 标记:

    <head> <link as=“script” href=“critical.js”></head>
    <head> <link as=”script” href=”critical.js”></head>
    <head>  <link as="script" href="critical.js"></head>

    提供 as 属性可帮助浏览器根据其类型来设置预获取资源的优先级,设置正确的标头,以及确定资源是否已存在于缓存中。此属性可接受的值包括: script 、style 、font 和 image 等等

    请查看Chrome Resource Priorities and Scheduling文档,详细了解浏览器如何确定不同类型资源的优先级。

    注意:省略 as 属性或使用了无效值,就相当于XHR请求,这时浏览器不知道它获取的内容,因此无法确定正确的优先级。它还可能导致某些资源(例如脚本)被获取两次。

    某些类型的资源,例如字体,以匿名模式加载。对于这些资源,您必须设置 preload 的 crossorigin 属性:

    <link href="ComicSans.woff2" as="font" type="font/woff2" crossorigin>

    注意:没有设置 crossorigin 属性的预加载的字体将被获取两次!

    另外,<link> 元素还接受 type 属性,它包含链接资源的MIME类型。浏览器使用 type 属性的值来确保资源仅在其文件类型受支持时才被预加载。如果浏览器不支持指定的资源类型,它将忽略 <link> 。

    请尝试通过预加载web字体提高网页性能

    您可以通过 Link HTTP标头预加载任何类型的资源:

    Link: </css/style.css>;; as=“style”
    Link: </css/style.css>;; as=”style”
    Link: </css/style.css>;; as="style"

    在HTTP标头中指定 preload 的一个好处是,浏览器不需要解析文档来发现它,这在某些情况下可以提供一些小幅改进。

    使用webpack预加载JavaScript模块

    如果您使用了创建应用程序构建文件的模块打包器,则需要检查它是否支持预加载标签的注入。在webpack 4.6.0或更高版本中,它通过在 import()中使用magic comments(魔法注释)支持预加载:

    import(_/* webpackPreload: true */_ “CriticalChunk”)
    import(_/* webpackPreload: true */_ “CriticalChunk”)
    import(_/* webpackPreload: true */_ "CriticalChunk")

    如果您使用的是旧版webpack,请使用第三方插件,例如preload-webpack-plugin

    预加载时要记住的事项

    • 不要预加载每个脚本,否则它实际上会导致性能问题,例如增加总阻塞时间 (TBT)。预加载应该只用于立即需要的资源,因此它们以非阻塞方式加载。这通常用于网络字体、图像、CSS和JS。
    • 如果您正在使用缓存清除技术(例如查询字符串domain.com/style.css?ver=1.0),请不要忘记浏览器会看到确切的URL。因此,您将需要使用查询字符串URL,或者您可以使用句柄动态预加载。
    • 如果您有一个CDN重写您的资产的URL,请确保您要预加载的所有资源首先被正确地重写。如果URL不匹配,您最终可能会加载资源两次。
    • 如果您预加载样式表 (CSS) 或脚本 (JS),并且您正在使用插件来组合您的CSS/JSS(AutoptimizeWP Rocket等),请确保从连接过程中排除您预加载的资源。否则,它可能会被打包两次并最终在您的网站上放置更多代码。

    小结

    为提高网页速度,请预加载浏览器来发现较晚的重要资源。预加载全部资源会适得其反,因此请谨慎使用 preload,并衡量它在现实中的影响。

    via https://web.dev

  • 深入了解预加载关键图像技术

    深入了解预加载关键图像技术

    预加载主要图片(首屏图片)有助于减少Core Web Vitals中的最大内容绘制(LCP) 时间。这些通常是图像,如徽标、博客文章上的特色图像、登录页面上的Hero图像等。通过预加载它们,您将它们移动到瀑布的顶部,并基本上告诉浏览器这些具有优先级并且应该立即加载。

    最大的内容绘制时间

    最大的内容绘制时间

    重要的是要了解Chrome有两个图像预加载的限制,它们将出现在瀑布的最顶部。在这两个图像之后的任何内容仍然会在瀑布中显示得更高,但不会被视为高优先级,这完全取决于Chrome。我们通常建议预加载2-3个图像。这通常会预加载您的徽标并在博客文章中显示特色图片。

    如果您在页面上有手动图像预加载,这将优先于自动预加载之一。

    预加载关键图像功能还将自动从延迟加载中排除这些图像。

    从Chrome 73开始,链接 和响应式图像可以结合起来,以便更快地加载图像。

    预加载概述

    Preload让您可以在HTML中发现关键资源之前尽快告诉浏览器您想要加载的关键资源。这对于不容易发现的资源特别有用,例如样式表中包含的字体、背景图像或从脚本加载的资源。

    <link as=“image” href=“important.png”>
    <link as=”image” href=”important.png”>
    <link as="image" href="important.png">

    响应式图像 + 预加载 = 更快的图像加载

    响应式图像和预加载在过去几年中一直可用,但同时缺少一些东西:无法预加载响应式图像。从Chrome 73开始,浏览器可以在发现标签img之前预加载srcset指定的响应图像的正确变体!

    根据您网站的结构,这可能意味着图像显示速度显着加快!我们在一个使用JavaScript延迟加载响应式图像的网站上进行了测试。预加载导致图像加载速度提高了1.2秒。

    所有现代浏览器都支持响应式图像,而仅在基于Chromium的浏览器中支持预加载它们。

    imagesrcsetimagesizes

    为了预加载响应式图像,最近向<link>元素添加了新属性:imagesrcsetimagesizes. 它们与 <link rel="preload">一起使用,并与 <img>元素中使用的srcsetsizes语法相匹配。

    例如,如果您想预加载指定的响应式图像:

    <img src=“wolf.jpg” alt=“A rad wolf”>
    <img src=”wolf.jpg” alt=”A rad wolf”>
    <img src="wolf.jpg" alt="A rad wolf">

    您可以通过将以下内容添加到您的HTML的<head>来做到这一点:

    <link as=“image” href=“wolf.jpg” imagesrcset=“wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w” imagesizes=“50vw”>
    <link as=”image” href=”wolf.jpg” imagesrcset=”wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w” imagesizes=”50vw”>
    <link as="image" href="wolf.jpg" imagesrcset="wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w" imagesizes="50vw">

    这将使用srcsetsizes将应用的相同资源选择逻辑启动请求。

    用例

    预加载动态注入的响应图像

    假设您正在动态加载主图像作为幻灯片的一部分,并且知道将首先显示哪个图像。在这种情况下,您可能希望避免在加载相关图像之前等待脚本,因为这会延迟用户看到它的时间。

    您可以在具有动态加载的图片库的网站上检查此问题:

    1. 在新选项卡中打开此示例网站
    2. 按 `Control+Shift+J`(或 Mac 上的 `Command+Option+J`)打开DevTools。
    3. 单击网络选项卡。
    4. Throttling下拉列表中,选择Fast 3G
    5. 禁用禁用缓存复选框。
    6. 重新加载页面。

    Chrome开发者工具-network

    此瀑布显示图像仅在浏览器完成运行脚本后才开始加载,从而对最初向用户显示图像的时间引入了不必要的延迟。

    在此处使用preload帮助是因为图像会提前开始加载,并且在浏览器需要显示它时可能已经存在。

    使用reload预加载图像

    此瀑布显示第一张图片与脚本同时开始加载,避免了不必要的延迟并加快了图片的显示速度。

    要查看预加载的不同之处,您可以按照第一个示例中的步骤检查相同的动态加载的图像库,但预加载了第一张图像

    避免该问题的另一种方法是使用基于标记的轮播并让浏览器的预加载器获取所需的资源。然而,这种方法可能并不总是实用的。(例如,如果您正在重用现有的组件,它不是基于标记的。)

    使用图像集预加载背景图像

    如果对于不同的屏幕密度有不同的背景图像,则可以在CSS中使用image-set语法指定它们。然后浏览器可以根据屏幕的DPR选择显示哪一个。

    background-image: image-set( “cat.png” 1x, “cat-2x.png” 2x);
    background-image: image-set( “cat.png” 1x, “cat-2x.png” 2x);
    background-image: image-set( "cat.png" 1x, "cat-2x.png" 2x);

    上述语法忽略了在基于Chromium和WebKit的浏览器中此功能需要供应商前缀这一事实。如果您打算使用此功能,则应考虑使用Autoprefixer作为在线工具提供)来自动解决该问题。

    CSS背景图片的问题在于,它们只有在浏览器下载并处理了页面<head>中的所有CSS之后才会被浏览器发现,这可能是很多CSS……

    您可以在具有响应式背景图像的示例网站上检查此问题。

    响应式背景图像加载

    在此示例中,直到 CSS 完全下载后才开始图像下载,从而导致图像显示出现不必要的延迟。

    响应式图像预加载提供了一种简单且无需破解的方式来更快地加载这些图像。

    <link rel=preload href=cat.png as=image imagesrcset=“cat.png 1x, cat-2x.png 2x”>
    <link rel=preload href=cat.png as=image imagesrcset=”cat.png 1x, cat-2x.png 2x”>
    <link rel=preload href=cat.png as=image imagesrcset="cat.png 1x, cat-2x.png 2x">

    您可以检查前面的示例如何处理预加载的响应式背景图像

    预加载的响应式背景图像

    在这里,图像和CSS同时开始下载,避免了延迟,从而加快了图像的加载速度。

    预加载响应式图像

    理论上,预加载响应式图像可以加快速度,但实际上它有什么作用呢?

    为了回答这个问题,我们来看看创建了一个演示PWA商店的两个副本:一个不预加载图像另一个预加载其中的一些。由于该站点使用JavaScript延迟加载图像,因此可能会从预加载将在初始视口中的图像受益。

    这给了我以下关于no preloadimage preload的结果。查看原始数据,我们看到Start Render保持不变,速度指数略有提高(273 毫秒,因为图像到达速度更快,但不占用大量像素区域),但捕捉差异的真实指标是最后绘制的Hero指标,提高了1.2 秒。

    当然,没有什么比幻灯片比较更能捕捉视觉差异了:

    预加载与无预加载页面渲染对比

    幻灯片显示,图像在预加载时的到达速度明显更快,从而极大地改善了用户体验。

    预加载和<picture>

    如果您熟悉响应式图像,您可能想知道“怎么<picture>办?”。

    Web性能工作组正在讨论为srcsetand添加一个等效的预加载sizes,但不是为处理 “art direction” 用例的<picture>元素。

    为什么这个用例被“忽视”?

    尽管也有兴趣解决该用例,但仍有许多技术问题需要解决,这意味着这里的解决方案将具有很大的复杂性。最重要的是,在大多数情况下,用例似乎可以在今天得到解决,即使是以一种hacky的方式(见下文)。

    鉴于此,Web Performance WG决定srcset先发布,看看是否需要同等picture支持。

    如果您确实发现自己可以预加载<picture>,则可以使用以下技术作为解决方法。

    鉴于以下情况:

    <picture>
    <source srcset=“small_cat.jpg” media=“(max-width: 400px)”>
    <source srcset=“medium_cat.jpg” media=“(max-width: 800px)”>
    <img src=“large_cat.jpg”>
    </picture>
    <picture>
    <source srcset=”small_cat.jpg” media=”(max-width: 400px)”>
    <source srcset=”medium_cat.jpg” media=”(max-width: 800px)”>
    <img src=”large_cat.jpg”>
    </picture>
    <picture>
        <source srcset="small_cat.jpg" media="(max-width: 400px)">
        <source srcset="medium_cat.jpg" media="(max-width: 800px)">
        <img src="large_cat.jpg">
    </picture>

    <picture>元素的逻辑(或者确切地说是图像源选择逻辑)是按顺序检查<source>元素的media属性,找到第一个匹配的,然后使用附加的资源。

    因为响应式预加载没有“顺序”或“第一次匹配”的概念,所以需要将断点转换为以下内容:

    <link rel=“preload” href=“small_cat.jpg” as=“image” media=“(max-width: 400px)”>
    <link rel=“preload” href=“medium_cat.jpg” as=“image” media=“(min-width: 400.1px) and (max-width: 800px)”>
    <link rel=“preload” href=“large_cat.jpg” as=“image” media=“(min-width: 800.1px)”>
    <link rel=”preload” href=”small_cat.jpg” as=”image” media=”(max-width: 400px)”>
    <link rel=”preload” href=”medium_cat.jpg” as=”image” media=”(min-width: 400.1px) and (max-width: 800px)”>
    <link rel=”preload” href=”large_cat.jpg” as=”image” media=”(min-width: 800.1px)”>
    <link rel="preload" href="small_cat.jpg" as="image" media="(max-width: 400px)">
    <link rel="preload" href="medium_cat.jpg" as="image" media="(min-width: 400.1px) and (max-width: 800px)">
    <link rel="preload" href="large_cat.jpg" as="image" media="(min-width: 800.1px)">

    小结

    响应式图像预加载为我们提供了新的和令人兴奋的可能性,以以前只能使用hack的方式预加载响应式图像。它是对速度敏感的开发人员工具箱的重要新增功能,使我们能够确保我们希望尽快呈现在用户面前的重要图像在我们需要时会出现。

  • 巧用Instant Page提升页面加载速度

    巧用Instant Page提升页面加载速度插图

    Instant.page是一个免费的开源库,它使用即时预加载,这意味着它会在用户点击页面之前预加载页面。仅当用户很有可能访问页面时才会预加载页面,并且仅预加载HTML,尊重您的用户和服务器的带宽和CPU。它使用被动事件侦听器,以便您的页面保持流畅,并且在用户启用数据保护程序时不会预加载。

    即时页面功能可让您在用户将鼠标悬停在链接上后在后台自动预取URL。这导致几乎瞬时的加载时间,并改善了用户体验和感知性能(网站感觉有多快)。我们利用Alexandre Dieulot开发的Instant.page库。

    <link href=“https://domain.com/post”>
    <link href=”https://domain.com/post”>
    <link href="https://domain.com/post">

    预取的工作原理

    就服务器和移动设备的性能提升和低利用率而言,以上是最佳组合。该功能尊重您的移动设备(AndroidiPhone)是否启用了数据保护程序或低数据模式。如果打开,则不会预加载任何内容。

    由于此功能适用于鼠标悬停,因此不会显示在速度测试工具上。但我们鼓励您在启用后点击您的网站。你应该能感觉到不同!

    亚马逊和其他公司发现,消除100毫秒的延迟可以提高1%的销售额。但是网络上的延迟很难克服。

    Instant.page使用即时预加载——它在用户点击页面之前预加载页面。

    (1)桌面端

    在用户点击链接之前,他们将鼠标悬停在该链接上。当用户悬停65毫秒时,有二分之一的机会点击该链接,因此instant.page此时开始预加载,页面预加载平均超过300毫秒

    另一种选择是在用户开始按下鼠标而不预加载时加载页面。这使得未使用的请求为零,同时仍将页面加载平均提高了80毫秒

    您还可以在悬停时或在链接可见时立即预加载,并在用户开始按下鼠标时触发点击,从而使您的页面成为世界上最快的页面。

    (2)移动端

    用户在释放之前开始触摸他们的显示器,平均留出90毫秒让页面预加载

    另一种选择是在链接可见时立即预加载链接。

    欺骗大脑

    人脑将不到100毫秒的动作视为瞬间。因此,instant.page让您的页面即使在3G上也感觉即时(假设您的页面渲染速度很快)。

    轻松使用您的服务器和用户的数据计划

    仅当用户很有可能访问页面时才会预加载页面,并且仅预加载HTML ,尊重您的用户和服务器的带宽和CPU。

    它使用被动事件侦听器和requestIdleCallback以使您的页面保持流畅。它尊重数据保护模式。它是1kB并在其他所有内容之后加载。它是免费和开源的(MIT许可证)。

    具有数据属性的附加选项

    您可以使用以下data-instant属性启用即时页面的其他选项。只需将这些属性中的任何一个添加到文档中的<body>标记,剩下的就交给我们了。

    您可以在instant.page了解更多关于这些不同属性的作用。有关将其中一些属性添加到<body>标记的一些方法,请参见下文。

    data-instant-allow-query-string
    data-instant-allow-external-links
    data-instant-whitelist
    data-instant-intensity=“mousedown”
    data-instant-intensity=“mousedown-only”
    data-instant-intensity=“150”
    data-instant-intensity=“viewport”
    data-instant-intensity=“viewport-all”
    data-instant-mousedown-shortcut
    data-instant-allow-query-string
    data-instant-allow-external-links
    data-instant-whitelist
    data-instant-intensity=”mousedown”
    data-instant-intensity=”mousedown-only”
    data-instant-intensity=”150″
    data-instant-intensity=”viewport”
    data-instant-intensity=”viewport-all”
    data-instant-mousedown-shortcut
    data-instant-allow-query-string
    data-instant-allow-external-links
    data-instant-whitelist
    data-instant-intensity="mousedown"
    data-instant-intensity="mousedown-only"
    data-instant-intensity="150"
    data-instant-intensity="viewport"
    data-instant-intensity="viewport-all"
    data-instant-mousedown-shortcut

    页面加载后添加JavaScript

    第一种方法是在页面加载结束时触发JavaScript。可以将以下代码添加到WPTurbo中的页脚代码框中。

    假设您想更改脚本在预加载前等待多长时间(以毫秒为单位)的数据强度时间。您可以像这样添加它:

    <script type=‘text/javascript’>
    document.body.setAttribute(‘data-instant-intensity’, ‘150’);
    </script>
    <script type=’text/javascript’>
    document.body.setAttribute(‘data-instant-intensity’, ‘150’);
    </script>
    <script type='text/javascript'>
    document.body.setAttribute('data-instant-intensity', '150');
    </script>

    一次只能使用一个data-instant-intensity属性,但您可以将其与其他属性混合搭配。因此,例如,这将起作用:

    <script type=‘text/javascript’>
    document.body.setAttribute(‘data-instant-intensity’, ‘150’);
    document.body.setAttribute(‘data-instant-allow-external-links’, ‘true’);
    </script>
    <script type=’text/javascript’>
    document.body.setAttribute(‘data-instant-intensity’, ‘150’);
    document.body.setAttribute(‘data-instant-allow-external-links’, ‘true’);
    </script>
    <script type='text/javascript'>
    document.body.setAttribute('data-instant-intensity', '150');
    document.body.setAttribute('data-instant-allow-external-links', 'true');
    </script>

    注意:上述方法会向您的站点添加一个额外的请求。

    与body标签合并

    第二种方法是在呈现页面时合并现有body标记中的属性。这不需要额外的请求。可以将以下代码添加到 WPTurbo 中的页脚代码框中。这是一个例子:

    <body
    data-instant-intensity=‘mousedown’
    data-instant-allow-external-links
    >
    </body>
    <body
    data-instant-intensity=’mousedown’
    data-instant-allow-external-links
    >
    </body>
    <body
    data-instant-intensity='mousedown'
    data-instant-allow-external-links
    >
    </body>

    预加载时间设置

    默认情况下,instant.page在悬停链接后以及移动用户开始触摸其显示屏时预加载65毫秒。还有其他选择。

    按下鼠标时预加载

    要在用户开始按下鼠标按钮时加载页面,在释放它之前,将其data-instant-intensity="mousedown"作为属性添加到<body>。

    页面预加载平均需要80毫秒。

    要在桌面上以这种方式使用而不是在移动设备上预加载,请使用data-instant-intensity="mousedown-only".

    调整悬停延迟

    对于一些具有大量点击目标的网站,例如一些电子商务网站,65毫秒规则不适用:它会为每个访问的页面预加载两次以上。

    要增加悬停延迟,请在属性中传递毫秒数,例如150ms: data-instant-intensity="150"

    或者,如果您不关心提出很多请求,则可以减少它。

    在链接可见后立即预加载链接

    在小型移动设备(例如智能手机)上,如果您希望您的页面在更多情况下是即时的,您可以在链接可见时立即预加载它们。

    为此,请将data-instant-intensity="viewport"其作为属性添加到<body>。

    "viewport-all"如果您不担心发出大量请求,您也可以使用 来在其他外形尺寸上执行此操作。

    请注意,如果用户使用2G或启用了数据保护程序,它将回退到使用默认选项。

    按下鼠标时触发点击

    如果您想更快地触发点击,请将data-instant-mousedown-shortcut其作为属性添加到<body>。请注意,这可能与现有脚本冲突。

    (此功能从v5.1开始是可选的,在5.0中默认启用,您需要使用data-instant-no-mousedown-shortcut它来禁用它。)

    未预加载的页面

    默认情况下,不会预加载URL中带有查询字符串(“?”)的页面,因为它们有时会触发操作(例如注销或删除某些内容)。

    使用查询字符串将页面列入白名单

    如果您想让所有带有查询字符串的页面都被预加载,data-instant-allow-query-string请在<body>中添加一个属性。

    如果您只想允许预加载带有查询字符串的选择链接,请为其添加一个data-instant属性:

    <a href=“articles?page=2” data-instant>Page 2</a>
    <a href=”articles?page=2″ data-instant>Page 2</a>
    <a href="articles?page=2" data-instant>Page 2</a>

    黑名单页面

    要手动将触发操作的链接列入黑名单,data-no-instant请为其添加属性:

    <a href=“logout?token=f2d2650ce6” data-no-instant>Log out</a>
    <a href=”logout?token=f2d2650ce6″ data-no-instant>Log out</a>
    <a href="logout?token=f2d2650ce6" data-no-instant>Log out</a>

    这主要在您使用时使用data-instant-allow-query-string,否则默认情况下带有查询字符串的链接已经被列入黑名单。

    默认情况下不预加载外部链接,以允许它们都data-instant-allow-external-links向<body>添加属性。

    要仅允许某些外部链接,data-instant请为其添加属性。

    仅预加载部分链接(白名单模式)

    如果您只想预加载特定链接,data-instant-whitelist请在<body>中添加a并通过向链接添加data-instant属性来标记要预加载的链接。

    内容拦截器

    出于可疑的原因,预取被某些内容拦截器(例如uBlock Origin)视为侵犯隐私。请务必在您的网站上禁用内容拦截器以查看正在发出的预加载请求。

    Firefox中的uBlock Origin完全禁用预取;如果您使用它,您需要暂时完全禁用扩展程序,而不仅仅是为您的站点关闭它。

    这只会影响使用EasyPrivacy列表的内容拦截器的用户。它适用于AdBlock;而uBlock Origin的用户是少数。如果您想让instant.page为您网站上具有隐私内容拦截器的用户工作,您可以自行托管该脚本

    技术细节

    使用 <link href=”url “> 完成预加载。

    源代码有200行可读。

    浏览器支持

    Instant.page是渐进式增强——对不支持它的浏览器没有影响。

    Chrome和基于Chromium的浏览器从61版(2017年9月发布)开始全面支持。

    Firefox支持<link>(从2006年开始!),但如果页面没有被缓存(这是一个开放的错误),它将重新下载页面。

    不兼容的浏览器

    Safari 13.0支持 <link> 但默认禁用。希望它将在2020年9月在Safari 14.0中启用。

    UC浏览器不支持模块,因为它基于Chromium 57。基于Chromium 69的支持模块的新版本于2018年10月宣布,但尚未发布。

    安全CDN

    Instant.page的脚本由Cloudflare Workers托管,因此没有服务器可以入侵。

    此外,它使用子资源完整性让现代浏览器验证文件未被篡改。它作为一个模块加载,因此大多数旧浏览器不会执行它。

    自托管

    也可以自己托管脚本。下载最新版本,然后在</body>之前添加一个模块脚本标签:

    <script src=“instantpage-5.1.1.js” type=“module” defer></script>
    <script src=”instantpage-5.1.1.js” type=”module” defer></script>
    <script src="instantpage-5.1.1.js" type="module" defer></script>

    你也可以通过npm安装它:

    npm i instant.page
    npm i instant.page
    npm i instant.page

    历史

    在hover和touchstart上预加载网页的想法来自我的一个旧库InstantClick,它于2014年1月推出,它使用Ajax和history.pushState而不是<link>,将网站转换为单一的页面应用。它使网站更加流畅,但需要额外的工作。

    不幸的是,InstantClick主要只是一个概念证明,因为它没有很好的文档。

    Google在2018年12月发布的quicklink会在链接显示后立即预加载带有<link>的链接,这清楚地表明我应该专注于构建一个“精简”、更易于使用的InstantClick版本,即Instant.page,于2019年2月推出。

    未来相关项目

    InstantClick提供了最流畅的体验,同时仍然不需要像框架一样多的工作(提供较少的结果),所以我正在考虑在2020年晚些时候再次开发它。它将重命名为“instant.page extra”。

  • WordPress上CDN加速能够极大地提升网站速度体验

    WordPress上CDN加速能够极大地提升网站速度体验

    网站速度方面的必备条件之一是内容交付网络 (CDN)。CDN减轻了您的Web服务器的负担,并加快了向所有站点访问者的内容交付。结果,从您的用户体验到搜索引擎潜力的一切都得到了改善!开始学习该主题的一个好方法是激活WordPress CDN。

    在本文中,我们将解释将CDN添加到WordPress网站的最简单方法。但在此之前,我们概述了CDN的基本定义为什么要使用CDN,以及一些额外的好处。我们还将分享一些速度测试,以便您更好地判断您希望在您的网站上看到多少性能提升。

    1. 什么是WordPress CDN?
    2. CDN的工作原理
    3. CDN的好处
    4. CDN速度测试:使用CDN与不使用CDN
    5. 您需要CDN吗?
    6. 流行的CDN提供商
    7. 如何在WordPress中安装 CDN

    什么是WordPress CDN?

    CDN是Content Delivery Network的缩写。这些是位于全球的服务器网络(也称为POP)。它们旨在托管和交付WordPress站点的静态(有时是动态)内容的副本,例如图像、CSS、JavaScript和视频流。

    CDN的工作原理

    首先,您不想让CDN与您的WordPress托管公司混淆。这些是完全不同的服务。CDN不是您的托管服务提供商的替代品,而是提高网站速度的另一种方式。虽然有可能您的网站托管速度非常快,但CDN可以让您的网站更快。

    CDN究竟是如何工作的?例如,当您托管网站时,您必须选择物理数据中心位置,例如美国中部、欧洲、南美或亚洲。假设您选择美国中部。

    这意味着您的网站实际上位于爱荷华州康瑟尔布拉夫斯的“主机服务器”上。当欧洲人访问您的网站时,加载时间比从德克萨斯州达拉斯访问的人要长。为什么?因为数据必须传播更远的距离。

    这就是所谓的延迟。延迟是指通过网络传输数据所涉及的时间和/或延迟。距离越远,延迟越大。

    这就是CDN发挥作用的地方。它通过从更靠近它们的服务器加载站点的内容来帮助减少延迟。这些CDN服务器有时称为POP(存在点)。

    CDN可减少延迟

    CDN可减少延迟,从而更快地向最终用户交付内容

    WordPress用户有时不愿意研究内容交付网络,因为它们听起来太复杂了。但是CDN的功能相对简单。以下是它们的工作方式,可以通过三个简单的步骤实现:

    第1步

    您注册一个带有免费CDN的托管服务提供商或选择一个单独的CDN提供商并订阅他们的服务。第三方CDN提供商通常会根据数据使用情况提供免费和高级计划。

    第2步

    您在您的网站上激活CDN。您可以为第三方CDN安装一个免费插件,如CDN EnablerWP Rocket来集成它。

    这些插件会自动将您的资产链接到CDN。您无需做任何工作即可将您的内容放到 CDN 上;这都是放手的!部署 CDN 比以前容易得多。

    第3步

    当人们访问您的网站时,它会从全球不同的服务器加载您的WordPress网站的内容。欧洲的访问者从欧洲的服务器接收您的网站内容,而美国的访问者从距离他们更近的美国服务器获得相同的内容。

    CDN如何实现这一目标?

    CDN通常使用两种技术将用户路由到正确的位置:IP Anycast + 地理位置路由。他们可以自动检测用户请求的来源并将请求路由到最近的服务器。

    但是,为您的WordPress主机选择战略服务器位置仍然至关重要。因为即使CDN有助于分发您的媒体和内容,当您的网站被加载时,仍然需要向托管服务提供商发出一个请求——除非您在代理服务器上使用整页缓存,我们稍后将对此进行介绍。

    CDN的好处

    以下是在您的WordPress网站上使用CDN的诸多好处。

    1. 性能提升

    性能提升是使用CDN的最大原因之一。已经反复证明,更快的加载网站与更高的转化率、更低的跳出率和更长的平均访问者持续时间相关——更不用说更好的用户体验了。

    您最后一次因为网站加载时间过长而在浏览器中点击返回是什么时候?这是网站所有者最不想发生的事情。但不要相信我们的话。以下是行业领导者关于网站性能重要性的一些统计数据:

    • 页面响应延迟1秒会导致转化率降低7%。(来源:Kissmetrics
    • BBC发现,网站加载后每多一秒钟就有10%的用户离开他们的网站。(来源:创意博客
    • 加载时间每延迟一秒,转化率就会降低多达20%。(来源:ThinkWithGoogle
    • 在将页面加载时间减少近40%后,Pinterest的注册量增加了15%。(来源:Pinterest Engineering on Medium

    以下是CDN可以帮助提高WordPress网站性能的几种方法。

    减少TTFB

    我们已经在上面提到,WordPress CDN可以通过缩短数据传输所需的物理距离来帮助减少延迟。但它也可以帮助您缩短第一个字节(TTFB) 的时间。

    这测量浏览器在从服务器接收到第一个数据字节之前等待的时间。获取该数据所需的时间越长,显示您的页面所需的时间就越长。

    CDN可以帮助减少TTFB

    CDN可以帮助减少TTFB

    一个常见的误解是TTFB是在DNS查找时间之后计算的。但是,原始网络中TTFB的计算总是包括网络延迟。这涉及一个3步过程,因此延迟和延迟可能会发生在两者之间的任何地方,从而增加您的总TTFB。

    高TTFB可能由多种原因引起,例如糟糕的代码或主机服务器上配置错误的缓存。但地理距离是一个问题。

    我们进行了两项测试,以显示使用和不使用Cloudflare的TTFB的差异。我们每个测试运行5次,然后取平均值。

    测试 1:没有CDN的 TTFB

    我们首先在禁用CDN的情况下运行了Pingdom测试。结果如下:

    • 总加载时间为1.45 s
    • 平均TTFB约为136毫秒

    添加CDN之前的TTFB

    添加CDN之前的TTFB

    测试 2:TTFB与CDN

    然后我们启用了CDN并再次运行测试:

    • 总加载时间降至788毫秒
    • 平均TTFB提高到37毫秒

    CDN能带来多大的改变!

    另一个需要注意的重要事项是,我们选择了斯德哥尔摩地点来执行此测试。为什么?因为我们想向您展示通过减少物理距离可以实现的真正改进。斯德哥尔摩有一个CDN POP,所以我们的内容是从斯德哥尔摩提供的。

    添加CDN后的TTFB

    添加CDN后的TTFB

    通过缓存更快地交付

    与您在WordPress主机或插件中使用缓存的方式类似,CDN也使用缓存。这是他们可以如此快速地交付文件的一种方式。

    重要提示:一旦CDN获得您的媒体副本,访问者通常必须请求一次或两次,然后才能将其缓存在CDN上。CDN在请求上放置一个名为“X-Cache”的HTTP标头。该文件通常在第一个或第二个请求中显示为MISS,这意味着它尚未缓存。

    CDN未缓存 (MISS)

    CDN未缓存 (MISS)

    在后续请求中,它显示为HIT,现在缓存在您的CDN上。它将根据各种因素(例如ETag标头、过期标头或手动清除CDN缓存)保持缓存。

    CDN缓存 (HIT)

    CDN缓存 (HIT)

    使用诸如Cloudflare之类的CDN,您可以利用所谓的全页反向代理缓存将缓存提升到一个新的水平。这涉及在一个主 URL 而不是辅助域上缓存所有内容。

    使用GZIP压缩节省大量成本

    WordPress CDN还利用GZIP,一种用于文件压缩和解压缩的文件格式和软件应用程序。GZIP压缩在服务器端(或CDN服务器/POP)启用,进一步减小了HTML、样式表和JavaScript文件的大小。

    它不适用于图像,因为它们已经以不同的方式压缩。由于压缩,有些人已经看到了高达70%的减少。这是您可以进行的最直接的优化之一。不用担心,所有信誉良好的CDN都默认启用此功能。

    HTTP/2

    HTTP/2也是所有CDN用来加速资产交付的主要功能之一。性能提升是由于各种原因,例如协议能够支持更好的多路复用、并行性、Huffman编码的HPACK压缩、ALPN扩展和服务器推送。

    2. 降低带宽成本

    CDN的另一个好处是它可以帮助从您的托管服务器(源服务器)卸载CPU和资源。这有助于:

    • 防止流量高峰使您的主机不堪重负
    • 降低整体带宽成本
    • 消除由于流量波动导致的带宽费用波动

    您最不想要的就是让某些东西像病毒一样传播开来,而您却要从房东那里收到高额账单或超额费用。

    CDN帮助降低成本的另一种方法是提供简单的方法来启用盗链保护。这是指限制HTTP引用并防止其他人将您的资产嵌入其他网站。

    你们中的一些人可能听说过赫芬顿邮报的惨败。《赫芬顿邮报》的一位作者从Oatmeal的网站复制并粘贴了图像,该网站从AWS累积了1,000美元的账单,该账单已发送给Oatmeal的网站所有者。Oatmeal的所有者最终替换了这些图像,以便赫芬顿邮报文章的读者可以看到它们。

    防盗链

    防盗链

    这就是为什么始终必须启用盗链保护的原因。否则,您最终可能会收到一笔离谱的账单。

    3. 高可用性和可扩展性

    CDN提供高可用性和可扩展性。由于复制的内容可以跨不同地理位置的多个POP访问,因此如果一个服务器出现故障,Web流量会动态路由到另一台服务器。无需担心可扩展性,因为CDN提供商在构建时就考虑到了这一点。如果您使用较小的共享主机,CDN可以防止您的网站崩溃,因为它可以处理大部分负载。

    4. SEO优势

    谷歌早在2010年就将网站速度作为排名因素,因此更快的网站可以带来更高的排名已经不是什么秘密了。虽然无法知道速度对速度有多大影响,但您可以放心地假设它是更关键的因素之一,因为它会影响用户体验。

    Brian Dean分析了前100万个域名,以查看网站速度与Google排名之间的关系, 并发现了正相关关系。虽然这些测试几乎无法证明,但您可以放心,拥有更快的网站只会在Google中帮助您。简而言之,谷歌奖励快速网站。

    网站速度 - 谷歌排名

    网站速度 – 谷歌排名

    除了网站页面的速度之外,CDN还有助于提高媒体的抓取速度,例如图片,这与Google图片搜索中的索引相关。

    5. 额外的安全性

    许多CDN通过允许您实施Web应用程序防火墙 ( WAF ) 和一些所谓的Origin shields来提供额外的安全性。这些可以帮助:

    • 缓解各种形式和规模的DDoS攻击,包括针对UDP和ICMP协议的攻击
    • 阻止SYN/ACK、DNS放大和第7层攻击
    • 将您的网站放在代理后面,该代理会隐藏您的原始IP地址,尽管它不是防弹的

    查看我们关于如何阻止DDoS攻击的案例研究。我们的客户拥有一个运行Easy Digital Downloads的小型电子商务网站,该网站在7天内对单个页面的请求超过500万次

    该站点通常每天仅产生30-40 MB的带宽和数百名访问者。但该网站突然间突然达到了每天15-19GB 的数据传输量!这增加了4650%。谷歌分析显示没有额外的流量。这不好。

    DDoS攻击

    DDoS攻击

    客户在他们的站点上实施了Sucuri的Web应用程序防火墙,所有带宽和请求都立即丢弃在站点上(如下所示),此后再也没有出现过任何问题。因此,如果您遇到此类问题,这是一项很好的投资和节省时间的方法。

    添加WAF防火墙

    CDN还提供额外的安全功能,例如安全令牌,允许您生成具有过期时间的安全链接。过期后,用户将无法再访问该内容。

    CDN速度测试:使用CDN与不使用CDN

    让我们做一些测试来向您展示结果,而不是仅仅告诉您WordPress CDN的好处。

    • 我们从4个不同的测试位置运行了5次测试,启用了CDN,然后没有启用CDN。
    • 该站点使用免费的Cloudflare。
    • 服务器的物理位置在美国爱荷华州。

    重要提示:当您对CDN进行速度测试时,请运行几次以缓存媒体。正如我们之前关于CDN缓存所描述的,X-Cache HTTP标头在缓存后将显示“HIT”。如果它没有被缓存,它会显示一个“MISS”。如果您没有正确执行此操作,那么当您没有先建立缓存时,CDN可能无法帮助您加快网站速度。

    没有CDN(美国德克萨斯州达拉斯)

    我们首先使用达拉斯的一台没有CDN的服务器运行了5次Pingdom测试。然后我们取平均值。

    没有使用达拉斯服务器进行CDN测试

    没有使用达拉斯服务器进行CDN测试(来源:Pingdom)

    没有CDN(澳大利亚墨尔本)

    然后,我们使用没有CDN的澳大利亚墨尔本服务器运行了5次Pingdom测试。也取了平均值。

    没有使用澳大利亚服务器的CDN测试

    没有使用澳大利亚服务器的CDN测试(来源:Pingdom)

    没有CDN(美国加利福尼亚州圣何塞)

    然后,我们在加利福尼亚州圣何塞进行了5次没有CDN的Pingdom测试,并取平均值。

    没有来自圣何塞服务器的CDN测试

    没有来自圣何塞服务器的CDN测试(来源:Pingdom)

    没有CDN(瑞典斯德哥尔摩)

    我们在瑞典斯德哥尔摩进行了5次没有CDN的Pingdom测试,并取了平均值。

    没有在瑞典使用服务器进行CDN测试

    没有在瑞典使用服务器进行CDN测试(来源:Pingdom)

    使用CDN(美国德克萨斯州达拉斯)

    作为比较,我们使用德克萨斯州达拉斯服务器上的活动CDN运行了5次Pingdom测试。之后取平均值。

    使用达拉斯服务器使用CDN进行测试

    使用达拉斯服务器使用CDN进行测试(来源:Pingdom)

    使用CDN(澳大利亚墨尔本)

    然后,我们使用来自澳大利亚墨尔本服务器的CDN运行了5次Pingdom测试,然后取平均值。

    用CDN测试澳大利亚

    用CDN测试澳大利亚(来源:Pingdom)

    使用CDN(美国加利福尼亚州圣何塞)

    我们还使用加利福尼亚州圣何塞的服务器对CDN进行了5次Pingdom测试并取平均值。

    使用San Jose服务器进行CDN测试

    使用San Jose服务器进行CDN测试(来源:Pingdom)

    使用CDN(瑞典斯德哥尔摩)

    我们为具有活动CDN的Stockholm服务器运行了5次Pingdom测试。然后取平均值。

    使用瑞典的服务器进行CDN测试

    使用瑞典的服务器进行CDN测试(来源:Pingdom)

    结果

    让我们看看结果以了解CDN对总加载时间的影响程度。

    CDN速度测试对比

    CDN速度测试对比

    • 美国德克萨斯州达拉斯:使用CDN将总加载时间减少8.11%。
    • 美国加利福尼亚州圣何塞:使用CDN的总加载时间减少33.02%
    • 澳大利亚墨尔本:使用CDN的总加载时间减少了54.19%。
    • 瑞典斯德哥尔摩:使用CDN的总加载时间减少了54.7%。

    CDN在达拉斯和圣何塞站点上产生了稍快的页面加载时间。但是,如果您查看澳大利亚的测试,您会发现加载时间存在巨大差异。这是因为测试服务器的地理位置。

    测试服务器位于爱荷华州,因此在没有来自达拉斯和圣何塞的CDN的情况下加载数据时不会走那么远。但对于澳大利亚来说,距离才是缩短加载时间的关键。

    当我们启用CDN时,来自澳大利亚悉尼的CDN POP的内容和媒体加载,这会导致下载时间大大加快。瑞典斯德哥尔摩也是如此。

    现在,您想在某些情况下将加载时间减少50%以上吗?答案应该是肯定的!

    您需要CDN吗?

    我们经常收到这个问题。根据我们的经验,这不应该是一个问题,因为CDN在几乎所有情况下都是有益的,无论您的网站的大小和流量如何。

    看看我们上面列出的所有好处。价格通常不再是一个因素,因为大多数CDN提供商非常便宜,或者使用免费Cloudflare。更不用说,CDN有助于改善SEO、网站加载、用户体验等等!

    如果您只向特定地理位置的访问者提供内容,您可能需要做一些进一步的测试。

    例如,假设您在加拿大安大略省经营一家带有网站的小商店。也许您不太关心位于其他地方的客户。您需要研究CDN提供商的POP所在的位置。

    如果您的网络服务器主机位于安大略省,但您注册的CDN提供商仅在美国提供最近的POP,则可能会降低您的网站速度。在这种非常罕见的情况下,不使用CDN可能会使您受益。

    有很多很棒的CDN提供商,我们鼓励您探索其他一些顶级 CDN:

    如何在WordPress中安装CDN

    每个CDN提供商都有自己的集成方法,但值得庆幸的是,它们都支持WordPress并使其易于集成。如果您遇到问题,请查看他们的文档或询问他们的支持团队。

    Cloudflare

    如果您正在使用Cloudflare,我们将提供有关如何在您的WordPress网站上安装Cloudflare的深入教程。

    第三方CDN

    如果您正在考虑自己部署CDN,我们建议为您的媒体和资产使用子域,而不是提供商的随机URL。

    示例: cdn.yourdomain.com。

    这将确保更好地为您的网站打造品牌,并在索引问题方面减少麻烦。

    在提供商处设置好CDN后,您可以使用免费的WordPress插件快速链接您的资产并自动将它们复制到您的CDN提供商。在下面查看我们推荐的WordPress CDN插件列表。

    顶级CDN插件和扩展

    Cloudflare

    这些CDN插件不会自动在您的WordPress网站上激活CDN,而是将第三方CDN提供商(如Cloudflare、Fastly或Sucuri)连接到您的WordPress网站,从而允许CDN访问网站资产并将该内容交付给访客。

    总体而言,最好的WordPress CDN插件让您轻松连接,提供一键式解决方案,而不是复杂的集成。

    以下是最好的WordPress CDN插件:

    • Cloudflare:如果使用Cloudflare作为您的CDN提供商,这是正确的选择,特别是因为它提供一键式安装、Web应用程序防火墙设置和自动平台优化工具,可通过250多个快速可靠的数据显着加快站点速度中心。
    • Bunny.net:作为CDN提供商和WordPress CDN插件,Bunny.net提供快速集成来替换链接并将它们添加到您的CDN。通过自动HTTPS配置、自定义CDN主机名以及将特定目录排除在CDN服务之外的能力,您可以获得快速的性能改进。
    • LiteSpeed Cache:首先,这是一个缓存插件。但它还附带免费的QUIC.cloud CDN缓存,或者您可以链接到任何CDN提供商。您可以使用各种功能以及缩小、图像优化和延迟加载来提高网站的性能。
    • W3 Total Cache:许多缓存插件也兼作CDN WordPress插件,W3 Total Cache也不例外。与一些最受欢迎的CDN提供商集成,无需任何复杂设置即可立即提升您的网站性能。这会将媒体项目和主题文件等元素发送到CDN,同时在CDN中使用之前缓存和压缩这些文件。
    • CDN Enabler: 此插件重写您的所有URL,以便从您的外部CDN提供资产。您可以链接到KeyCDN帐户并利用缓存清除、性能增强等。

    使用CDN索引图像

    您希望确保Google在移动到CDN时仍会为您的图像编制索引。

    对于Yoast SEO插件的用户,您需要将以下代码添加到您的functions.php文件的底部。将域和CDN域替换为您自己的域。

    function wpseo_cdn_filter( $uri ) {
    return str_replace( ‘http://yourdomain.com’, ‘http://cdn.yourdomain.com’, $uri );
    }
    add_filter( ‘wpseo_xml_sitemap_img_src’, ‘wpseo_cdn_filter’ );
    function wpseo_cdn_filter( $uri ) {

    return str_replace( ‘http://yourdomain.com’, ‘http://cdn.yourdomain.com’, $uri );

    }

    add_filter( ‘wpseo_xml_sitemap_img_src’, ‘wpseo_cdn_filter’ );

    function wpseo_cdn_filter( $uri ) {
    
    return str_replace( 'http://yourdomain.com', 'http://cdn.yourdomain.com', $uri );
    
    }
    
    add_filter( 'wpseo_xml_sitemap_img_src', 'wpseo_cdn_filter' );

    如果您不这样做,可能会导致您的图像被取消索引(如下所示)。您可以随时在Google Search Console中自行检查。

    图片未编入索引

    图片未编入索引

    但是,Google Search Console存在缺陷,有时当索引图像出现在Google上时无法报告它们。检查您的图像是否被索引的一个好方法是前往谷歌图像搜索并输入以下内容:“site:https://yourdomain.com”。

    谷歌图片搜索检查索引

    谷歌图片搜索检查索引

    重要提示:不要输入您的CDN URL。即使图像是从CDN提供的,它们仍应在您的根域上编制索引。

    如果您的图片出现在Google图片搜索中,它们就会被很好地编入索引。

    小结

    现在您可以看到使用WordPress CDN可以获得的所有奇妙好处。它将确保您的媒体在全球范围内更快地加载,减少您的TTFB,并显着降低您的带宽成本和服务器负载。

    不仅如此,由于更快的页面加载时间,您还可以看到更好的排名。最重要的是,您的访问者将获得更出色的用户体验。

  • 如何使用WordPress创建漏斗分析(分步教程)

    如何使用WordPress创建漏斗(分步教程)

    经营在线业务最困难的方面之一是将您的访问者转变为付费客户。涉及的因素太多了,错过一两步是可以原谅的。然而,如果您要使用WordPress创建漏斗,那么赢得客户的机会就更大。

    在创建销售渠道方面,对我们而言,WordPress胜过竞争对手。无论您是初创公司还是企业,它都具有可扩展性、灵活性和适合您的预算。

    在这篇文章中,我们将向您展示如何使用WordPress创建漏斗分析。我们将概述您需要的所有工具,并引导您完成整个过程。

    ClickFunnels快速入门

    在我们真正进入文章之前,值得花几分钟谈谈ClickFunnels。这是创建可重复且有效的销售渠道的领先解决方案。成千上万的用户使用该工具产生流量、客户和收入。

    clickfunnels

    在纸面上,它具有许多令人兴奋和创新的特性和功能。例如:

    • 有一个可靠的漏斗构建器,具有拖放功能。
    • 它提供内置于平台的内容营销。
    • 社区丰富而专注。

    “哎呀,是的!”中还有更多内容。用于选择ClickFunnels的列。即便如此,它并没有捕获100%的用户群。

    为什么你想找到一个ClickFunnels替代品

    鉴于ClickFunnels提供的出色功能,它并不是市场上唯一的解决方案。以下是几个原因:

    • 价钱。ClickFunnels价格比较贵的,这是无可避免的。最低级别是每月97美元,这不像每月297美元的计划那样功能齐全。
    • ClickFunnels的生态系统。虽然封闭源代码的多合一托管平台非常适合入门,但您永远被锁定在ClickFunnels中。换句话说,没有办法让您的业务脱离ClickFunnels的系统。
    • 功能。ClickFunnels是一个“万事通”。因此,虽然某些功能是一流的,但其他功能需要一些工作。
    • 它的外观和设计。就像WordPress网站过去有某些“告密”元素一样,所以ClickFunnels网站也会大声疾呼它的名字。

    为了进一步讨论最后一点,如果您查看ClickFunnels网站的任何模板或默认设置,它们都具有与整个销售渠道相关联的过时外观:

    clickfunnels漏斗示例

    所以,ClickFunnels有一个“垃圾邮件”的默认设计,尽管我们承认它是一个成功的设计。无论如何,您想要使用WordPress创建漏斗的原因会有一个独特的组合——所以让我们接下来讨论一下。

    为什么你应该使用WordPress创建漏斗

    在构建任何类型的网站时,我们认为WordPress排名第一,这不应该让人感到震惊。我们总结一下关键方面:

    • WordPress核心软件是免费的。它不仅下载和使用成本为零,而且是开源的。这意味着您几乎可以控制网站的各个方面,而无需锁定。
    • 它可以伴随您的整个业务旅程。WordPress非常适合作为博客平台使用。它也是一个功能齐全的内容管理系统 (CMS),适用于每月点击数百万次的企业级网站。
    • WordPress可以通过数以千计的主题和插件进行扩展。事实上,很多都是免费的。我们将在整篇文章中讨论的主题和插件还有一个丰富的高级市场。
    • WordPress社区强大、多样且知识渊博。有易于访问的支持渠道和丰富的开发人员网络,以确保WordPress始终在发展和改进。

    以上只是冰山一角。即便如此,不是每个人都会在不调查竞争对手的情况下使用WordPress创建漏斗。接下来我们将重点介绍这一点。

    使用WordPress创建漏斗的替代解决方案

    任何产品或服务之间的竞争都是有益的。销售漏斗也不例外。我们过去曾介绍过登录页面,在许多情况下,它们可以与更“传统”的漏斗构建器竞争。

    尽管如此,我们建议有两个工具更接近WordPress,第一个是我们已经提到的。

    1. ClickFunnels

    clickfunnels编辑器

    我们将不再讨论相同的细节,因为我们已经在本文和其他文章中讨论了ClickFunnels。无论如何,值得总结一下ClickFunnels的吸引力:

    • 这是一个多合一的漏斗构建器平台。
    • 社区旨在帮助您取得成功。
    • 您将获得一个经过验证的系统来创建、利用销售渠道并从中获得成功。

    更重要的是,启动和运行起来轻而易举。完成注册过程后,您将执行以下步骤:

    1. 导航到您的仪表盘,然后单击构建漏斗按钮。
    2. 从弹出的对话框屏幕中,选择要使用的漏斗类型。
    3. 使用漏斗生成器中的启动清单创建您的销售漏斗。

    这里的最后一步涉及设计挤压和销售页面、订单表格、确认和感谢页面。这一切都布置得很好,您很快就会准备好您的漏斗并等待访客。

    2. Systeme

    另一个解决方案是Systeme

    Systeme

    这将自己定位为ClickFunnels的直接竞争对手,并且具有许多相同的功能:

    • 拖放式漏斗构建器,也可兼作网站构建工具。
    • 电子邮件和内容营销功能。
    • 用于销售订阅和课程的内置工具。
    • 强大的联系人管理。

    在我们的评论中,我们认为Systeme与ClickFunnels接触的用户不同。后者专注于核心概念,而Systeme希望成为您整个业务的中心。

    漏斗自定义

    因此,入门步骤比ClickFunnels更加多样化:

    1. 单击“创建”按钮以构建新渠道。
    2. 为您的渠道选择最终目标,例如捕获电子邮件或举办网络研讨会。
    3. 使用模板构建订单表格和感谢页面。
    4. 根据您的要求自定义每个页面。
    5. 使用内置页面构建器进一步设计您的渠道。

    我们认为这两种解决方案都有很好的方法来创建漏斗。我们的下一部分将深入探讨我们自己对什么是好的漏斗构建器的看法。

    一个好的漏斗构建器应该具备的特性和功能

    我们认为,所有优秀的漏斗构建者都应该具备一些常量。这是您应该寻找的快速列表:

    • 一种设计漏斗核心元素的方法。
    • 调整漏斗功能的能力。
    • 功能可帮助您与在某些时候退出渠道的人重新建立联系。
    • 鉴于您的渠道以销售结束,您需要能够向您的网站添加支付网关。

    我们还要说,良好的定价也很重要,尽管它不应该是“第一次投票”的先决条件。这是因为我们认为您应该为满足您需求的解决方案付费。

    即便如此,预算也很重要。因此,一旦您权衡了其余的要求,它就应该成为您的决定因素。

    使用WordPress创建漏斗需要什么

    说到预算,是时候开始整合您选择的工具和解决方案,在WordPress中创建漏斗了。

    你有一大堆“必需”的工具和服务,你会想要准备好使用。在这里,我们将为您提供一些一般指导以及粗略的成本,但稍后我们将介绍特定选项:

    • 托管(每月5美元起)。专用的WordPress主机至关重要,尤其是可以让您的网站保持最佳运行状态的主机。更重要的是,无论您的预算如何,总有合适的东西。
    • 一个合适的主题(大约50-100美元)。我们提到有很多免费主题可用。不过,高级主题将为您提供更好的支持和更强大的特性和功能。
    • 页面构建器插件(每年0-100美元)。虽然并非每个网站都需要页面构建器,但在使用WordPress创建漏斗时,它是您箭袋中的主要箭头。这使您可以实现与其他工具相同的灵活性。
    • 销售漏斗功能(每年200-300美元)。当然,创建漏斗需要专门的解决方案。我们稍后再讨论我们的选择。
    • 电子商务功能(核心插件免费)。WordPress没有开箱即用的电子商务功能。因此,您需要一个合适的插件来填补空白。

    除此之外,您还需要考虑其他重要的站点范围方面的因素。虽然它们不是这里的重点,但安全、备份等对于稳定和安全的网站都很重要。

    总的来说,您每年的最高收入约为600美元。与其他非WordPress解决方案相比,这是对您将获得的额外功能和灵活性的窃取。

    稍后我们还将讨论一些可选的附加功能。这些可能会产生附加成本,也可能对您自己的业务需求至关重要。首先,让我们向您展示如何使用WordPress创建渠道。

    如何使用WordPress创建漏斗

    掌握工具后,就可以使用WordPress创建漏斗了。以下是我们将在接下来的几节中介绍的内容:

    当然,没有主机,任何站点都无法运行,所以让我们先解决这一步。

    1. 购买合适的主机并安装WordPress

    首先,您需要为您的WordPress网站提供专用主机。好消息是竞争激烈,这意味着您有充足的选择。

    托管的WordPress主机将为您的网站提供更大的稳定性和安心感。如果你为海外建站,我们极力推荐LinodeVultr

    国内,则推荐大厂,比如阿里云、腾讯云、华为云之类的。

    这些主机中的每一个都可以让您安装WordPress并根据您的确切要求管理您的服务器。此外,您还可以获得免费的安全套接字层 (SSL) 证书——这对于保护敏感的客户信息至关重要。

    说到 WordPress,您还需要将该平台安装到您的服务器上。好消息是您的房东经常会帮助您。

    许多主机- 特别是如果您是仅使用WordPress的选项 – 将为您预安装WordPress。这意味着一旦您完成了注册过程,您的网站就可以开始使用了。

    如果主机还安装了其他重要的插件和主题,这可以节省时间,并且会变得更好。这是我们谈论托管托管更适合的原因之一,尽管并非每个主机都会将其作为服务的一部分提供。

    如果您需要自己安装CMS,这通常是轻而易举的事。

    2.安装主题和页面构建器插件

    一旦您的主机上线并设置了WordPress,您的网站就需要查看该部分。安装主题应该是您的首要任务之一,因为它将决定您未来的一些决定。

    同时,您还需要考虑使用哪个页面构建器插件。如果您要创建任何其他类型的WordPress网站,我们建议您使用区块编辑器。随着时间的推移,它变得更加强大,并且在未来将成为该平台的全站点编辑 (FSE) 的核心:

    区块编辑器

    但是,要在WordPress中创建渠道,您需要一些已经具备所需功能的东西。我们之前已经介绍过很多,但我们认为Elementor更胜一筹

    elementor

    它提供了一个免费版本,可以满足您的所有需求。不过,高级版提供了更多帮助您在WordPress中创建渠道的功能。为了我们的需要,Elementor还用一块石头杀死了两只鸟。专业版还包括一个空白的启动主题,这是理想的,因为我们可以在其上构建一个漏斗。

    购买计划后,我们将引导您完成需要采取的步骤。

    1. 安装Elementor和Elementor Pro

    首先,您需要安装核心Elementor插件。如果您坚持使用页面构建器的免费版本,您将安装相同的版本。安装和激活插件与其他插件相同。

    要访问Pro功能,您需要从Elementor网站下载ZIP文件。访问您的Elementor仪表盘,然后单击您的个人资料图片旁边的链接:

    下载elementor

    从这里返回您的WordPress仪表盘并转到插件 > 安装插件屏幕:

    安装新插件

    在顶部,您会在页面标题旁边看到上传插件按钮。单击此按钮将打开一个文件上传器:

    插件文件上传

    从这里,浏览到您的ZIP文件,将其上传,然后单击立即安装。单击激活插件按钮完成安装,您几乎完成了。

    2. 将您的网站连接到Elementor

    在您继续之前,最好连接您的站点,以便获得全部功能。为此,您将在插件屏幕顶部找到一个链接:

    连接elementor服务器激活

    单击此按钮会将您带到一个启动页面,要求您连接并激活您的站点:

    elementor激活界面

    当然,您需要单击此按钮。在几秒钟内,您将被带回您的WordPress仪表盘并确认成功:

    elementor授权设置

    在这一点上,你已经准备好摇滚了。接下来是安装入门主题。

    3. 安装Hello Starter主题

    hello主题

    Elementor提供了一个空白的入门主题来帮助您使用页面构建器来创建您理想的网站。要获取它,请前往WordPress中的外观 > 主题页面,然后单击添加新按钮。

    接下来,搜索“Hello Elementor”。您应该只在主题弹出窗口中看到。单击“安装”按钮后,WordPress将执行以下操作:

    安装hello主题

    最后,单击激活,您的工作(现在)就完成了!

    4. 选择合适的网站模板

    在您继续之前,有必要让您的网站设计井井有条。虽然您可以在任何时候这样做,但现在是您开始设计漏斗之前的好时机。

    为此,您将使用Theme Builder。在WordPress中,前往Templates > Theme Builder页面。这将向您显示一个几乎是空的屏幕,但在单击“添加新”按钮后不会很长时间。

    主题builder

    您将看到一个对话框屏幕弹出窗口,您可以在其中选择要使用的模板类型,并为其命名:

    创建模板

    单击确认后,Elementor编辑器将打开,显示一个近乎空白的页面:

    elementor空白页面

    接下来,将鼠标悬停在实时预览上的文件夹图标上。这是您选择页面模板的地方:

    添加模板

    这将显示要导入的合适模板库。对于我们的示例,我们正在选择产品页面,但您可以选择适合您业务的任何内容:

    页面库

    将鼠标悬停在模板上并单击Insert后,您的页面将更新:

    加载模板

    此时,您可以离开您的网站。我们稍后会回到Elementor,但现在,您需要添加电子商务功能。

    3.安装您最喜欢的电子商务插件

    正如我们所提到的,WordPress没有开箱即用的电子商务功能。不过这不是问题——有很多插件可以添加它。

    woocommerce

    WooCommerce是领先的WordPress电子商务插件,就我们的目的而言,它的作用不亚于支付网关。不过,一旦您完全启动并运行,您仍可以以更大的容量使用该插件。

    让我们向您展示如何设置它。

    1. 安装WooCommerce插件并运行入职向导

    WooCommerce可以像任何其他免费的WordPress插件一样安装。完成此操作后,您将获得设置WooCommerce的五个步骤。首先,输入您商店的详细信息,然后选择一个行业:

    商店所属行业选项

    对于产品类型屏幕,根据您销售的产品选择实物产品下载。其他选项附带额外费用,在我们的案例中不需要。

    产品类型

    对于“业务详细信息”屏幕,您可以在初始页面上填写相关信息,但请确保您翻转到“免费功能”选项卡并删除您不想安装的任何功能。

    企业详细信息

    在我们的案例中,唯一需要的功能是WooCommerce Payments,但欢迎您选择适合您业务的任何功能。

    最后,在Theme页面上,单击按钮Continue with my active theme

    主题选项

    完成后,您可以继续添加产品。请注意,您还需要激活WooCommerce Payments。该过程是独一无二的,具体取决于您选择的网关,但它很直观,需要通过填写几个字段来进行验证。

    2. 将产品添加到您的WooCommerce安装中

    添加产品不会像通常的在线商店那样,因为您的漏斗会完成繁重的工作。因此,一些通常至关重要的字段只是占位符。

    要添加新产品,请转到WordPress中的WooCommerce > 主屏幕,然后单击添加我的产品

    添加产品

    您需要选择手动添加产品,然后在编辑屏幕上输入描述性标题和简介。完成后,向下滚动到产品数据元框:

    产品数据

    在这里,您可以输入产品的价格,如果您的产品是数字产品,则选中虚拟可下载框。对于实物商品,建议填写适当的尺寸字段。

    您现在可以发布您的页面。此时,您已准备好创建漏斗,从安装插件开始。

    4. 购买并安装CartFlows插件

    与WordPress的许多方面一样,有许多插件可以为您提供所需的功能。在我们的例子中,我们将跳过追逐并推荐CartFlows

    cartflows

    这是因为它与WooCommerce链接,让您可以在WordPress中创建可以与ClickFunnels和Systeme等专用平台竞争的渠道。

    盒子里还有很多东西,但我们将在后面的部分中讨论。现在,让我们安装插件。

    好消息是CartFlows的流程与Elementor类似:

    • 安装并激活插件的免费核心版本
    • 从CartFlows购买并下载ZIP文件。
    • 将其上传到您的WordPress网站并激活扩展。

    完成此操作后,您就可以创建第一个漏斗了。

    5. 创建一个“流程”

    在CartFlows的说法中,流程是一个漏斗。此时,除了新流程之外,您的网站上几乎所有内容都已准备就绪。这是如何做到的。

    1. 添加新流程并选择模板

    要添加新流程,请前往WordPress中的CartFlows > Flows页面,然后单击Add New

    添加新的流程

    您可以在此处从多个模板中进行选择,也可以从头开始。欢迎您选择最适合您的选项,尽管我们将选择一个预定义的模板。

    选择模板

    点击后,您会看到CartFlows向您显示构成您的流程的步骤和页面。在此处,单击导入流。接下来,为您的流程选择一个名称,CartFlows将执行必要的操作。

    2.更改您的漏斗顺序并添加新步骤

    导入流程后,您将获得每个步骤的概览。

    步骤概览

    我们希望您获得彩色标签,以显示用户将如何通过您的Flow进行进度。即便如此,您可能不喜欢这些步骤的呈现方式。如果您想更改顺序,可以使用“汉堡包”图标拖动它们。根据您的确切要求设计Flow非常快。

    要添加新步骤,您可以单击屏幕右侧的橙色按钮或页面底部的“添加新步骤”框。这样做会将您带到模板屏幕,这一次显示各个页面:

    页面模板

    您会注意到模板按功能分组,因此很容易选择合适的模板。

    导入新步骤后,它将显示在概述中,您将能够像使用任何其他步骤一样使用它。

    3. 编辑漏斗的设计和布局

    是时候重新引入Elementor 了。我们将使用它来编辑漏斗页面的设计和布局,然后使用WooCommerce查看结帐。

    要开始,请单击您要增强的步骤上的编辑链接:

    编辑链接

    接下来,单击使用Elementor编辑按钮:

    使用elementor编辑

    这将带您回到页面构建器的编辑屏幕。在这里,您可以随意调整布局以适合您的品味和目标。

    elementor步骤编辑

    我们无法告诉您您自己的页面应该是什么样子,尽管您需要记住这些模板是为成功而设计的。

    因此,我们建议您在学习绳索时进行“轻触”。一旦您有了更多经验,您就可以从头开始创建自己的漏斗和步骤。

    虽然您将使用Elementor来设计您的页面,但您不会想要触摸结帐部分。在编辑器中保存更改后,我们将在接下来查看此方面。

    4. 编辑您的结帐功能

    最后,您可能想要更改结帐流程。为此,请单击任何结帐页面的编辑链接。

    在这里,从产品 > 添加新产品选项卡中选择正确的产品,将其链接到您的步骤。

    cartflows产品链接

    您可以使用其他选项卡来进一步处理您的设计。例如,您可以更改结帐上的字段……:

    表单字段

    …甚至添加“Order Bump”:

    order bumps

    完成后,单击步骤上的更新,然后查看新的实时销售漏斗!

    使用WordPress创建渠道后的下一步

    使用WordPress创建渠道后,您将无需做太多事情。即便如此,您可能需要考虑添加一个或两个插件来涵盖许多领域:

    • 电子邮件营销。为合格的潜在客户收集电子邮件地址至关重要,并且可以为您带来更多销售。过去我们已经介绍了许多解决方案,并且每个预算都有一些东西。
    • 废弃的手推车。这是一个您可能没有考虑过的领域,但您需要一种方法来抓住放弃购物车的用户,并吸引他们回来。
    • 订阅。定期稳定的收入是一种很好的商业模式。WooCommerce对此有一个解决方案,尽管还有很多其他选项可用。
    • 联盟计划。联盟计划有两项重要工作:找到新客户并带来更多资金。为他们制定解决方案是个好主意。
    • 在线聊天。客户支持很重要,可能是您网站的成败。添加实时聊天插件意味着您将准备好将潜在客户留在您的渠道中。

    您越深入使用WordPress创建渠道,您就会注意到该平台有多少可以根据您的确切要求进行定制。尽管我们在这里提到了很多解决方案,但还有很多需要找到的解决方案。

    尽管如此,通过获得核心功能,您将拥有一个可靠的销售渠道来增加您的收入。

    小结

    在建立在线业务时,创建销售漏斗几乎是必要的。简而言之,您需要了解访问者如何对您的产品和服务产生兴趣。更重要的是,您还需要了解这些合格的潜在客户是否向您购买。

    在这篇文章中,我们了解了如何使用WordPress和CartFlows创建漏斗。您还需要一些其他工具,例如电子商务插件、合适的主题和页面构建器。从那里,您将拥有几乎所有东西来在您的WordPress网站上建立一个出色的销售渠道。

  • 基于520万个移动端和桌面页面评估页面速度影响因素

    基于520万个移动端和桌面页面评估页面速度影响因素

    这篇研究文章将分析了500万+个桌面和移动页面,以了解哪些因素会影响页面速度。

    首先,我们为TTFB、Visual Complete和完全加载时间指标建立了全球基准。

    然后,我们研究了图像压缩、CDN和托管如何影响网站加载速度。

    我们的数据揭示了一些非常有趣(且令人惊讶)的见解。

    以下是我们主要发现的摘要:

    1. 在我们对520万页的分析中,桌面端的平均首字节时间 (TTFB) 速度在桌面端为1.286秒,在移动端为2.594秒。完全加载网页所需的平均时间在台式机上为10.3秒,在移动设备上为27.3秒。

    2. 平均网页在移动设备上的加载时间比在桌面设备上多87.84% 。

    3. 在比较主要的CMS时,Squarespace和Weebly具有最佳的整体移动页面速度性能。Wix和WordPress排名接近底部。

    4. 在桌面上,CDN对TTFB的影响最大。然而,在移动设备上,HTML请求的数量似乎对TTFB的影响最大。

    5. 整体页面大小对桌面和移动“Visual Complete”加载速度有显着影响。与较小页面相比,较大页面的视觉加载时间要长318%。我们还发现gzip压缩有助于在桌面和移动设备上更快地加载图像。

    6. 总页面重量是完全加载页面速度的第一决定因素。轻型页面的完全加载速度比大型页面快486%。

    7. Wink和Gatsby是最快的Javascript框架。Meteor和Tweenmax是最慢的。最快的框架比最慢的.

    8. 文件压缩率非常低或非常高的页面具有高于平均水平的页面速度性能(通过First Contextual Paint测量)。

    9. 第三方脚本显着降低页面加载速度。添加到页面的每个第三方脚本都会将加载时间增加34.1毫秒。

    10. 我们发现使用响应式图像可以带来最佳的整体图像加载性能。使用WebP在减少图像加载时间方面效果明显较差。

    11. GitHub和Weebly网络主机具有最快的整体TTFB性能。在我们分析的托管服务提供商中,Siteground和Wix是最慢的。

    12. 中国、日本和德国的TTFB加载时间最快。澳大利亚、印度和巴西的TTFB时间最慢。

    13. CDN使用与较差的页面速度性能相关。这可能是因为某些CDN的性能明显优于其他CDN。

    关键页面速度加载时间指标的基准

    我们的首要任务是为重要的页面速度指标建立基准。

    您可能知道,“页面速度”实际上由几个不同的阶段组成。

    网页加载的阶段

    其中一些阶段发生在服务器级别。其他的发生在用户的浏览器中。

    为了充分了解页面加载的速度,我们需要深入研究每个阶段。

    具体来说,我们确定了以下情况的平均速度:

    • TTFB:到HTML文档响应的第一个字节的时间
    • StartRender:渲染开始时
    • Visual Complete:用户可以看到所有页面资产
    • Speed Index:用户看到页面加载的速度
    • onLoad:当所有页面资源(CSS、图片等)都下载完成时
    • Fully Loaded:当页面在用户浏览器中100%加载时

    桌面上的平均TTFB速度为1.286秒,移动设备上为2.594秒。

    桌面和移动设备上的平均ttfb速度

    桌面上的平均开始渲染速度为2.834秒,移动设备上为6.709秒。

    桌面和移动设备上的平均开始渲染速度

    平均视觉完成速度在桌面上为8.225秒,在移动设备上为21.608秒。

    桌面和移动设备上的平均视觉完成速度

    桌面上的平均速度指数速度为 4.782 秒,移动设备上为11.455秒。

    桌面和移动设备的平均速度指数

    桌面上的平均加载速度为8.875秒,移动设备上为23.608秒。

    桌面和移动设备上的平均加载速度

    平均满载速度在台式机上为10.3秒,在移动设备上为27.3秒。

    桌面和移动设备的平均满载速度

    关键要点:网页的平均页面加载速度在桌面上为10.3秒,在移动设备上为27.3秒。平均而言,页面在移动设备上的加载时间比在桌面设备上的加载时间长87.84%。

    Weebly和Squarespace整体速度性能最佳,WordPress垫底

    谈到页面速度,哪个CMS最好?

    为了回答这个问题,我们确定了用于我们数据集中所有站点的CMS。然后,我们比较了我们发现的每个CMS的TTFB性能。

    根据我们的数据,Weebly和Squarespace在台式机上名列前茅。

    cms页面速度性能排名桌面

    在移动页面速度方面,Squarespace排名第一…… Adob​​e Experience Manager和Weebly位列前三。

    cms页面速度性能排名移动

    值得注意的是,在移动速度方面,WordPress仅排在我们分析的CMS第14位。

    wordpress的移动页面速度在cms中排名第14

    另一个流行的CMS,Wix,在桌面和移动加载速度方面的评价也很差。

    wix在桌面和移动页面速度方面排名接近底部

    尽管WordPress为大约30%的网站提供支持,但它显然没有针对页面加载速度进行优化。这并不是说WordPress是一个糟糕的CMS。它具有其他优势(例如易用性、庞大的插件库和SEO),使其成为许多网站所有者的首选CMS。

    但是,当严格查看网站加载速度时,其他CMS似乎比WordPress具有明显的优势。

    要点:在主要的CMS中,Squarespace和Weebly的移动页面速度性能最好。WordPress和Wix排名接近底部。当然,WordPress网站可以通过一系列的优化,比如CDN、缓存、性能插件等方式来进行加速。

    使用CDN可能有助于桌面TTFB。最小化HTML请求是移动TTFB的关键

    我们分析了各种页面特征对TTFB(第一个字节的时间)的影响。

    这是我们发现的:

    factors-that-impact-desktop-and-mobile-ttfb

    如您所见,使用CDN似乎可以改善桌面和移动设备的TTFB。但是,与移动设备相比,CDN在桌面设备上似乎更有帮助。在通过移动设备加载的页面上,HTML请求的数量对TTFB的影响最大。

    虽然我们确实发现了各种页面特征和TTFB时间之间的关系,但页面级别的因素不会成就或破坏TTFB。TTFB很大程度上取决于服务器的响应时间,我们稍后会介绍。

    关键要点:使用CDN并最小化HTML请求可能会加速桌面和移动设备上的TTFB。

    与小页面相比,大页面“Visual Complete”的加载时间要长381%

    “Visual Complete”是指加载用户浏览器内网页的所有视觉内容。

    visually complete

    可能有脚本和其他资产在屏幕外加载。但从用户的角度来看,页面已加载。

    Visual Complete是一个重要的页面速度指标,因为它会影响用户对页面加载速度有多快或多慢的主观体验。

    只要用户可以看到和使用该页面,它就已完全加载……即使在幕后可能仍有资产加载和渲染。

    我们发现页面大小(bytesTotal)对移动和桌面视觉完成加载时间有显着影响。

    影响桌面和移动设备视觉完整性的因素

    但是,与桌面相比,移动设备上的页面大小更为重要。

    在桌面上,CDN的使用与更快的Visually Complete加载速度密切相关。页面大小紧随其后。

    在移动设备上,CDN只是第五个最重要的因素。

    因此,如果提高移动加载速度是您的首要任务,我会考虑尽可能减少页面大小。这可能意味着删除第三方脚本。或压缩图像。具体步骤取决于您的站点。但是,很明显,当涉及到Visually Complete速度时,这完全与HTML大小有关。

    关键要点: CDN可以显着提高桌面和移动设备上的Visually Complete页面速度。但是,CDN对桌面加载的影响要大得多。对于移动设备,总页面大小是Visually Complete加载时间的最重要因素。

    总页面大小与“Fully Loaded”页面速度密切相关

    最后,我们研究了影响“Fully Loaded”页面速度的因素。

    顾名思义,Fully Loaded是指100%的页面资源被加载和渲染。

    当谈到完全加载的页面速度时,页面的总大小是迄今为止桌面和移动设备上最重要的因素。

    影响桌面和移动设备完全加载的因素

    请求的数量也会影响页面完全加载的速度。

    这些数据的有趣之处在于桌面和移动设备之间有很强的重叠。与我们分析的许多其他指标不同,桌面端和移动端完全加载似乎受到同一组变量(即页面大小和HTML请求总数)的影响。

    然而,页面大小和HTML请求的重要性不应该让人大吃一惊。

    压缩图像、缓存和其他步骤通常会减少页面加载所需的时间。但他们只能走这么远。归根结底,要使页面“Visual Complete”,浏览器必须加载页面上的所有资产。而且要加载的资产越多,页面加载所需的时间就越长。

    这可能就是为什么CDN似乎对完全加载页面速度没有太大影响的原因(在桌面上的总体重要性排名第三,在移动设备上排名第十)。CDN可以提高图像加载时间。但是它们对3rd方脚本和其他可能减慢速度的资产没有多大帮助。

    关键要点:总大小对完全加载页面速度的影响大于桌面和移动设备上的任何其他变量。与小页面 (<0.83 MB) 相比,大页面 (>3.49 MB) 的完全加载时间要长486%。

    Wink和Gatsby是用于中等大小网页的最快JavaScript框架

    当谈到优先加载页面上的内容(以及何时)时,JavaScript框架做了很多繁重的工作。

    这就是为什么几乎76%的网站使用这些框架来创建高效、安全和标准化的页面。

    我们首先收集了每个框架在网络上使用频率的基准。

    javascript框架使用

    React是迄今为止最常用的JS框架(25.3%的网站使用它)。TweenMax (10.3%) 和RequireJS (9.5%) 也相当受欢迎

    接下来,我们想弄清楚哪些JavaScript框架在小型(<1,264,374字节)中型(1,264,374至4,019,332字节)和大型(>4,019,332字节)页面上表现最佳。

    对于小页面,RightJS名列前茅。

    javascript框架对fcp页面重量小于1264374字节的影响

    对于中等页面,Wink和Gatsby表现最好。

    javascript框架对1264374-4019332字节之间fcp页面权重的影响

    对于大页面,Gatsby和Riot的FCP时间最快。

    javascript框架对大于4019332字节的fcp页面权重的影响

    总的来说,JavaScript框架的选择会对FCP时间产生重大影响。事实上,对于中等大小的页面,最好的JS框架(Wink)的加载速度比最慢的框架(Meteor)快213%。

    尽管表现最好的和最差的有很多重叠(例如,Gatsby和RightJS在所有三个页面大小类别中都排在前5位),但似乎某些JS框架在某些大小的页面上效果最好。

    例如,Riot是一个很棒的大页面框架(总体排名第二)。

    riot适用于大页面

    然而,对于小页面,Riot的表现要差得多(总体排名第15)。

    riot不适合小页面

    要点:没有适用于所有情况的“最佳”JavaScript框架。对于有很多小页面的网站,RightJS是你最好的选择。对于大部分页面较大的网站,Gatsby看起来是理想的选择。

    具有低或高压缩级别的页面具有最快的加载时间

    在服务器上压缩页面文件是一把双刃剑。一方面,压缩文件显着降低了页面重量

    但是,在从服务器发送文件之前压缩文件需要在浏览器上进行额外的工作,因为客户端需要在渲染文件之前解压缩文件。

    作为此分析的一部分,我们着手回答这个问题:压缩文件真的能提高页面速度吗?

    为了回答这个问题,我们将FCP分为三类(Fast、Average、Slow):

    • 闪电:0-1000ms
    • 平均:1000ms-2500ms
    • 龟速:< 2500ms

    然后,我们比较了小、中和大页面之间的FCP速度和压缩级别。

    对于小页面,较低级别的压缩与更快的FCP加载时间相关联。但是,在非常高 (90-100%) 的压缩级别下,加载时间再次增加。

    压缩对fcp页面重量的影响小于880337字节

    中等大小的页面也有类似的分布:

    压缩对fcp页大小的影响介于880337-3625927字节之间

    大页面的反向钟形曲线分布更为极端:

    压缩对大于365927字节的fcp页面权重的影响

    尽管页面大小之间的确切分布不同,但要点很清楚:压缩水平非常低或非常高的页面加载速度最快。

    事实上,您可以看到压缩适量文件的页面的FCP性能下降。

    压缩适量文件的页面的fcp性能下降

    具体来说,压缩60%-80%文件的页面性能最差。

    因此,在提高页面速度时,超低或超高压缩水平往往效果最好。低级别的压缩减少了浏览器所需的工作。高水平的压缩比负载更小的客户端上的繁重工作更重要。

    关键要点:与具有中等压缩水平的页面相比,具有非常低或非常高压缩的页面具有更好的性能。

    第三方脚本会对加载时间产生负面影响

    毫不奇怪,我们发现第三方脚本(如Google Analytics社交分享按钮和视频主机)会导致FCP时间变慢。

    第三方脚本会对页面加载时间产生负面影响

    事实上,我们发现每个第3方脚本都会将页面加载时间增加34.1毫秒。

    我们的发现与其他发现第三方脚本对页面速度有巨大影响的人(like this)一致。

    显然,影响取决于所使用的脚本。某些第三方脚本(如Hotjar)加载速度相对较快。包括Salesforce在内的其他公司的速度非常慢。

    简而言之,第三方脚本会导致加载时间更长。页面拥有的脚本越多,加载速度就越慢。

    关键要点:页面上使用的每个3rd方脚本都会将页面加载时间增加34.1毫秒。

    响应式图像似乎比延迟加载和使用WebP更能改善页面加载时间

    图像在网站性能中起着极其重要的作用,主要原因有两个:

    首先,图像占据了页面整体大小的相当一部分

    其次,用户的注意力往往集中在页面上出现的图像上。如果这些图像加载缓慢,则会对用户体验产生负面影响。

    因为图像可以决定网站的加载速度,我们决定比较 4 种不同的图像优化方法的性能:

    • WebP: 由Google开发,WebP是一种图像格式,与其他文件格式相比,它的大小可以更小,但仍能产生类似水平的图像质量。
    • 优化图像: “优化图像”是指根据用户的设备、位置等提供不同版本的图像。我们在此类别下使用了内容交付网络 (CDN)、图像压缩和其他图像优化Web服务。
    • 延迟离屏图像当用户滚动到页面上的该点时加载折叠下方的图像。也称为“延迟加载”。
    • 响应式图像:当图像动态适应浏览器窗口大小时。

    当我们比较这些不同的Lighthouse速度得分方法时,响应式图像名列前茅。

    响应图像与最佳lighthouse速度分数相关

    我们还分析了哪种方法获得了最多满分的Lighthouse。结果非常相似。

    响应图像与lighthouse速度分数的较高百分比相关

    关键要点:虽然WebP与PNG和JPEG相比可能会改进图像压缩,但目前很少有网站实现了这种新的图像格式。

    GitHub和Weebly托管TTFB性能最佳,Siteground和Wix垫底

    我们比较了主要网络托管服务提供商的页面速度性能。

    考虑到服务器响应时间对TTFB的影响最大,我们分析了不同主机在该关键指标上的执行情况。

    具体来说,我们将TTFB分为三类(快速、平均、慢速)。我们查看了每个主机出现在每个类别中的百分比。

    以下是每个网络托管服务提供商在桌面上的TTFB性能:

    ttfb在主要桌面主机提供商中的性能

    Github、Weebly和Acquia是桌面TTFB的前3名。Automattic、Wix和Siteground的表现最差。

    我们对移动TTFB进行了同样的分析。结果如下:

    ttfb在主要移动网络托管提供商中的表现

    如您所见,Github在移动端和桌面端的表现都非常出色。考虑到Github Pages只提供静态资源,这不足为奇。这意味着,在许多方面,Github理论上不能够作为比较项,否则非常不公平。

    Seravo、Netlify和Weebly排在前4位。Wix和Automattic位于列表的底部。

    从这个分析中得出什么结论?

    TTFB只是选择主机时要考虑的众多因素之一。还有成本、正常运行时间、客户支持、功能等。

    也就是说,当谈到桌面和移动设备上的快速页面加载时间时,Github Pages是迄今为止主要主机中的最佳选择。Wix和Automattic主机的TTFB时间往往很慢。

    要点:在主要的托管服务提供商中,Github和Weebly在桌面端的表现最好。根据我们的分析,GitHub和Seravo是最快的移动主机。但是,应该注意的是,Github Pages仅提供静态页面,这使其与我们分析的其他主机相比具有固有的优势。

    中国、日本和德国的TTFB加载时间最快

    我们从我们的数据集中比较了11个国家的TTFB加载时间。

    以下是桌面速度的逐个国家/地区细分:

    按国家/地区(桌面)ttfb加载时间

    手机端:

    按国家(移动端)ttfb加载时间

    要点:中国拥有最好的移动和桌面TTFB性能。其次是页面速度快于全球平均水平的日本和德国。法国、英国、加拿大、美国和俄罗斯的页面速度平均。澳大利亚、巴西和印度的速度低于全球平均水平。

    有CDN的页面比没有CDN的页面表现更差

    我们最令人惊讶的发现之一是,使用CDN的页面实际上比不使用CDN的页面表现更差。

    这对于两个桌面都是如此:

    cdn的使用与较差的桌面页面速度相关

    和手机:

    cdn的使用与较差的移动页面速度相关

    这怎么可能?

    从理论上讲,因为它提供的内容接近用户所在的位置,所以CDN应该全面提高页面速度。

    cdn的工作原理

    然而,在我们的分析中并非如此。

    我们假设并非所有CDN都是平等的。在许多情况下,使用优化不佳的CDN实际上会减慢速度。

    当我们分析前18名顶级CDN提供商的性能时,我们确实发现了性能上的巨大差异。

    主要CDN的页面速度性能

    具体来说,我们注意到(在桌面上)最好的CDN的性能比最差的CDN好3.6倍。这有助于解释为什么CDN不会自动提高性能。

    为了让表现不佳的人更容易被发现,我们将CDN性能与全球平均水平进行了比较。

    与平均水平相比主要CDN的页面速度性能

    然后,我们将每个CDN放入三个buckets之一:

    • 好(快% 和慢%优于所有提供商的平均值)
    • 平均(快%或慢%优于所有提供商的平均值)
    • 差(快%和慢%比所有提供商的平均值差)

    以下是每个提供商的性能摘要:

    桌面端

    • 优秀: Airee、Amazon Cloudfront、Azure CDN、CacheFly、EdgeCast、Fastly、GitHub Pages、Google Cloud、KeyCDN、MaxCDN、Netlify
    • 平均: CDN77
    • 糟糕: Akamai、ArvanCloud、Cloudflare、Fireblade、Incapsula、Sucuri

    移动端

    • 优秀: Airee、Amazon Cloudfront、Azure CDN、CDN77、EdgeCast、Fastly、GitHub Pages、Google Cloud、KeyCDN、MaxCDN、Netlify
    • 平均: Fireblade 、Incapsula、Sucuri
    • 糟糕: Akamai、ArvanCloud、Cloudflare

    关键要点:使用CDN不会自动提高页面速度性能。某些CDN的性能明显优于其他CDN。因此,使用在桌面和移动设备上都表现良好的CDN很重要。

    小结

    虽然通过搜索排名分析文章,我们知道页面速度与谷歌搜索引擎排名关系不大,但是页面速度的快慢会影响用户页面停留时间跳出率,搜索引擎爬取页面等。

    如果页面速度过慢,相信也会间接影响搜索引擎排名,总而言之,更快的网站速度,绝对是利,而非弊。

  • 宝塔面板7.7版本-原版安装脚本

    宝塔面板7.7版本-原版安装脚本

    前言:

    最近宝塔面板升级到了7.8版本,违背了宝塔开源协议,竟然在免费版的源码里面加入了加密的授权验证模块。除此之外,7.8版本使用各种方法均无法绕过面板强制绑定账号,如果不绑定账号插件就无法下载。

    因此本站特意放出安装7.7指定版本的命令

    CentOs安装命令:

    yum install -y wget && wget -O install.sh https://west2.cn/bt/install_6.0.sh && bash install.sh

    降级到7.7版本命令:

    curl https://west2.cn/bt/update6.sh|bash

    宝塔Windows面板降级到7.2版本命令(需先安装好官方最新版,然后在cmd执行):

    wget https://west2.cn/bt/win/btpanel.py -O C:/btpanel.py && python C:/btpanel.py

    Linux面板7.7.0升级命令:

    curl https://io.bt.sy/install/update_panel.sh|bash

    注释:目前仅支持Linux宝塔面板7.7.0版本,其他版本自测。升级后会变成7.9.4企业版,所有插件可直接安装 美滋滋。

    此版特点:

    1.去除宝塔面板强制绑定账号
    2.去除各种删除操作时的计算题与延时等待
    3.去除创建网站自动创建的垃圾文件(index.html、404.html、.htaccess)
    4.关闭未绑定域名提示页面,防止有人访问未绑定域名直接看出来是用的宝塔面板
    5.关闭活动推荐与在线客服,去除首页企业版广告
    6.去除自动校验文件与上报信息定时任务
    7.去除面板日志与网站绑定域名上报

  • 搭建手游遇到的各项问题-解决宝典

    搭建手游遇到的各项问题-解决宝典

    前言:

    本帖会详细整理大家搭建游戏遇到的各种问题,给予中肯解答与科普。

    声明:本站发布的游戏都是经过测试的,视频为证,百分百可搭建。

    搭建游戏非要用云服务器吗?

    答:服务器现在都是白菜价,像腾讯云阿里云新用户一年2核4G才一两百。我也鼓励大家用服务器,本站所有游戏都是亲测在服务器下搭建的,如果你非要在本地使用虚拟机搭建,请注意原生环境,以及防火墙问题,我不保证虚拟机不会出问题。出现任何问题 跑来问我,说一比一对照视频搭建的,排查到最后结果发现你是虚拟机,就挺无语的。

    服务器防火墙必须关闭吗?

    答:搭建任何游戏,不管你是Linux还是windows必须要关闭防火墙,不同系统有不同系统的关法,本站每款游戏附带的视频教程都会有教你如何去做,不关游戏会出现联网失败等问题。

    游戏非要开放所有端口吗?

    答:每款游戏的搭建教程开头我都会讲,让大家开放1-65535端口,一般国内IDC厂商都有安全组这项功能,游戏服务会占用若干端口实行数据通信,所以必须要开放!若你不放心,可以先把游戏搭建出来,再通过查询端口开放命令,去验证你当前搭建的游戏具体占用了什么端口,给它们单独放通。1-65535全部放通规则就可以关闭了。

    GM后台可以访问,但游戏进不去

    答:出现这种现象,你需要检查服务端的IP修改是否出现遗漏、修改错误的、客户端也同样。

    游戏能获取到公告,但进入不了

    答:服务端没修改好,或没成功启动。

    游戏明明可以玩,可过了一阵子就进不去了:

    1.可能你用了域名做解析,但很可惜,你服务器一定是国内的。由于域名没备案,所以被你所在的服务商限制域名访问了,你搭建好的游戏自然无法进入。我一般会建议大家在选购服务器的时候使用香港地区,这样即使你需要用域名做解析,也不受备案限制。
    2.检查你服务器当前的资源占用,尤其是内存。超过90%占用基本能断定是服务器超负载,游戏进程出现异常退出。这个时候你需要停止服务端,给服务器适当的加Swap虚拟内存,再重新启动游戏服务端。

    GM后台用不了,邮件发送失败:

    1.要么你把角色名输入成游戏账号了,有的游戏是输入ID,细心点 一般是没看仔细导致的。
    2.你把GM密码改了,但又没把要修改的地方改全,导致改了一半。
    一般修改GM密码的路径在WEB目录/GM/user/config.php下,每个端不同,可能会有差异。

    模拟器能安装,安卓真机却安装不了:

    答:出现这种问题,一般是你客户端没签名上,换个签名工具签个名即可。模拟器安装app不需要有签名都行,所以自然能安装。

    反编译工具报错用不了:

    答:我还是推荐你们安装JAVA8的版本,在应用变量中配置好JDK环境就可以了。以APKtool为例,有个别小伙伴跟我说过他电脑JDK环境配置正常,反编译过程就是出现乱码。乱码是电脑环境问题,我没遇到所以无法排查,实在不行你用MT管理器去编译签名就好了,它不依赖电脑环境,全程在安卓系统下工作的。

    游戏搭建好移动宽带下能玩,电信宽带下不行:

    答:没有这样玄学的事,那是你DNS留下的内容缓存,刷新一下DNS再尝试。搭建游戏跟用什么网络没有直接的关系,你用星链上网都一样。

  • AWS认证之路

    AWS认证之路

    AWS云服务产品简介

    AWS云服务的产品非常丰富(如下图所示),你不可能对每种产品都了如指掌,而是在解决某个具体的问题时会了解相关的产品。因此,你最起码要知道几个大的分类(比如计算类、存储类、工具类等等),了解每个分类都有哪些产品,以及产品的特点和适用范围,才能开始使用云计算技术。下图只是简单地列出了常用的AWS服务,实际上AWS提供的服务多达150多种,因此,一个较为明智的做法是学习常用的服务,而对于那些不常用的服务(比如远程桌面服务、语音服务等等)需要用的时候再去了解。

    下面这张图将一些常用的服务结合在一起解决某个问题,这种方式能够进一步帮助你记住这些常用的服务,因为它们之间是有关系的,比如下图用到了存储服务、缓存服务、数据库服务来存取数据;用到了计算服务来运行程序;用到了网络服务来隔离外界威胁;用到了负载均衡服务来分配负载。每种服务的功能非常单一,往往需要结合具有其它能力的服务,才能构成一个完整的解决方案,比如计算服务运行的程序需要持久化存储数据,此时,计算服务会调用存储服务所提供的存储能力。

    本文将按照以下几个部分来介绍云计算入门知识,如果你阅读完本文,想进一步加深对云计算的认识,那么这个系列的文章将不容错过。

    • 区域(Region)和可用区(Available Zone)
    • 虚拟机服务-EC2
    • 存储服务-S3、EBS和EFS
    • 关系型数据库服务-RDS和Aurora
    • 缓存服务-ElasticCache
    • 内容分发服务-Cloudfront
    • 路由服务-Route 53
    • 私有网络服务-VPC
    • 负载均衡服务-Elastic Load Balance

    区域(Region)和可用区(Available Zone)

    在介绍常用的AWS服务之前,需要说明一点的是:AWS服务分布在全球多个位置。这些位置由地区和可用区构成。每个地区是一个单独的地理区域(Region),每个区域由多个相互隔离的可用区(Available Zone)构成。有的服务在某些Region是不提供的,而且Region之间是完全隔离的,它们之间通过高速光缆连接,不过Region之间传输数据是需要收费的。AWS目前所提供的区域如下图所示:

    比如美国东部有2个区,它们分别是:US East(N. Virginia)和US East(Ohio)。每一个区都有对应的区域代码,比如US East(N. Virginia)的区域代码是:us-east-1,可用区由区域代码后跟一个字母标识符表示;例如,us-east-1a,其含义是指区域US East(N. Virginia)中的可用区是a。如果你使用EC2服务,那么会用到可用区。

    虚拟机服务-EC2

    EC2(Elastic Compute Cloud)是AWS非常基础的服务,它的主要功能是提供计算能力。比如,你可以通过AWS Console创建一个EC2资源,它是一台虚拟机,上面运行着OS。在创建之前,你可以选择运行哪种OS,以及为它分配一定大小的EBS,它就像是一台真实的物理机,可以运行程序,拥有虚拟的CPU和内存,同时也可以为它分配IP地址,让它和其它计算机通信。你可以根据具体的需求来创建多个EC2资源,它们可能运行在一台物理机器上也可能分布在多台物理机器上。

    EC2服务是AWS的基础服务,AWS的其它服务都是以EC2服务为基础,因此,你可以想象到AWS内部实际上是由大量计算机联网而成,并将这些硬件虚拟化,最终生成了上百万台虚拟机,其中,一部分虚拟机直接用于构建AWS的其它服务,而其余的虚拟机则提供给企业或个人,他们不再需要这些虚拟机时,便将其释放,让其他人使用。

    存储服务-S3、EBS和EFS

    直到今天,几乎所有的线上服务都需要存储数据,这些数据包括用户信息、图片、歌曲、视频等等。为了能够有效地存储和读写数据,那么需要编写一些程序专门用于解决存储问题,因此AWS专门提供了S3(对象存储)、EBS(块存储)和EFS(文件存储)存储服务,专门用来存储不同类型的数据。每种服务都有不同的用途、计费方式以及存储方案,以下是每一种存储服务的区别:

    Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务,它是基于Key-Value的方式来存取数据。你可以为数据分配一个key,然后把它存储到S3里,也可以通过这个Key从S3中获得该数据。S3里存取数据的单元是对象,每个对象除了数据本身,还包括描述该数据的元数据(比如该文件的大小、创建时间等等)。假设你向S3中存储了大小为23KB的文件,那么S3中将有一个对象,包含了元数据和文件本身的内容。

    S3经常用来存放一些静态资源文件,比如CSS、Javascript、图片,视频等等。大家经常看到B站上的视频,其实也是可以存到S3上的,而且S3是具备无限存储能力的。除此之外,互联网公民也可以直接访问到S3上的数据。

    Amazon Elastic Block Store(Amazon EBS)是块存储服务,这种块存储服务一般会挂接到EC2实例上使用,有点类似于硬盘,但是会占用网络带宽。它具有持久化和快速读写的存储能力,其存储的单元是基于块的,如上图中间的(Block Storage)。它无法直接被互联网访问,其常常用于存储经常要用到的文件,比如系统的驱动程序。

    Amazon Elastic File System(Amazon EFS)是文件存储服务,这种存储服务可以同时挂载到多个EC2实例上,当数据量变多(变少)时,它会自动增加(缩减)存储空间,以便容纳更多(更少)的数据。EFS非常适合内容管理系统(CMS),比如WordPress上的内容可以存储在EBS上,然后由多个EC2实例读取。管理员只需要更新或添加新的内容到EFS上,那么所有的EC2实例将会得到同一份内容,这一点在EBS上是做不到的,因为每一个EBS同时只能挂接到一个EC2实例上。

    关系型数据库服务-RDS和Aurora

    RDS是关系型数据库服务,你可以使用该服务创建关系型数据库实例,并直接使用它来存取结构化数据。RDS支持多种数据库系统,比如常见的有MySQL、SQL Server、Oracle、PostgreSQL等。使用RDS的一个好处是,AWS会帮你安装、维护、升级和备份数据库实例,你只需要往里填充数据即可。

    Amazon Aurora是AWS自己研发的关系型数据库系统,它兼容MySQL和PostgreSQL,它与RDS相比有以下优点:

    • 可伸缩地读取数据: Aurora具有一个主数据库读写数据,最多有15个影子数据库用于读取数据。这些影子数据库专门只支持读操作,为主数据库分担了读取数据的压力,而且这些影子数据库与主数据库共享存储单元。
    • 具有持续备份和定点恢复的能力: Aurora能够在不为人知的情况下持续将redo log streams存储到S3上,通过存储在S3上的redo log streams你能够指定数据库恢复的时间点。
    • 快速克隆: Aurora能够快速实现深度拷贝

    总之,Aurora提供了工业级数据库的服务,这个服务能够自由地根据使用者的要求进行伸缩扩容,增强数据库的容错能力,将数据灾害降到最低。可以参考这篇论文进一步了解Aurora。

    缓存服务-ElasticCache

    ElasticCache是AWS提供的具有弹性的缓存服务,它支持Redis和Memcached缓存系统。用户可以基于它来打造数据密集型应用或者提高数据吞吐性能,因为它是基于内存操作的。它经常用于缓存用户经常使用的数据,由于这些数据是存在内存的,因此存取数据的时间非常短,这进一步降低了用户访问延时,也减轻了数据源的压力。

    内容分发服务-CloudFront

    CloudFront是内容分发服务,也就是业内常说的CDN。它分布在欧洲、亚洲、北美、澳洲、南美、美国等多个主要大城市,由107 个网络边际服务点构成并提供服务。

    它可以缓存信息源,让互联网公民从最近的边缘节点获取信息,从而降低延时。除此之外,它能为你的服务分担一些压力。你可以让它把你的内容分发到全球,也能限制在某一个区域。它容易使用,能够与其它AWS服务集成在一起。

    Route 53

    “Route 53″,中文可以翻译为53号公路,跟美国历史上有名的”66号公路(如下图)”(Route 66)遥相呼应。利用Route 53服务,AWS的用户就可以让终端用户访问众多的互联网服务了。所以”Route 53″就像一条虚拟的公路一样,把终端用户带领到目的地。Route 53的服务器分布在全世界各地,也是亚马逊唯一保证100%可用性的服务。DNS协议是基于TCP/UDP协议的,DNS服务监听的端口是53。所以名字里带53,暗含了DNS服务监听的端口。

    就像66号公路横穿美国一样,Route 53的作用在于它能够快速地将终端用户带到其想要访问的互联网服务,缩短了终端用户与互联网服务的延迟。

    VPC和NAT

    VPC是AWS提供的一种虚拟网络服务,一些AWS资源可以放在这个虚拟网络里,最终构成一个整体,向外界提供服务。当你使用VPC服务时,需要为它创建Gateways、Route tables、 Network access control lists (ACL)、Subnets以及Security groups等,它们一起控制着这个虚拟网络。

    关于VPC,以下几点是注意的:

    • VPC可以包含多个不同可用区的资源,也就是说VPC是跨可用区的
    • VPC中的子网(subnet)只能属于某一个可用区
    • VPC之间不具有传递性,也就是说你不要指望通过VPC 1来访问VPC 2,如果要访问VPC 2,那么只能直接访问VPC 2

    为什么使用VPC?当你在公有云上运行一些服务时,世界上任何一个人都能够访问这些服务,因此这些服务非常容易受到攻击。为了保护这些资源,你需要VPC来切断它们与外部的连接,通过VPC来限制外部连接的类型,IP地址以及哪些人能够访问。通过限制外部范围,你便可以阻止不速之客的访问,也避免了DDOS攻击。由于大部分服务是不需要与外部连接,因此你可以把这部分资源安全地放在VPC里与外部隔绝,而只需要把那些需要与外部互联的资源暴露出去。

    有时,你想让VPC中的某些资源暴露给外界,因为它们是外界访问VPC资源的唯一入口。而有时,你希望外界不允许直接访问某些资源,但这些资源可以访问外界(比如你想升级程序,下载补丁之类),此时,你需要使用NAT Gateways服务。

    NAT Gateways用于解决VPC内的私有资源访问外界的问题。它在VPC的一个公有子网中创建,这个子网是公开的,但是数据流向由内往外,因此一旦你允许私有资源访问NAT Gateways,那么该资源就能够访问外网,由于NAT Gateways不支持外网向内网访问,因此外部网络是无法访问该私有资源的。

    ELB和Auto Scaling

    AWS Elastic Load Balancing(ELB)是负载均衡服务。它可以把负载均匀地分发给多个不同的EC2实例,从而使得处理负载的能力能够横向扩展。它的整个过程如下所示:

    1. 用户在浏览器里输入并按下回车键
    2. 访问该页面的请求通过互联网最终到达ELB
    3. ELB将这个请求转发给任务量少的EC2实例
    4. EC2实例处理该请求,并将生成的页面放回给ELB
    5. 浏览器接收到ELB返回的页面

    分配策略有很多种,比如常见的有轮询、基于IP地址、HASH、随机分配等等,每种策略均有一些局限性,因此需要结合实际的场景来选择。

    AWS Auto Scaling是监控服务,它能根据一些条件来增加或减少EC2实例,从而获得弹性能力。比如,你有2个EC2实例,它们正在接收并处理请求,在某一段时间,请求突然变多,它们的处理速度变慢了(原因在于任务量多了!),此时,Auto Scaling会监测到速度慢的问题,因此,它自动地启动新的EC2实例来处理请求。同理,当请求的数量变少了,Auto Scaling会自动销毁多余的EC2实例。这种特点经常被称为Elastic(弹性),AWS提供的一些云服务会自带这种能力,比如S3,Aurora等均具备弹性存储的能力,而ELB具有弹性负载均衡的能力。

    AWS CloudFormation

    CloudFormation是一种Infrastructure as Code服务,它允许研发人员以脚本化的方式创建云计算资源,最终实现自动化部署。几乎所有AWS服务都可以通过CloudFormation来驱动,但是你必须学习它的语法,然后编写脚本,最后提交到CloudFormation。你提交的脚本有点类似于在餐厅的菜单,而CloudFormation类似于厨房,服务员帮你把菜单提交给厨房,经过一段时间后,你要的饭菜出炉,服务员再将其端到你面前。关于CloudFormation的具体细节,你可以参考这篇文章。

    然而CloudFormation似乎做得并不友好,在业内也不受欢迎,开发者们更喜欢使用Terraform工具。为了让开发者们能够高效地使用CloudFormation服务,AWS也发布了另外一个工具CDK。这个工具的好处是让开发者使用熟悉的编程语言来编写基础设施代码,然后再将其转化成CloudFormation脚本。除此之外,AWS专门为Serverless资源提供了另外一个工具SAM,开发者可以使用它来创建Serverless资源,但需要提供对应的脚本。实际上,这些脚本最终会转成CloudFormation脚本,并交给CloudFormation服务。

    使用云计算技术的最佳实践之一是以Infrastructure as Code方式来创建云计算资源。这种方式能带来的好处是可以实现版本控制和自动化部署,你会经常使用Python、Shell、Terraform、Docker以及K8S等工具来创建各种云计算资源,它们均支持和提倡Infrastructure as Code。

    结论

    前面,我列举了一些常用的AWS服务,并介绍了一些云计算概念、每个服务的用途以及最佳实践。在这些服务当中,EC2是必须要掌握的,因为它是所有服务的基础。除此之外,几乎所有云计算服务提供商均有类似的服务-统称为虚拟机服务,因此你学会了EC2服务,就能熟练使用其它云服务提供商提供的类似服务。

    你还需注意,AWS根据地理位置划分了几个区域,比如在美国有2个区,中国也有2个区等。有的云服务是受区域限制的,比如EC2服务是有区域概念的,当你创建EC2资源,它们会运行于某个区。如果你需要为日本的互联网公民提供服务,那么你应该选择东京区域来创建云计算资源,因为在东京区域的资源离东京网民更近,因此能提供更好的性能。

    Infrastructure as Code是使用云计算技术的最佳实践之一。你应该在第一天就要有这种概念,并学会适应它。你可以使用Terraform工具来创建云计算资源,一旦你学会了如何使用Terraform,就会对它爱不释手。

    最后,本文所介绍的内容非常基础,并无法让你正确使用每一种服务,原因在于每个服务均有对应的细节和最佳实践,你需要对每一个服务用上一段时间,才能更好地使用它们。参考部分的链接是我精心挑选的,能够帮助你进一步了解和学习云计算技术,它们绝对不会让你失望!

  • PHP 使用 $_POST 提示 Undefined array key 怎么办?

    PHP 使用 $_POST 提示 Undefined array key 怎么办?

    前段时间换了一个服务器,顺便把PHP也升级了一下,升级成了 PHP8.1 了。结果因为 PHP8.0 之后 对于语法要求更严格了,出了各种错误。

    其中一个就是类似于下面这样的警告提醒:

    PHP Warning:  Undefined array key “xxx” in demo.php line 10

    意思就是 数组键值未定义 的一个警告。

    我看了,其实里面用了一个 $_POST 获取表单的内容,就是类似下面这样的代码:

    $x= $_POST["xxx"];

    如果 xxx 不存在的话,就会报错。正常情况下,如果有数据提交,就获取 xxx 内容。没有数据提交 $x 就是空值。

    但是在 PHP 8 下面,这就会出现警告。

    其实我们把这个改一下就可以,先判断是否存在 Post 请求,如果有再获取内容。

    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        $x = trim($_POST['xxx']);
    }

    这样,就不会有警告了。

    补充:如果用 $_GET 的时候,也会遇到同样的错误,解决方法:$_GET 提示 Undefined array key 错误的解决方法

    再解决 $_GET 错误提示的时候,遇到一个变量未声明的错误提醒:

    PHP Warning:  Undefined variable $x in demo.php on line 1010

    可以在前面做一个初始化:

    $x = "";
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        $x = trim($_POST['xxx']);
    }

    先把 $x 初始化为空值,这样后面就不会出现警告提示了。