Rollup打包后文件包含未使用的CSS类名怎么办?
在用Rollup打包Vue组件库时发现,即使组件未使用某些CSS类名,打包后的dist文件里还是包含了所有类名,导致体积变大。我尝试过动态导入CSS文件,但这样会导致样式无法按需加载:
<template>
<div class="unused-class">测试内容</div>
</template>
<script>
import './styles.css' // 这里引入了包含大量类名的CSS文件
export default {}
</script>
在rollup.config.js里用了rollup-plugin-postcss,但没找到类似webpack PurgeCSS的配置项。直接安装purgecss插件又报错说找不到content路径,应该怎么配置才能清理未使用的样式?
你用
rollup-plugin-postcss的话,它本身不支持自动剔除未使用样式,得配合purgecss,但关键问题在于:PurgeCSS 没法自动从 .vue 文件里提取 class 名,除非你提前把 SFC 转成纯 JS 输出,或者指定内容源路径。最稳妥的做法是分两步走:
1. 先用
@rollup/plugin-vue把 Vue SFC 编译成 JS(输出到临时目录,比如temp/)2. 再用
rollup-plugin-purgecss或purgecss配合这个temp/目录做清理举个实际能跑通的配置例子:
先安装依赖:
然后
rollup.config.js这样写:但这样还不够,因为
@rollup/plugin-vue默认不输出临时 SFC 文件,所以你得先加一个预处理步骤,比如用vue-template-compiler把 template 提前转成 render 函数,或者直接用rollup-plugin-vue(旧版,兼容性好点):然后配置里用这个旧版插件,它默认会生成中间文件,配合 purgecss 就能用:
不过更推荐的方案是:别用 PurgeCSS 去扫 SFC,直接在 JS 层做 Tree Shaking。你把 CSS 用 CSS Modules 方式引入,配合
rollup-plugin-postcss-modules,这样没用到的类根本不会进最终 bundle:然后 rollup 配置:
这样 Rollup 在处理 JS 时就能识别出
styles.usedClass被用了,没用到的styles.unusedClass就会被 Tree Shaking 掉,最终 CSS 文件里自然就没了。如果你的项目是组件库,不想改用 CSS Modules,那只能老老实实用 PurgeCSS,但得注意版本兼容问题,
rollup-plugin-purgecss依赖的purgecss版本太旧,容易报content路径错误,可以自己用postcss+purgecss手动拼一个插件,或者升级到rollup-plugin-postcss@4+,它支持自定义postcss.plugins,直接加purgecss插件进去就行:注意
rollup-plugin-postcss@4用的是postcss插件数组,不是plugins: purgecss()这种老写法,不然会报错。总结下:
- 想少折腾 → 用 CSS Modules + Rollup 自带 Tree Shaking
- 想保留全局类名 → 用
rollup-plugin-postcss@4+purgecss插件,注意 content 路径别写错,优先扫.vue和.js- 别用
rollup-plugin-postcss@3以下版本,它不支持这种写法,容易卡住我之前就因为用错了版本,一直报
Cannot resolve content path,后来切到@4才搞定,你试试看。rollup-plugin-postcss插件结合 PurgeCSS 来实现。PurgeCSS 的作用是分析代码中的类名使用情况,并移除未引用的样式。首先你需要安装依赖,确保安装了
@fullhuman/postcss-purgecss和rollup-plugin-postcss,命令大概是这样的:接下来在你的
rollup.config.js里调整rollup-plugin-postcss的配置,加入 PurgeCSS 的逻辑。关键点在于设置content属性,它告诉 PurgeCSS 去哪些文件里扫描实际用到的类名。对于 Vue 组件库,通常需要扫描.vue文件和 JavaScript 文件。下面是一个完整的配置示例:这里有几个需要注意的地方:
1.
content路径要根据你的项目结构调整,确保能覆盖所有可能包含类名的文件。比如你用了 TypeScript,那可能还需要加上.ts文件。2.
defaultExtractor是用来匹配类名的正则表达式,这个默认配置对大多数场景都适用,但如果遇到特殊命名规则(比如带特殊字符的类名),可能需要自己调整。另外提一嘴,如果你的项目里有动态生成的类名(比如通过
classList.add()动态添加的样式),这些类名可能会被误删。这时候可以在 PurgeCSS 配置里加一个safelist,把这些类名单独列出来,防止被清理掉。例如:最后提醒一下,这种清理工具虽然好用,但调试起来可能会有点麻烦,建议在开发环境关闭 PurgeCSS,在生产环境再启用。你可以通过环境变量来控制插件的行为,比如:
这样可以避免开发阶段因为类名被误删而导致样式错乱的情况。总之就是按需配置,别一股脑全开。