为什么ES模块中导入的CSS无法被Tree Shaking删除?

嘉兴(打工版) 阅读 44

我在用ES Module打包项目时,发现导入的CSS文件里没用到的样式始终被包含在最终包里。比如我在组件里只用了.button-primary,但整个CSS文件都被打包了,这是为什么呢?

我试过在Webpack里配置了sideEffects: false,也确认用了ESM语法。但像下面这样的CSS文件里未引用的类还是会被带上:


.button-primary {
  background: blue;
}
.button-secondary {
  background: red;
}
.button--disabled {
  opacity: 0.5;
}

难道CSS不能被Tree Shaking?或者需要额外配置?

我来解答 赞 11 收藏
二维码
手机扫码查看
2 条解答
Mr.志诚
Mr.志诚 Lv1
CSS 不能像 JS 那样被 Tree Shaking 是有原因的,这不是 Webpack 的锅,是 CSS 本身机制的问题。

简单说,JS 的 Tree Shaking 是基于**导入导出语法**和**实际引用关系**来判断代码是否无用。但 CSS 没有“引用”这个概念,你导入一个 CSS 文件,它就相当于在页面上加了个