Vite 插件里怎么处理 CSS 中的变量注入?
我在写一个 Vite 插件,想在构建时动态往 CSS 里注入一些变量,比如主题色。但试了几次发现 transform 阶段拿到的 CSS 内容没法正确替换,或者替换后样式就乱了。
我用的是 transform 钩子,正则匹配 :root 然后插入变量,但有时候用户写的 CSS 本身就带变量,我的注入会覆盖掉或者位置不对。有没有更稳妥的方式?
:root {
--primary-color: #007bff;
--border-radius: 4px;
}
.button {
background: var(--primary-color);
border-radius: var(--border-radius);
}
postcss来处理更可靠,Vite本身内置了PostCSS支持。给你个靠谱的方案:
1. 在插件里加个PostCSS插件,用
postcss-custom-properties来处理变量2. 通过
Declaration钩子精准操作CSS变量,别直接用正则去匹配:root示例代码:
安全提醒:
1. 不要直接拼接CSS字符串,防止注入攻击
2. 处理用户原有变量时要保留原始值,除非确实需要覆盖
3. 记得处理sourcemap,不然调试会很痛苦
遇到变量冲突时,建议加个前缀比如
--plugin-primary来隔离命名空间。这比直接覆盖用户变量安全多了。