我最近写了一篇名为 关于“未用 CSS”工具的真相 的文章,在这篇文章中我尝试列举任何工具在寻找真正“未用” CSS 时所面临的所有挑战。 主要思想是,CSS 选择器匹配 DOM 中的元素,而 DOM 中的这些元素来自各种来源:您的静态模板、基于服务器端状态的动态模板,当然还有 JavaScript,它可以以任何方式操作 DOM,包括从 API 和第三方拉取内容。
在所有这些因素的影响下,任何工具如何才能真正准确地展示未用 CSS,从而使实际删除这些 CSS 不会像保留它们一样危险?
所以,我说
然而,我不认为这些工具毫无用处——它们只是……工具。 它们的用途实际上可以成为改善代码的积极步骤。 它们的用途表明好的,我承认,我有点害怕我们的 CSS。 您可以使用此工具来大致了解未用 CSS 可能是什么,然后将此信息与您对 CSS 代码库的了解结合起来,做出更明智的决策。
我坚持这一点,并且值得指出一些成功的用例。
Sarah Dayan 刚刚写了一篇文章名为 如何使用 PurgeCSS 减少 250 KB 的无效 CSS 权重。 她在使用 Tailwind CSS,这是一个原子 CSS 库,许多人都成功使用过它。
在我的情况下,我不仅加载了整个 Tailwind CSS 库,而且还为某些模块添加了一些变体。 最终,这导致最终的压缩 CSS 文件大小为 259 KB(在 GZip 压缩之前)。
使用 GZip 压缩后它只有十分之一大小,但仍然很多 CSS。 Tailwind 建议使用 PurgeCSS,而这正是 Sarah 所做的事情。 PurgeCSS 不会处理我提到的任何事情,例如状态变化、JavaScript 等等,但它会查看您希望它查看的所有静态文件——包括内容和 CSS——并根据这些内容进行分析。 更好的是,Sarah 知道她有一些第三方内容正在运行,因此她专门处理了这种情况
PurgeCSS 无法检测到我需要保留诸如
.ais-Highlight
之类的选择器,因为使用它的组件仅在运行时显示在 DOM 中。
因此,她将其中一些 CSS 分开并更新了配置。 然后……
使用此新配置,我的最终 CSS 文件大小从 259 KB 变成了……9 KB!
我喜欢它。 使用这个工具,非常清楚地了解您网站上发生的事情,并最终做出选择,共同取得胜利。
Sarah 还提到了未用 CSS 的这个概念在精神上与未用 JavaScript 的概念相关。 在 JavaScript 中,它被称为树摇,而 正如 Jeremy Wagner 所说
树摇是一种死代码消除的形式。
我更加隐式地信任树摇的工具。 这些是用 JavaScript 编写的工具,用于查看 JavaScript 以发现未使用的 JavaScript。 当谈论树摇时,技术之间的交叉似乎并不那么广泛。 不过,也可能存在一些配置后的第三方内容,它们会在您的网站上调用公共函数,或者直接在 HTML 元素上调用事件处理程序。 如今,在我看来,这些东西似乎比较少见,但这只是我个人经验的偏差。
因此,我们发布了这篇文章,第一个回复是……直接使用这个!
https://uncss-online.com/
这个工具确实非常酷,但它根本无法解决我试图谈论的最基本问题。
就像我在我的原始文章中所说
本周我看到人们疯狂分享的一个工具是这个
https://unused-css.com/
一年只需 756.00 美元即可获得高级计划。
我可能错了,但从 259 KB 中减少 250 KB,我忍不住想,这个 CSS 框架从一开始就不值得使用。
虽然我不是 Tailwind 的狂热粉丝——我个人不喜欢原子式 CSS 的人体工程学——但我认为在这种情况下的确值得为它辩护。
Tailwind 的设计并非真正要完整使用。 它更像是一个库,生成您可以选择性地从中提取的类,并对其余部分进行树摇/配置以将其移除。 实际上,您可以将其配置为生成 2 KB 的类,或者远远超过文章中提到的 250 KB。
对于一个库来说,这实际上是一个相当酷的概念,并且与未用 CSS 的这次讨论非常契合。
我认为,这类工具在某些情况下确实很方便,但它仍然没有从根本上解决问题。 我觉得,随着各种可以“解决”他们自己造成的问题的工具出现,开发人员变得越来越懒惰。
几天前,我读到了一篇关于 css-in-js 问题的文章,他们遇到了缓存问题,因此解决方案是使用 gulp 工具收集并提取所有 js 文件中的 css,并创建一个 css 文件以实现更好的缓存。 这简直是 WTF? 我个人认为,这类工具属于同一类别。 开发人员变得懒惰/使用错误的工作方法。
确实,PurgeCSS 无法解决所有问题。 虽然准确性很高,但我目前不建议在不知道其在项目中的作用的情况下使用它。
PurgeCSS 仍然是一个年轻的项目,正在不断发展。 它旨在实现 100% 的准确性,并且还与 javascript 生成的类一起使用。
曾经有一段时间,我将 UnCSS(类似于 PurgeCSS)与 BackstopJS(视觉回归测试)一起使用。
我首先设置了 Backstop,并对我的所有模板进行了测试。 然后,我运行了 UnCSS 以及另一个 BackstopJS 测试。 如果有任何变化,BackstopJS 会通知我。 由于唯一变化的是将 UnCSS 添加到管道中,如果出现任何错误,我知道可以转而解决这些不必要的变化。
我能够以一定程度的信心删除未用的 CSS。 这两种工具很好地互补了彼此。