jest报syntaxerror: unexpected token根本原因不是scss语法错误,而是jest默认将.module.scss当作js源码解析,未配置modulenamemapper将其mock为模块;必须在jest.config.js中映射.scss等后缀到stylemock.js,并确保transform规则仅匹配js/ts/jsx文件,避免babel误处理scss内容。

为什么Jest会报 SyntaxError: Unexpected token ' 或 Module parse failed: Unexpected token
不是 SCSS 语法写错了,而是 Jest 根本没把 .module.scss 当作样式文件处理——它默认当成 JS 源码去解析,一看到 @import、$var 或 & 就直接崩。尤其在 Next.js、Create React App 改造项目或自定义 Webpack 配置的工程里,这个问题高频出现。
必须配置 moduleNameMapper 映射 SCSS 文件
Jest 不走 Webpack loader 链,所以 sass-loader 和 css-loader 对它完全无效。你得告诉 Jest:“遇到 .scss 路径时,别解析,直接 mock 成空对象”。
- 在
jest.config.js中添加:moduleNameMapper: { '\.(scss|sass|css)$': '<rootdir>/__mocks__/styleMock.js' }</rootdir> - 创建
__mocks__/styleMock.js,内容只需一行:module.exports = {}; - 如果用的是 CSS Modules(如
Button.module.scss),mock 返回对象要带className键:module.exports = { root: 'Button_root_abc123' };
SCSS 中含 @import 或变量时仍报错?检查 Babel 和 transformIgnorePatterns
即使 mock 了样式文件,若 SCSS 文件本身被 Babel 尝试编译(比如误配了 transform 规则),@import 'xxx.scss' 这类语句仍会被当作 JS 语法报错。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 确认
transform规则只匹配 JS/TS/JSX:transform: { '^.+.(js|jsx|ts|tsx)$': 'babel-jest' } - 确保
transformIgnorePatterns排除了 node_modules 里的 SCSS 工具库(如jeet、stylelint-scss):transformIgnorePatterns: [ 'node_modules/(?!(jeet|stylelint-scss)/)' ]
- 如果用了
postcss-scss等解析器,它们只是 Stylelint 用的,对 Jest 无影响——别指望靠它救 Jest 的解析失败
Next.js 项目里 SVG + SCSS 一起挂?正则必须覆盖大小写且不含歧义
很多人抄来的正则 "^.+.(png|jpg|svg)$" 在 Jest 里实际不生效:ESM 模式下路径解析可能带 file:// 前缀,^ 和 $ 锚点失效;/i 修饰符在某些 Jest 版本中也不稳定。
- 改用更鲁棒的写法:
"\.(scss|sass|css|svg|png|jpg|jpeg|gif|webp|avif|ico|bmp)$"
- 不要加
^、$或/i—— Jest 的模块映射是简单字符串后缀匹配,不是完整路径正则 - SCSS 和 SVG 必须分开 mock:一个 mock 处理样式,另一个处理资源,混在一个正则里容易漏掉
最常被忽略的一点:Jest 的 moduleNameMapper 是按顺序匹配的,如果你写了两条规则都覆盖 .scss,只有第一条生效。检查有没有其他正则(比如通用的 ^.+.(css)$)无意中截断了你的 SCSS 映射。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










