掌控 WordPress 插件加载的 CSS/JS

Avatar of Chris Coyier
Chris Coyier 发表

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 200美元免费额度!

前几天在 ShopTalk 上,我们遇到的一个问题让我们在 WordPress 插件、它们加载的资源以及在一个理想世界中这些资源会是什么样子等方面进行了一段简短的讨论。我最终 写下了一些想法 并得到了一些反馈。我认为它得出了一个比较令人满意的结论,所以我想把它写出来。

一些插件的工作原理

让我们以一个现实世界的例子为例。 WP-Polls 插件。我认为这是一个不错的插件。在投票方面做得很好。我在 CSS-Tricks 上也使用它。

为了在您的网站上放置这些投票,它需要一些 JavaScript 来处理功能(例如,投票和在不刷新页面的情况下查看结果)以及 CSS 来为投票小部件(结果条等)设置样式。

它添加 CSS 的方法是通过 wp_head() 钩子注入一个样式表,将其放在 <head>

<link rel='stylesheet' id='wp-polls-css'  href='http://example.com/wp-content/plugins/wp-polls/polls-css.css?ver=2.67' type='text/css' media='all' />

它添加 JavaScript 的方法是通过 wp_footer() 钩子注入一个脚本,将其放在文档底部附近

<script type='text/javascript' src='//example.com/wp-content/plugins/wp-polls/polls-js.js?ver=2.67'></script>

这很有道理。这是他们使此插件正常工作需要做的事情。插件作者需要确保他们的插件易于使用且有效

作为一名关注性能的开发者,我想合并脚本和样式。

现在,我们在页面上加载了这两个单一用途的资源。当您深入研究 Web 性能以及如何加快网站速度时,您听到的第一个建议之一就是合并资源。一个非常好的经验法则:网站需要加载的资源越少,速度就越快。

合并资源并不是只有最顶尖的网站才需要担心的一些晦涩难懂的事情。这是每个网站都会遇到的问题。人们已经用无数种方法解决了这个问题。CSS 精灵就是关于合并图像资源的。图标字体和 SVG 精灵正在解决同样的问题。CSS 预处理器可以帮助您合并样式表。Rails Asset Pipeline 可以帮助您合并资源。有大量的 Grunt 和 Gulp 插件专为此设计。

但我们在这里处于 WordPress 环境中,所以我们有针对这种情况的解决方案。

插件本身应该提供帮助吗?

我想到的第一个想法是,插件应该允许我们从它们自己添加的 UI 中取消排队任何它们排队的元素。甚至 可以做到 为您提供它们本来要加载的资源,以便您轻松地复制粘贴到自己的系统中。

我现在认为这有点误导。要让 WordPress 插件世界发生这样的转变,需要一场重大的运动。即使真的发生了,那也是很多重复的工作,而且这个问题可以更有效地解决。

解决方案 #1:使用插件

插件 MinQueue 提供了一个我喜欢的解决方案。它不会自动执行任何操作,它允许您配置要合并的资源以及合并顺序。

启用插件后,您将在前端的管理栏中看到一个可以点击的小助手链接。

在我们的演示中,我知道我想将主题的 CSS 和 WP-Polls CSS 合并在一起。因此,我从助手那里获取这些名称,并将它们放入插件设置中的新“队列”中。

现在,这两个 CSS 文件都不会单独加载了。MinQueue 创建了一个组合(并缓存)版本并提供服务

<link rel='stylesheet' id='minqueue-117c22aa-ebc80003-css'  href='http://example.com/wp-content/uploads/minqueue-cache/minqueue-117c22aa-ebc80003.css' type='text/css' media='all' />

您可以创建多个“队列”,这为您提供了良好的控制。例如,也许您网站的某个部分加载不同的资源,如果需要,这些资源可以单独合并,您不需要将它们与主组合并。

请注意,这意味着您需要 排队 主题的样式表,但这很容易。

还要注意,流行的 W3 Total Cache 也执行合并,但我发现它有点令人困惑。您通过 URL 添加样式表,它似乎有点过于基础并且容易出错。

解决方案 #2:手动取消排队资源并自行合并

添加资源的插件通过 wp_enqueue_script 和 wp_enqueue style 来实现。您可以深入研究它们的插件代码,找到它们执行此操作的位置,以便您可以查看它们在执行此操作时应用的名称。然后,在您自己的主题的 functions.php 文件(或自定义功能插件)中,您取消排队它们。

Justin Tadlock 有一篇关于这方面的文章,您可以阅读。取消排队一个样式表的简单示例

add_action('wp_print_styles', 'my_deregister_styles', 100);

function my_deregister_styles() {
  wp_deregister_style('name-of-style');
}

现在,您需要自己找到该资源并将其合并到您仍在页面上加载的 CSS 中。也许您正在使用 CSS 预处理器,并且您可以 @import 它。也许您正在使用像 Grunt 这样的任务运行程序,并且可以将其添加到要获取和合并的文件列表中。或者完全手动操作,只需将它的内容复制粘贴到您自己的样式表中(只是要注意,如果您这样做,当插件更新时,您将无法获得更新)。

解决方案 #3:使用插件来取消排队资源并自行合并

虽然我能够深入研究插件的代码来查找排队资源的实例,但这对我来说似乎不是一个很棒的方法。我宁愿以编程方式执行此操作,使其更简单并减少人为错误。

在之前围绕此问题进行的讨论中, Nate Wright(来自 Theme of the Crop)为此开发了一个全新的插件,名为 Asset Queue Manager。它有一个用户界面,您可以(从前端)使用它来轻松取消排队资源。

从网站的前端,您可以在管理栏中点击一个链接以显示该页面上所有排队资源的下拉列表。

有一个按钮可以取消排队该资源。该插件将一直保持该资源取消排队,直到您说否则。现在,您需要再次将它合并到您的样式表中,无论您希望如何。那里还有一个按钮直接链接到资源,使其超级容易找到。非常酷!

结论

有很多方法可以控制 WordPress 插件加载的 CSS 和 JavaScript。您可以并且应该这样做,并且随着每个未合并资源的增加,紧迫性也会增加。

每种类型的资源文件可以加载多少个? 一、二或三。