DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

Vite 设置 esnext 后 CSS 仍被降级,检查 Lightning CSS 目标参数

Vite 的 esnext CSS 目标曾被映射为空对象,意外触发 Lightning CSS 兼容转换。8.3.4 已含空目标处理,仍需按真实浏览器范围检查规则保留。

Vite 设置 build.target: 'esnext' 后,生产 CSS 仍出现不必要的兼容转换,甚至原有规则消失,应检查 CSS 压缩器实际收到的目标参数。JavaScript 目标设为 esnext,并不自动证明所有后续工具都按“没有兼容约束”处理。

具体问题在 Vite 8.2.0、默认 Lightning CSS 压缩路径中出现。build.cssTarget 没有另设时会继承构建目标;Vite 将 esnext 条目跳过,剩下空对象 {},随后把它传给 Lightning CSS。空对象与没有目标 undefined 具有不同含义:前者会进入兼容转换判断,后者才表示这里没有目标约束。

这是一条参数翻译错误,而不等于浏览器突然不支持源码中的 CSS。先核对项目有没有单独设置 cssTarget,是否使用 Lightning CSS,以及开发样式与生产资产的真实差异。另设了具体浏览器目标的项目,本来就可能需要转换,不能把任何改写都当成故障。

Vite 8.3.4 的正式转换函数在没有有效目标键时返回 undefined。可在分支固定到这个包含处理的版本,并保留原选项重新构建:

npm install -D vite@8.3.4
npm ls vite
npm run build
import { defineConfig } from 'vite';
export default defineConfig({
  build: {
    target: 'esnext',
    cssTarget: 'esnext',
  },
});

这份配置只适合项目确实不要求 CSS 兼容转换的场景。若产品要支持明确的旧浏览器,应填写真实目标,不要为了绕过错误把支持范围改成 esnext。无目标约束也不会给浏览器增加语法支持。

暂时无法采用该处理时,原故障中改用 esbuild CSS 压缩能恢复相关规则。Vite 8 将 esbuild 作为可选 peer,选择该路线前需把它安装为项目依赖:

npm install -D esbuild

然后在原构建配置里设置 build.cssMinify: 'esbuild',重新核对目标兼容性与产物。切换压缩器可能改变输出风格及特性处理,不能把它当成任意 CSS 问题的永久通用解法。

验收时保留一份涉及现代选择器或属性的最小样式,比较构建前后规则是否存在,以及实际目标浏览器中是否按预期应用。还要检查具体浏览器目标配置的对照,确保所需转换没有被整体取消。只有命令退出成功,不足以证明压缩输出保留了规则。

该处理纠正 esnext 到 Lightning CSS targets 的映射。原问题还暴露过 Lightning CSS 自身的规则丢失行为,不能据此承诺 Vite 的参数修正解决了那个工具的全部缺陷。如果目标映射已正确但输出仍缺规则,应继续记录具体 CSS、压缩器版本与选项,分开处理上游转换问题。