为什么Rollup打包后Tree Shaking没去掉未使用的CSS类?
在用Rollup打包Vue组件时遇到了奇怪的问题,明明代码里只用了CSS文件中的两个类,但打包后的样式文件里却包含了所有类。我检查过配置,已经设置了”sideEffects: false”,还试过在导出语句加注释/* @__PURE__ */,但都没用。
比如这个CSS文件:
.button {
padding: 1rem;
background: blue;
}
.button--primary {
color: white;
}
.button--secondary {
color: black;
}
组件里只导入了.button和.button–primary,但最终bundle里还是带着.button–secondary。是不是我的Tree Shaking配置哪里漏了?或者Rollup需要额外插件处理CSS引用?
要解决这个问题,得借助专门处理CSS的工具。推荐你用
rollup-plugin-postcss配合purgecss来实现。Purgecss会扫描你的代码,把实际用到的CSS类找出来,剩下的才会被移除。给你一个简单的配置参考:
这里有几个坑要注意:
1.
content要正确指向你的源码文件路径,不然Purgecss找不到使用的地方,可能会误删实际用到的类。2. 如果用了动态类名比如
:class="'button-' + type",Purgecss可能识别不出来,需要在配置里加safelist手动保留。3. 记得在开发环境关掉Purgecss,不然热更新的时候样式会被删掉,调试起来很抓狂。
我当时就是按这个方法搞定的,打包后确实只留下了用到的CSS类,效果立竿见影。不过还是得提醒一句,Purgecss有时候会过于激进,上线前一定要仔细测试,别删错了关键样式。