模块化由 css-loader 控制,sass-loader 仅编译 SCSS 为 CSS;启用 modules: true 或 { mode: 'local' } 实现类名哈希化,{ mode: 'icss' } 支持 :export 导出变量。

sass-loader 本身不负责导出 CSS 模块,真正起作用的是 css-loader 的 modules 配置;sass-loader 只管把 SCSS 编译成 CSS 字符串,后续是否启用模块化、如何解析类名,全由 css-loader 控制。
css-loader 必须显式开启 modules 模式
默认情况下 css-loader 是非模块化行为(即全局样式),即使你写了 import styles from './Button.module.scss',也不会自动启用模块化。必须在 css-loader 的 options.modules 中明确设置:
-
modules: true:启用默认模块化(类名哈希化,如Button_button__abc123) -
modules: { mode: 'local' }:等价于true,但语义更清晰 -
modules: { mode: 'icss' }:仅处理:export块,适合导出 JS 可用变量(如主题色) - 别写
modules: { auto: true }—— 这是旧版写法,Webpack 5+ 已废弃,会被忽略
sass-loader 的 role 是“无感透传”,不干预模块逻辑
sass-loader 对 .module.scss 文件没有任何特殊识别逻辑。它只按文件后缀匹配执行编译,输出仍是标准 CSS 文本。模块化行为完全依赖 css-loader 是否启用了 modules,以及文件名是否符合 Webpack 的自动模块识别规则(如 .module.scss 或 .module.css):
- Webpack 默认对
/\.module\.(css|scss|sass|less)$/自动启用css-loader的modules: true,但该行为不可靠——它依赖 Webpack 内部启发式匹配,且容易被自定义rules覆盖 - 强烈建议显式配置
css-loader的modules,而不是依赖文件名约定 -
sass-loader的additionalData注入内容(如全局变量)会原样进入编译流程,但不会影响模块作用域——它属于“预编译上下文”,不是模块内代码
注意 loader 执行顺序与模块化生效范围
loader 链必须严格为 style-loader → css-loader → sass-loader(从右到左执行),否则 css-loader 拿不到 SCSS 编译后的 CSS,模块化就无从谈起:
立即学习“前端免费学习笔记(深入)”;
- 错误顺序:
sass-loader → style-loader → css-loader→css-loader收到的是 JS 字符串而非 CSS,直接报错或静默失效 - 若使用
MiniCssExtractPlugin.loader替代style-loader(生产环境常见),模块化依然由css-loader控制,无需额外调整 -
importLoaders: 1在css-loader中建议设为1,确保它知道前面还有 1 个 loader(即sass-loader)需要回溯处理@import的 SCSS 文件
导出 JS 可用变量需配合 :export 语法
纯 CSS 模块只能导出类名映射对象({ button: 'Button_button__abc123' })。若想从 SCSS 导出颜色、间距等设计变量,要用 :export 块,并配 css-loader 的 icss 模式:
// variables.module.scss
:export {
primaryColor: #007bff;
spacingSmall: 4px;
}
-
css-loader需配置modules: { mode: 'icss' } - 导入时:
import vars from './variables.module.scss'→vars.primaryColor === '#007bff' -
sass-loader不解析:export,它只是把这段当作普通 CSS 规则原样输出,交由css-loader的 ICSS 解析器提取 - 别在
:export里写 Sass 变量引用(如$primary),因为:export是 CSS 层语法,Sass 编译后它已不存在
真正容易被忽略的点是:模块化开关在 css-loader,不在 sass-loader;而 :export 导出变量的可行性,取决于 css-loader 是否启用 icss 模式,跟 Sass 本身的能力无关。别在 sass-loader.options 里翻找“module”相关字段——它根本没有。


















