纠缠选择器
快捷方式:Configuration编译器@stylify/bundler@stylify/unplugin@stylify/astro@stylify/nuxt@stylify/nuxt-module为什么Stylify会在源代码中直接混入选择器?
选择器处理是一个更高层次的优化,它将长的选择器如.color\:blue
转换为短的.a
。
这可以大大减少CSS和HTML的大小。这也使得通过复制粘贴你的源代码来 “偷 “你的网页设计变得更加困难。
Configuration
包 @stylify/bundler, @stylify/unplugin, @stylify/astro 或 @stylify/nuxt 的混搭过程是这样进行的:
- 默认情况下Mangling是关闭的,你必须通过设置编译器选项
mangleSelectors
为true
来启用它。 - 选择器总是在源代码中直接被处理(这就是原因)
- 当任何一个软件包在观察模式下运行时(观察文件的变化),选择器不会被处理。
- 当你在你的项目中运行构建命令时(用于生产/开发环境),Stylify会对选择器进行处理。
由于选择器是直接在源文件中被修改的,你可能想在本地环境中禁止修改,只在暂存和生产环境中启用,这样你就不必在每次运行构建时都要恢复Stylify造成的修改。 这可以通过使用一个 “环境变量 “轻松解决:
const config = {
compiler: {
// 只有在设置了用于纠缠的环境变量的情况下才会纠缠选择器
// 该变量的名称由你决定
mangleSelectors: typeof process.env.STYLIFY_MANGLE_SELECTORS !== 'undefined'
}
}
这里有一个经常使用的部署服务的环境变量指南清单:
编译器
当你想通过直接使用编译器在你的自定义编译中混合选择器时,你必须设置编译器选项 => mangleSelectors: true
。
同样,你可以使用一个环境变量来启用/禁用本地开发环境和生产环境中的mangling。
import { Compiler } from '@stylify/stylify';
const content = '';
const compiler = new Compiler({
mangleSelectors: true
});
const compilationResult = compiler.compile(content);
const mangledContent = compiler.rewriteSelectors(content, compilationResult);
const css = compilationResult.generateCss();
@stylify/bundler
捆绑器在引擎盖下使用编译器。如果你想启用mangling,将编译器配置中的mangleSelectors
设置为true
。
请确保查看有关选择器的减化过程是如何进行的。
const bundler = new Bundler({
compiler: {
// 只有在捆绑器不观察文件时,这才会生效。
mangleSelectors: true
}
})
@stylify/unplugin
Unplugin将配置传入引擎盖下的Bundler。
请确保查看有关选择器的减化过程是如何进行的。
const config = {
compiler: {
// 这只有在使用该插件的捆绑器时才会生效、
// 没有在观察模式下运行
mangleSelectors: true
}
}
@stylify/astro
Astro将配置传递给引擎盖下的Unplugin:
请确保查看有关选择器的减化过程是如何进行的。
const config = {
compiler: {
mangleSelectors: true
}
}
@stylify/nuxt
Nuxt插件将配置传递给引擎盖下的Unplugin:
请确保查看有关选择器的减化过程是如何进行的。
const config = {
compiler: {
mangleSelectors: true
}
}
@stylify/nuxt-module
Nuxt模块自动设置了mangling,并使用了一个专门为Nuxt 2准备的旧的webpack插件。 你不需要在那里配置任何东西。
但是你可以通过设置mangleSelectors: false
来禁用混用:
const config = {
compiler: {
mangleSelectors: false
}
}
为什么Stylify会在源代码中直接混入选择器?
- Stylify的工作方式是,它匹配类的属性并处理它的内容=>生成css
- 当你使用一些框架时,比如Astro、Vue、Nuxt、Next、React,他们经常使用Vite、Webpack或Rollup来编译他们的源代码。
- 在编译过程中,源代码经常从
class="color:blue"
变成createEl(el, null, {class: 'color:blue'})
或更糟糕的c(el, 'color:blue')
。 - 这些变化导致Stylify不能正确地匹配类,其中一些区域没有被处理=>没有生成CSS或选择器没有被处理。
- 解决这个问题的唯一方法是将Stylify插件放在所有其他插件之前,以接收原始输入,但由于一些插件似乎在开始时就被固定了,这并不是在所有情况下都能成功。
- 由于上述原因,这个过程并不可靠,很难调试,而且在
0.6
中取消了对它的支持。