跳到主要内容

类名的压缩与混淆

自从版本 2.3.0+ 开始,配置项中添加了 mangle 选项,传一个 true 这样的布尔值,即可开启对 tailwindcss 生成类名的混淆和压缩。

为什么需要这样这个配置项呢?

有时候我们会写出这样的 class:

<view
class="bg-[url(https://pic1.zhimg.com/v2-3ee20468f54bbfefcd0027283b21aaa8_720w.jpg)] bg-[length:100%_100%] bg-no-repeat w-screen h-[41.54vw]">
</view>

显然,这样的 class 是有效的,然而原始长度实在是太长了,经过转义后,假如里面包含 unicode,那就更长了,所以我们需要对这种进行压缩。

开启这个选项之后,这个元素的编译结果就变成了如下所示:

<div class="tw-g tw-h tw-i tw-d tw-e"></div>

同时,对应的 jscss 选择器也被同时修改,以做到同步。这样生成的包的大小比较小,而且其他开发者也不能一眼看出样式了,因为类名已经被混淆过了。

自定义

如果你对生成类名的结果不满意,我也提供了许多的配置项帮助你自定义修改类名

比如你对 tw- 这样的类名前缀不满意,那么可以传:

const options = {
// ...
mangle:{
classGenerator: {
classPrefix: '' // 这里就写你想要的前缀
}
}
}

或者你有些类名不想被压缩混淆,那么就可以传入一个过滤方法 mangleClassFilter

const options = {
mangle:{
mangleClassFilter: (className:string) => boolean
}
}

这个压缩混淆的能力,源自于我另外一个项目 tailwindcss-mangle

想要了解更多的功能和配置项可以移步查看文档,欢迎 starfork

注意点

默认情况下,不包含 - 或者 : 的类名是不会被压缩混淆的,比如 flex,relative 这种类名。

为什么?

因为压缩混淆 js 的字符串字面量是非常危险的一件事情,比如

const innerHTML = "i'm flex and relative and grid"
document.body.innerHTML = innerHTML

这种情况下强行压缩混淆,那用户自己的结果就是有问题的了

所以这就是原因,当然这个默认行为,可以使用自定义的 mangleClassFilter 来代替。