Vite 导入 SCSS 报找不到相邻文件,检查 Lightning CSS 的文件基准
Vite 的 Lightning CSS 路径曾用外层 CSS 入口作为被导入 SCSS 的编译基准。8.3.4 传入实际文件路径,临时切回 PostCSS 也需评估处理链差异。
Vite 在生产构建时报 Can't find stylesheet to import,SCSS 文件和它引用的变量文件明明放在同一个目录,可以检查进入 Sass 的 filename 是否变成了外层 CSS 入口。这个具体问题需要一条特殊导入链,而不是所有 Sass 路径错误。
已确认的组合是 Vite 8.3.0、css.transformer: 'lightningcss'、Lightning CSS 与 Sass。原报告使用 Node 26.0.0、npm 11.12.1、macOS ARM64;两个预处理相关包只给出大致系列,不能补成精确安装版本。
目录可以缩成下面的关系:
/* src/main.css */
@import './components/box.scss';
/* src/components/box.scss */
@import './_vars.scss';
.box { background: $bg; }
/* src/components/_vars.scss */
$bg: cornflowerblue;
这里 _vars.scss 相对的是 box.scss。受影响的 Lightning CSS 读取分支把最外层 main.css 的 id 传给预处理函数,Sass 按入口目录解析 ./_vars.scss,于是错误地去 src/ 下寻找。堆栈若把 root stylesheet 指向 src/main.css,也与这条基准传递错误吻合。
Vite 8.3.4 包含修复:预处理导入文件时传它自己的 filePath,不再复用入口 id。可在分支固定版本,并沿原导入链构建:
npm install -D vite@8.3.4
npm ls vite sass lightningcss
npm run build
保留原来的 transformer 配置,以便确认同一条路径恢复:
import { defineConfig } from 'vite';
export default defineConfig({
css: { transformer: 'lightningcss' },
});
不能升级时,原报告中默认 PostCSS 路线已能编译这个例子;可暂时去掉 transformer 定制,或明确设置 css.transformer: 'postcss'。这会切换 CSS 处理链,项目若依赖 Lightning CSS 专有选项,需评估差异。无需把变量文件复制到两个目录,更不应靠移动源码去迎合错误基准。
验收应保留入口与 SCSS 位于不同目录这一条件。构建通过后,检查输出中的 .box 是否得到预期颜色,再在页面上确认规则应用。另加一个直接由 JS 导入 SCSS 的对照:那条路径原本使用 SCSS 自身作为入口,可能一直正常,不能只测它就宣称原故障恢复。
这个修复处理 Lightning CSS 导入预处理文件时的身份传递。实际文件缺失、拼写大小写、Sass loadPaths 或别名配置仍需单独诊断;如果错误路径已经准确指向 components/box.scss,也不应继续假设总是本问题。例子使用的 Sass @import 已属于需要迁移的旧语法,但语法弃用与文件基准错误是两件事,迁移时应分别验收。


