删库在逃程序员的Blog

Sass 变量导出 undefined 问题记录

author
·
8
0

Sass 变量导出 undefined 问题记录

在 JS 中导入 Sass 变量得到 undefined?可能是 css-loader 版本惹的祸。

问题描述

在某次项目中需要从 Sass 文件导出变量到 JavaScript 使用,发现无论怎么导入都是 undefined,但样式能正常编译显示。

// variables.scss
$primary-color: #3498db;
$spacing-unit: 16px;
// 期望这样使用
import { primaryColor } from './variables.scss';
console.log(primaryColor);  // undefined ❌

解决方案

方案一:使用 .module.scss 后缀(推荐)

将 Sass 文件命名为 *.module.scss 结尾:

// variables.module.scss
$primary-color: #3498db;
$spacing-unit: 16px;
import variables from './variables.module.scss';
console.log(variables.primaryColor);  // ✅

方案二:配置 css-loader

在 webpack 配置中为 css-loader 添加 namedExport: false 选项:

{
  test: /\.s[ac]ss$/i,
  use: [
    'style-loader',
    {
      loader: 'css-loader',
      options: {
        modules: {
          namedExport: false,  // 关键配置
        },
      },
    },
    'sass-loader'
  ]
}

原因分析

这个问题主要出现在 css-loader 较新版本(v6+)中:

{
  "css-loader": "^6.7.1"  // 新版本默认开启 namedExport
}

新版本 css-loader 默认开启 namedExport: true,要求使用 ES Module 的命名导出方式,但 Sass 变量导出需要 namedExport: false 才能正确工作。

旧版本不受影响

{
  "css-loader": "^3.5.3",
  "sass": "^1.52.1",
  "sass-loader": "^13.0.0",
  "style-loader": "^3.3.1",
  "webpack": "^5.72.1"
}

Vue CLI 特殊情况

Vue CLI ~5.0.0 可以正常配置 .module.scss 后缀,这得益于 vue-loadervue-style-loader 的配合。

Vue CLI 5 内置的 css-loader 版本为 ^4.3.0,处于过渡版本,兼容性较好。

快速排查清单

现象 可能原因 解决方案
变量导出 undefined css-loader v6+ 默认 namedExport 改用 .module.scss 后缀
样式正常但 JS 拿不到值 modules 配置问题 设置 namedExport: false
Vue CLI 项目正常 vue-loader 内置处理 无需额外配置

参考资源

评论 (0)