Babel配置useBuiltIns时为什么样式变量会冲突?
我在项目里同时用了@babel/plugin-transform-runtime和@babel/plugin-proposal-class-properties,把useBuiltIns设成”usage”后,CSS的自定义变量突然报未定义了…
比如这个代码:
:root {
--primary-color: #3498db;
}
.button {
background: var(--primary-color);
}
控制台提示”undefined”覆盖了变量,但生产环境打包没问题,开发服务器却报错。试过把useBuiltIns改回”entry”就好了,但这样polyfill会重复引入。难道是core-js污染了全局变量?
你遇到的这个情况,大概率是因为core-js的某个模块在注入polyfill时,不小心把CSS自定义属性的命名空间给污染了。CSS变量是挂在window上的,用的是var()函数,而core-js可能正好有个变量叫var或者类似的命名冲突了。
解决办法有几个,你可以试试:
第一种是调整Babel配置,明确告诉@babel/preset-env不要污染全局作用域。可以在babel.config.js里加上targets选项,只针对特定浏览器做polyfill。代码大概这样:
第二种方法更稳妥,就是用@babel/runtime配合@babel/plugin-transform-runtime,把所有polyfill都限定在局部作用域内。需要改一下配置:
最后一个小技巧,如果你确定问题出在开发服务器上,可以检查下webpack-dev-server的配置,看看是不是有hot module replacement的问题。有时候HMR会导致一些奇怪的全局变量覆盖。
这些方法应该能帮你解决问题,如果还有问题就再交流。
core-js和你的样式变量起了冲突。当useBuiltIns: "usage"时,core-js会注入一些全局对象,可能覆盖了你的 CSS 变量。解决方法有两种,拿去改改:
1. 排除
core-js的特定模块2. 或者直接用
entry,但避免重复引入 polyfill:然后在入口文件手动引入一次 polyfill:
第一种方法更优雅,第二种简单粗暴。看你项目需求选一个吧。反正这种坑我也是踩过几次才明白的...