假设从深处(阅读:潜在未来网络技术规范的早期编辑草案)传来一些声音,表明了一些潜在的未来代码语法。 假设该语法看起来非常棒,我们希望现在就能使用它。 这就是如今一些预处理背后的理念。
由于这种预处理方式具有“编写未来代码并将其转换为今天的代码”的感觉,因此人们通常将其称为**后**处理。 我认为这充其量是愚蠢的,最坏的情况是令人困惑。 我将继续称其为预处理。 该过程与预处理完全相同:您使用特殊语法编写代码,它在构建步骤中被处理成常规 CSS,常规 CSS 是网站使用的。 **预**处理。 我认为“后处理”更适合诸如 -prefix-free 或其他客户端 polyfill 之类的东西。
CSS 中关于未来语法预处理的讨论与关于 PostCSS 的讨论相关。 但 PostCSS 本身并没有做太多 CSS 转换。 David Clark 这样解释
[PostCSS] 不会改变您的 CSS。 插件可能会这样做。 也许不会。 *PostCSS 插件可以对解析后的 CSS 做几乎任何他们想做的事情。* 一个插件可以启用变量,或其他一些有用的语言扩展。 另一个可以将所有 as 更改为 ks。 另一个可以在您使用 ID 选择器时发出警告。 另一个可以在您的样式表顶部添加共济会 ASCII 艺术。 另一个可以计算您使用 float 声明的次数。
因此,未来语法预处理并非直接来自 PostCSS,而是来自 PostCSS 插件。 其中有一个插件特别关注这一点:cssnext。 cssnext 实际上是一组 PostCSS 插件,它们都专注于未来语法预处理。 但 cssnext 并非孤军奋战。 还有其他预处理器和插件以类似的方式运行。 在 JavaScript 方面,像 Babel 这样的预处理器处于同一位置。
我认为关于未来语法预处理的想法存在一些问题。
**但为了在开始之前澄清:**您做您想做的。 如果您使用并喜欢这种预处理方式,那很好。 欢迎在评论中谈论它。 而且,如果您参与了这些预处理项目的开发,那太好了。 您可能比我更能帮助网络,因为您允许人们尽早使用未来语法。
我们在 CodePen 上 支持 PostCSS(包括 cssnext)。 我们在 CodePen 上 支持 Babel。 我最不想做的事情就是阻碍想法。
我只是认为这里有一些值得考虑的事情,这些事情可能会给那些选择将它们用于真实、长期、生产产品的人带来麻烦。 至少,这是一个值得讨论的话题。
一个微小的例子
冒着陷入一个样本的风险,这里有一个关于未来语法预处理如何在 CSS 中工作的例子。 这就是 CSS 变量 现在的样子,处于**编辑草案**阶段。
:root {
--brandColor: #F06D06;
}
.main-header {
background: var(--brandColor);
}
有很多 CSS 预处理器™ 可以为您处理它。 结果可能是
.main-header {
background: #F06D06;
}
问题 #1:未来语法更改
Firefox 实际上正在发布支持上述原生 CSS 变量示例的功能。 但他们必须 进行一些编织。 它首先在 v29 中使用 var- 前缀而不是 -- 出现。 **但随后规范发生了变化。** 因此他们不得不更改实现。
这意味着支持此功能的 CSS 预处理也必须进行一些编织。 这意味着预处理器作者需要进行一些艰难的更改和分叉。
预处理器开发者可以选择什么
- 您是否支持新的语法更改?
- 是 = 保持作为未来语法预处理器的精神。
- 否 = 现在您只是一个基于孤立语法的预处理器。
- 您是否也支持旧语法?
- 是 = 存在令人困惑的语法的风险,以及必须以多种方式处理事物的臃肿代码库。
- 否 = 您将破坏人们的代码。
并非都是好选择。 当 cssnext 面临变化时,他们 首先输出警告,然后在下一个版本中弃用旧语法。
cssnext:以前 @custom-selector 在有和没有伪语法 ':' 的情况下都可以工作。 现在您必须使用 '@custom-selector :–{name}' 语法而不是 '@custom-selector –{name}'。 在下一个主要版本中将删除对没有 ':' 的语法的支持和此警告。
预处理器用户可以选择什么
如果您是未来语法预处理器的用户,您必须接受您将面临随机出现的破坏性更改。 这与大多数其他预处理器的运作方式相矛盾,在其他预处理器中,语法是人为制造的,并且*故意与*原生 CSS 语法(未来或现在)*不同*。
- 您是否将代码更新到新的语法? 如果预处理器开发人员弃用旧语法,您要么必须更新代码,要么永远不更新版本。
- 您有选择吗? 如果预处理器开发人员坚持使用旧语法或支持两个版本,您可以保留代码不变。 您必须决定您对新语法的投入程度。 如果开发人员只使用新语法,您必须决定是更新代码还是放弃并停止使用该特定预处理部分。
问题 #2:某些功能无法复制
我们一开始提到的 CSS 变量示例也可以说明这一点。 原生 CSS 变量在浏览器中的工作方式与在最终 CSS 中简单地用值替换变量名不同。 使用原生 CSS 变量,如果您使用 JavaScript 更改变量的值,则引用该变量的所有内容都会相应更新。 它以一种用静态代码替换这些值无法实现的方式保持动态性。
CSS calc() 是另一个例子。 您不能简单地将所有 calc() 实例替换为处理后的值。 预处理器无法知道 100% - 20px 的计算结果。 浏览器需要评估它,并在环境发生变化时不断评估它。 如果您只需要进行一些静态计算,您可能应该直接进行计算,而不是将它放在 calc() 中。
用于 calc() 的 PostCSS 插件 很聪明,因为它“在可能的情况下减少 calc() 引用。” – 这意味着,如果您写的内容*可以*是静态的,它就会将其设为静态的。 这说明了虽然我们在这里进行了一次范围广泛的讨论,但关于特定项目上使用情况的讨论范围会更窄,重点是特定插件如何解决您遇到的特定需求。
用于 分离转换属性 的插件特别说明
一旦这些新属性在本地得到支持,您也可以使用它们对多个规则的转换进行样式设置,而不会覆盖先前规则的转换。 不幸的是,我无法在不知道您的 DOM 的情况下预测您的 CSS 规则将如何继承。 因此,目前无法模拟此特别有用的功能。
因此,如果您现在开始使用它,您将无法获得该语法存在的首要好处。 而且,当您删除插件时,代码的功能将完全不同。
并不是说该插件不好。 它确实做了一些好事。 它使创作更直观。 它使版本控制差异更有用。 它向浏览器功能实现者发出信号,表明人们对此很感兴趣。 它修改代码以使用最有效的技术。
只是感觉有点危险,而且如果您走这条路,最好知道自己在做什么。
问题 #3:切换
如果您使用未来语法处理器的理由是您认为总有一天您可以放弃预处理器并拥有完全有效的 CSS,那么这将很困难。 它实际上可能会延迟那一刻。 假设您想开始实际发布一些未来语法代码,因为一些浏览器开始支持它。 但是您的预处理器仍在处理它,而且您无法删除预处理器,因为很多浏览器还不支持它。
也许预处理器可以开始输出既包含未来语法又包含回退的代码?也许这不可能?也许是因为开发人员没有响应或不感兴趣?
如果未来语法永远不会出现怎么办?那么切换可能永远不会发生。
我个人对永远不切换感到满意。我认为一定程度的 CSS 抽象(预处理步骤)总是很有意义的。无论如何都需要构建步骤(连接、压缩和其他部署准备),所以最好也进行预处理。
此外,我认为有些概念应该属于语言的抽象,而不是语言本身。变量可以再次作为示例。预处理器变量和原生变量可以共存,并在各自的方式下发挥作用。如果原生 CSS 可以实现预处理器中梦想的一切,它会很慢、很复杂,而且可能不会像 CSS 作为语言那样取得成功。
问题 #4:代码可移植性
我听说过未来语法代码更“安全”的表达方式,因为它“只是 CSS”,因此更便携。这意味着你可以与其他人共享它,在项目之间共享它,更轻松地写下它等等。
如果我们谈论的是当前的原生 CSS,那是正确的。但请记住,PostCSS 是一个庞大的插件生态系统,你通过将你感兴趣的插件拼凑起来来使用它。这意味着任何给定项目都使用不同的插件配置。任何给定的代码块可能在使用不同插件的不同项目中不起作用。或者它可能起作用,如果它只依赖于另一个项目碰巧也拥有的插件。或者它可能会以不同的方式工作,如果另一个项目有不同的插件,但恰好接受相同的作者语法。
与在使用与原生 CSS 不同的通用抽象的系统中编写的代码相比,在这种系统中编写的代码实际上“可移植性更差”。似乎深入参与 Sass 和 CSS 的人都同意这一点。
所以
你怎么认为?我完全错了,这里没有什么可担心的吗?你有任何个人经验可以分享吗?
只有我吗,还是
var(--brandColor);看起来很…不对劲?没错。我完全同意。
这看起来太像 Javascript 的预减语法了。这可能会造成更多混乱。
我也是,W3C 建议了奇怪的语法(但我理解他们为什么要这样做)。这就是为什么 PostCSS 具有用于变量的第二个插件:https://github.com/postcss/postcss-simple-vars
我也是…似乎发明另一种声明和重用变量的方式很疯狂。
我完全同意你的观点,当你有一个由多个分散团队组成的庞大项目时,开发人员之间可移植性的想法是可笑的。你必须将他们锁定在特定的预处理器等等,此外,它还会增加雇佣具有预期技能的员工的负担。所有这些都在你查看 Babel 等程序试图通过预先实现不断变化的规范来预测未来的问题之前。
不过,也有一些优势,因为它们还可以提高开发人员的生产力。另外,像 Babel 这样的项目现在在它提供的功能和功能稳定性方面已经相当巩固,因此在推动它之前,未来语法变化的问题就不那么严重了。所以,如果这些项目的开发者能展现出这种克制,也许问题 1 就会不那么令人担忧了。
可以争论说 Sass/Less 将永远缺乏切换,因为它们在未来实现的想法出现之前就解决了问题,所以它们走自己的方向,不必担心未来语法变化。正如你所说,拥有一些东西来改进 CSS 比什么都没有好。
“calc() 的 PostCSS 插件很智能,因为它“只要有可能就减少 calc() 引用”。——意思是如果你写的东西可以是静态的,它就会使它成为静态的”。
任何这样做的人(实际上是写类似 calc(100px+10px) 的东西)不应该写任何东西,无论预处理、后处理、当前…任何东西!
你太快下结论了。也许你不应该写任何东西。
考虑一下这个,它可以编译成一个静态值
这是使用 CSS 变量进行数学运算的唯一方法吗?正如上面某人所说,语法很糟糕。SCSS 变量和数学语法有什么问题?
width: $sidebarWidth + $contentWidth;
你为什么要使用 calc?
Jon,从技术上讲,你也可以将“SCSS 数学语法”添加到 PostCSS 中,但目前还没有人编写过插件。
我认为 calc() 插件甚至不属于 cssnext,它只是一个优化器。它不模拟 calc() 函数,它只是删除不必要的函数。
我不能像 JS 一样多说 CSS 的故事,但在谈到 Babel 时,他们会采取措施禁用更前沿的功能(ES7/ES2016),使它们成为可选的(参见https://babel.node.org.cn/docs/usage/experimental/)。
这并不意味着某些东西不会改变,但它确实让这种可能性更小了。
然后,在谈到 Babel 和 ES6(或者 ES2015,如果你愿意)时,该规范已经定稿,现在不仅可以拥抱它,而且现在开始使用它来学习新功能也是明智的。
是的,在可预见的未来,我们很可能一直在为 JavaScript 使用预处理器(在 JS 界通常称为转译器),因为很可能总会有“下一个功能”。但是,总有一天,我们可以停止编译 ES5 并开始编译 ES6,然后这些功能将由原生代码处理,等等。
这正是我要写的。
我目前正在为生产使用编写 ES2015 JavaScript。当然,它目前需要使用 Babel(或等效的 [如果有的话])转译为 ES5。
正如你所说,这使我可以编写干净的未来代码。一旦 ES2015 在浏览器堆栈中全部变为绿色,我就可以停止转译它了。
或者更有可能的是,在此期间,我会开始重构代码以使用 ES2016 语法(一旦定稿),并开始从 2016 年转译到 2015 年。
它基本上是一种始终领先于曲线的方法。
谢谢 Chris。
我完全同意你的观点。
在一年前 PostCSS 处于早期阶段(v0.3)时,我开始使用它,并且创建了第一个插件包工具。我一直不喜欢这种未来语法,但我尝试过一些,并且创建了一些模块,因为,你知道,用户需要它。
现在,我认为最佳工作流程是将预处理器与 PostCSS 中的一些模块结合起来。
我个人喜欢后处理器的隐含性(无声地改进 CSS,例如前缀、回退等等)和标准预处理器的显式性(使用它们自己的语言生成 CSS)。这就是为什么我在 Pleeease 中将它们结合起来的原因。
基本上,后处理器替换了 Compass 或 Bourbon 等库。
我认为人们经常忘记的一件事是,如果你开始使用预处理器,将来你永远不会满意简单的 CSS。
因为一旦你想要的所有那些功能都达到了推荐状态,并在所有相关的浏览器中都得到实现,那么就会有一堆新的酷炫功能出现在地平线上,你想要使用它,而这些功能只有借助(新的)预处理器才能实现。
是的。我们一直在使用预处理器,面对现实吧。我不明白为什么这不好。
我使用Myth大约一年了,一直很满意。它似乎可以实现PostCSS + nextcc的所有主要功能,但只作为一个单独的软件包。插件在某些情况下可能很有用,但作为一个单独的软件包,它减少了可移植性的问题。
我认为你的担忧是合理的,但也忽略了重点。语言和工具一直在不断变化。也许有一天,LESS等都会被其他东西取代,项目将不得不更新到最新最好的工具,否则就会被困在使用过时的工具。甚至HTML & CSS 也无法幸免。
但PostCSS & Myth之类的东西提供了保证,即使它们完全被放弃,你的CSS仍然会有价值。因为它是一种“纯CSS”,这意味着总是可以构建或使用替代品,而无需过多考虑兼容性问题。
你认为如果某个预处理器能够使用LESS或SCSS,源代码本身能够在现代浏览器中使用,并且不需要学习其他地方不存在的语法,你会怎么想?
当SCSS消失时,你将别无选择,只能重写所有内容。当PostCSS和类似的东西消失时,你只剩下CSS了。
Myth与cssnext完全相同。它内部使用Rework而不是PostCSS。Myth是许多小插件的插件包,与cssnext 100%相同。
但是Rework现在是一个死项目。因此Myth目前也没有未来。
cssnext类似于Myth,但
是一个活跃的项目
速度快得多
bug少得多
功能多得多
我觉得有些预/后处理器更像是演示用的玩具,而不是生产使用的工具。比如
calc()处理器——如果你的表达式可以在运行前计算,它们根本就不应该放在calc()中,而应该放在Sass/LESS/Stylus/等中。nextcss是否真的使用了CSS的工作草案?在Babel的情况下,它只处理在下一个规范(ES6)中不会改变的代码。我认为nextcss应该只处理不会改变的已达成共识的CSS(最终草案,或任何其他名称)。
但这并不能解决添加预处理器功能的插件堆积的问题。
当然,如果我错了请纠正我。
Babel还支持ES2017的部分内容,甚至更多。这些东西是实验性的,还没有定论。
cssnext是基于草案的。一个
stage标志将很快允许你选择想要支持的级别https://github.com/cssnext/cssnext/issues/100干得好,Chris!
也许cssnext和相关(未来CSS)插件应该根据相关规范的成熟度区分其功能,就像Babel一样——记录每个功能的成熟度,帮助用户限制自己到特定的级别等等。当然,Babel的优势在于ES6/ES2015已经被“批准”,现在已经成为现实,而CSS社区似乎对这些正在考虑的各种CSS草案的状态并不十分清楚。一旦其中一些草案开始接近最终确定,游戏规则就会发生很大的变化,对吧?
cssnext和相关项目非常活跃,并且对输入持开放态度,所以如果你有任何解决这些问题的想法,就应该去帮忙!
另外:我喜欢“如果你走这条路,最好知道自己在做什么”这句话。我认为现在很多人会认为Sass/Less对那些不想过多考虑工具的人来说更容易使用;而PostCSS提供了更多可能性,前提是你愿意积极思考这些可能性,做一些实验等等。
stage标志即将到来https://github.com/cssnext/cssnext/issues/100支持“未来”语法的难题总是如出一辙:我们不知道未来,永远也不会知道,而且大多数时候,我们会对未来进行赌注(当然,结果很糟糕)。
我认为我们应该对这些问题更加负责:看看前缀问题(Firefox已经放弃了对旧渐变语法的支持,但由于很多兼容性原因,他们又要开始支持它)我们应该从这些错误中吸取教训,停止预测未来。
过去每天都在帮助我们创造一个更美好的未来。例如,React和Babel向我们展示了(就像其他一些项目一样),我们不是在预测未来,我们是在实现它。这个过程有助于让规范变得更好。我只是说说而已。
目前,大多数CSS polyfill是静态的。它们提供了“未来证明”的语法优势,但缺乏原生实现的动态继承优势。变量和转换简写就是这种情况。
这是一个严重的权衡,但这并不意味着要把孩子和洗澡水一起倒掉。我们过去对像Less、Sass和Stylus这样的抽象语言持犹豫态度。我们过去也对JavaScript polyfill持犹豫态度。我们有例子来支持这两种观点。现在我们对PostCSS插件持犹豫态度。这些是相同的犹豫,是健康的,在我看来意味着我们正在前进。
很棒的文章,很好地概括了我自己对PostCSS的想法。我想补充两点
在第3点中,对我来说关键的一点是,一旦功能X得到了良好的支持,你想要移除PostCSS时,几乎肯定会有一些新的功能(例如在CSS5规范中)你想要支持。因此,“切换”永无止境。
另外,也许与第2点相反,Sass还有很多其他功能在新的CSS中不会很快被复制(嵌套、混合、颜色函数)。
我完全同意,但我有一个疑问。我不认为“后处理器”这个词很愚蠢或令人困惑。
我不确定“后处理器”与未来规范有关的想法是从哪里来的,但我一直理解它是在CSS Tricks上介绍的方式,它是一种特定类型的预处理器,它操作有效的CSS文件,而不是将特殊语法编译成CSS的预处理器。
我不在乎这个词本身,我只在乎尊重作者的意图。我使用的唯一的后处理器是autoprefixer,如果Andrey Sitnik想称它为后处理器,那我也会这么称呼它。
哦。Chris说得对。“后处理器”是一个糟糕的术语:)。我会尽量避免使用它。
哈哈。好吧!战争结束了。就是预处理器。
是的,所以让我们在浏览器中完成所有这些处理,把用户、他们的电池寿命、UI响应速度、网站的其余部分都抛到脑后,让我们停止使用SASS/SCSS,摒弃服务器端处理,把所有东西都放到浏览器中,商业智能、我们的算法、图形设计、所有的一切。如果我们真的努力,我们可以专注于这个的新版本。
什么?
作为cssnext的创建者,我必须承认,人们确实应该谨慎使用他们想要的东西。
也就是说,我这里还有一些其他的东西要快速抛出来(因为我需要改进cssnext,而不是说太多话)。
npm --save(-dev)默认使用插入符范围(^)安装,这意味着你可以自动获得新功能或错误修复)。对于破坏性更改,你需要有目的地升级(因此,你需要阅读CHANGELOG)。但是,就像过去一样,如果需要,将来我们也会这样做,我们可以为我们的工具提供UX,并提供有关如何在需要时升级代码的简单说明。我们甚至可以提供一个脚本,如果搜索和替换(由正则表达式支持)可能不够,那么这个脚本可以使转换更容易。完全同意这一点。我同意创建您自己的自定义 CSS 扩展是一个坏主意。
非常真诚的回复,但对作者有力的论据表示反对。
cssnext 不会成为 javascript 中的 babel,因为它们处于不同的问题领域。
css 缺乏【抽象】的能力,但 javascript 没有。
我记得克里斯不喜欢 Sass 的想法。
哈哈!
Ugh。是的,这是一个问题。我知道这一点,无论发生什么让 CSS 变得烦人,总会有比我聪明的人找到一种方法来围绕它创建构建/预/后处理。这三种过程的需要揭示了我们今天编写强大 CSS 所需的细节/控制程度。
我同意,我已经得出关于可移植性的结论,特别是因为 W3 规范的反复无常的性质。
这个论据不适用于编写 ES6/7 的人,因为我相信 ecma 机构要严格得多。
我对这篇文章的回应:) http://twin.github.io/css-preprocessing-drama/
我一直都在想同样的事情,我也对 JavaScript 生态系统有过类似的想法。很多人都使用 Babel 来启用 ES2015/16 代码,但我清楚某些东西无法转换为 ES5,想到将来我可能会告诉 Babel 开始将所有东西编译成 ES2015 代码,而我使用 ES2018 代码(或其他东西)的时候,我发现有些东西无法按预期工作,因为编译后的代码与 ES2015 规范的工作方式不同,这让我感到害怕。还有其他一些东西,比如 ES2016+ 中的装饰器和异步函数,我也想现在就使用,但我无法保证它们在整个规范过程结束后会保持不变。
然后我听说你可以开始将其他东西(PostCSS 风格)插入 Babel 来启用其他功能,这让我想到了一些非常类似于你文章最后一部分关于可移植性的内容。它不仅更难共享,而且如果你在一个公司以一种方式进行,然后切换到另一个使用不同插件集的公司,你的技能可能无法转移。这并不糟糕,因为这就像学习一个新的库或框架,因为不同的公司选择了不同的库或框架。
另一种困难的情况是,你可能会习惯于简化你编写某些内容方式的抽象/功能,但随后你去了一个不允许你使用该抽象/功能的地方(ES2016 异步函数或 ES2015 类就是一个很好的例子),你还没有学习如何在 ES5 中正确地执行它,你可能不知道如何用“旧”的方式执行它。这些抽象需要更多的培训和更好的面试,以找出开发人员真正掌握了什么。
ES2015 和 CSS4(?)之间最大的区别是,这篇文章没有承认的是,ES2015 草案据我所知是最终版,因此规范几乎不会发生变化。这意味着开始使用新的语法将非常明智。
如果某些功能无法转换为 ES5,你就不应该使用它们,这就是为什么你应该始终使用此作为参考。Babel 文档在功能是实验性的情况下会发出警告,因此如果你犯了错误,通常不会毫无头绪。
ES2015 不是像 Sass 这样的抽象语言。它不仅不会消失,而且最终将无处不在,因此使用这些功能不应该成为禁果。只需记住
forEach,你是否仍然想要继续磨练你的for循环技能?你 either 使用这些工具,要么不使用。我已经使用 Babel 很长时间了,我越来越喜欢它。特别是因为它是比 CoffeeScript(一种**是**抽象语言)好得多的替代方案。
在编写 CSS 时,你们是否有时觉得不需要那么多的工具?我喜欢 SASS 用来进行变量、将文件分成多个部分以便包含以减少 HTTP 请求等操作。但我认为重要的是要记住,服务给用户(和浏览器)的是纯 CSS。我觉得,大多数情况下,由 postcss 等生成的 CSS 不如你编写的 vanilla CSS 好。我已经看到 SASS 在输出 CSS 时做了一些疯狂的事情。它在网站上仍然运行得很好,但文件比我单独编写时要长得多。出于这个原因,我决定将 SASS 用于那些可以为我节省时间、并且我 100% 确定可以生成我想要的东西的操作,例如变量、包含以及可以提高网站性能并使我的 CSS 更好的操作。我觉得我们不需要那么多工具来编译老式的 css… 我喜欢完全控制服务给网站用户的內容以及 CSS 的输出方式。
我同意,这就是为什么我认为例如
@extend非常危险,几乎不应该使用。但逻辑很复杂,比如供应商前缀。你真的想自己写所有这些前缀吗?我认为 Autoprefixer 已经成为工具链中普遍的标准部分,因为它是一个 PostCSS 插件,你可以轻松地添加其他插件而不会使你的工作流程复杂化。我同意你应该主要编写纯 CSS,即使你在 Sass 中编写,人们也会编写一些非常重的 Sass 代码,然后这些代码很难理解。我不得不同意你,像前缀器这样的插件非常有用,可以为你节省时间。你说得对,我认为我应该像使用 SASS 一样开始使用 PostCSS。对于可以提高我的网站性能、可以为我节省时间、并且我确信可以输出我想要的 CSS 的工具,我应该使用它们。
我已经看到有些人谈论所有前端工具的必要性,他们是对的。这篇文章让我想起了巴黎的查理周刊袭击事件:他们的网站需要在同一天被修改,所以事情必须快。令人震惊的现实是,有人只是用 HTML3 手动编码了整个网站,可能没有任何工具。因此,我们不要忘记我们真正的目标是输出纯 HTML、CSS 以及可能的一些 JS。
我对预处理器 vs. 后处理器这件事的看法…
我认为 PostCSS 是一个后处理器,不像 Sass 或 Less 是预处理器,这是因为,对于 Sass 和 Less,你必须先将代码运行到预处理器中,然后它才能成为有效的 CSS(从规范和语法角度来说)。但是对于 PostCSS,CSS 已经是有效的,所以你即使在将它交给 PostCSS 之前也可以将它服务给浏览器。
所以,预处理和后处理之间的界限与 CSS 符合规范的界限相同。所以,在我看来,添加供应商前缀是后处理,但是变量、混合等自定义语法是预处理。
话虽如此,你可以用 PostCSS 编写一些插件,将它变成一个预处理器… 所以,也许最终最准确的说法是 PostCSS 不是两者之一,而是你的使用方式决定了它是哪一种。这有点像它的要点,因为它可以满足你的任何需求。
当然,这种区别很愚蠢,而且它究竟叫什么名字并不重要。
PostCSS 不一定是在有效的 CSS 上工作的。这篇文章的一部分要点是,有一些 PostCSS 插件允许你使用新的/不同的语法,这些语法不是有效的 CSS,因此它可以用作预处理器。当然,由于有大量的 PostCSS 插件可以添加这种语法,因此没有一个单一的、大型的标准或文档来描述你在同时使用多个插件时向 CSS 添加的功能。
我觉得这就像它过去“宣传”的方式,但它完全不正确。PostCSS 只是一个解析器。插件可以鼓励处理有效的 CSS,或者完全是虚构的随机语法,而且有很多这样的情况正在发生。
我大体上同意,但这些概念本身就很难理解,把像预处理这样的东西分成重新命名的子类别似乎是一种损失。