next.js 13.4+ 原生支持 sass,无需额外配置;只需安装 sass(dev 依赖),在 app/layout.tsx 中导入 globals.scss 实现全局样式,用 .module.scss 启用 css modules 局部作用域,并通过 @use 正确引入 variables/mixins。

Next.js 13+ 不需要额外配置就能用 Sass
Next.js 自 v13.4 起已原生支持 .scss 和 .sass 文件,无需安装 @zeit/next-sass、node-sass 或修改 next.config.js。那些老教程里要求的插件和配置,现在不仅多余,还会导致构建失败或热更新异常。
你只需要:
- 安装
sass(仅 dev 依赖):npm install --save-dev sass - 创建
app/globals.scss并在app/layout.tsx中导入:import './globals.scss' - 组件内局部使用:新建
Button.module.scss,然后import styles from './Button.module.scss'
注意:.module.scss 才会触发 CSS Modules 局部作用域;直接写 Button.scss 是全局样式,哪怕只在单个组件里 import —— 这是很多人踩坑的根源。
全局样式必须放在 layout.tsx 里导入
Next.js App Router 中,只有在 app/layout.tsx(或更上层的根 layout)中导入的全局 CSS/Sass 才会真正“全局生效”。如果在某个 page.tsx 或组件里 import globals.scss,样式只会作用于该路由片段,且可能被 SSR/CSR 不一致导致闪动或丢失。
常见错误现象:
- 页面首次加载有样式,跳转后消失 → 错误地在
page.tsx里 import 全局 Sass - 开发时正常,build 后部分样式不生效 → 全局文件路径拼错,比如写成
../styles/globals.scss但实际在app/下 - 字体、重置样式没应用到
或→ 全局 Sass 里写了body { ... },但没在根 layout 导入
正确做法:把所有跨路由共享的样式(重置、字体、工具类)全塞进 app/globals.scss,并在 app/layout.tsx 的最顶部 import —— 别管它看起来像不像“组件级引入”。
.module.scss 和 .scss 的行为差异很关键
Next.js 对两类文件的处理逻辑完全不同:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
-
.module.scss→ 自动启用 CSS Modules:类名被哈希化,只在 import 它的组件内有效,支持composes继承,支持:global()临时退出局部作用域 -
.scss(无 module)→ 按全局 CSS 处理:类名原样输出,可能污染全局,多个同名 class 会相互覆盖
典型陷阱:
- 写了个
Card.scss,以为只影响 Card 组件,结果.card在整个站点都生效了 - 想复用
Button.module.scss里的btn-primary,但在另一个组件里 import 后发现类名变成Button_btn-primary_abc123,直接写 class="btn-primary" 不生效 - 在
.module.scss里用@import 'variables';,但variables.scss是普通文件 → 报错 “undefined variable”,因为@import不跨模块作用域
解决方案:变量、mixin 等共享逻辑必须放在普通 .scss 文件里(如 styles/variables.scss),再用 @use(推荐)或 @import 引入到 .module.scss 或全局文件中。
Sass 变量和 @use 规则要配合普通 .scss 文件使用
Next.js 原生 Sass 支持 Dart Sass(唯一推荐),而 Dart Sass 强制要求用 @use 替代旧式 @import 来加载变量/mixin —— 否则会警告甚至报错。
正确结构示例:
styles/
├── variables.scss <p>在 <code>Button.module.scss</code> 中:</p><pre class="brush:php;toolbar:false;">@use '../variables' as *;
@use '../mixins';
<p>.button {
color: $primary-color;
@include mixins.flex-center;
}</p>别漏掉 as *,否则得写 variables.$primary-color;也别把 variables.scss 命名为 variables.module.scss,那样它就变成局部模块,其他文件无法 @use。
最容易被忽略的一点:Sass 的 @use 是文件级作用域,不是组件级。只要一个文件 @use 了变量,它就能在当前文件任意位置用 —— 但不会泄露给其他未显式 @use 的文件。这点和 CSS Modules 的“隔离感”容易混淆,得靠目录命名和导入习惯来管理。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










