解决 webpack 配置 sass-loader后报错,无法正常build

1. 问题描述

  1. 总是打包build报错,本质上css样式语法也没写错
  2. 在使用 sass-resources-loader 的项目中,开发者常常遇到构建错误或意外的样式行为,这是因为
    sass-resources-loader 的作用和使用场景并不总是被正确理解。sass-resources-loader
    主要用于全局注入 Sass 变量 和 混入,而不适合直接包含实际的 CSS 样式规则。如果 scss
    文件中混入了普通样式定义,可能会导致构建失败或样式重复应用等问题。

常见问题场景:

开发者尝试通过 sass-resources-loader 全局引入的 scss 文件中直接包含 CSS 样式。

variables.scss 和 global.scss 文件中定义了具体的选择器和样式规则,而这些文件应该只包含 Sass

变量、混入和函数等工具类样式。 项目构建时出现错误,如 Expected digit 或 Unexpected token 等。

2. 原因分析

sass-resources-loader 主要用于将 Sass 变量、混入(mixin) 和 函数 等工具类样式注入到每个 scss 文件的作用域中。其作用相当于在每个 scss 文件中隐式地 @import 一次这些工具文件。这意味着 sass-resources-loader 不会将实际的样式插入到每个 scss 文件中,而是仅仅将变量和混入等工具类代码注入。

因此,sass-resources-loader 的适用范围仅限于工具类样式。如果你在全局引入的 scss 文件中包含普通的 CSS 样式(如选择器和样式定义),这些样式会被反复注入到每个 scss 文件中,导致不必要的重复和冲突。

javascript 复制代码
// variables.scss
$primary-color: #333;
$font-size: 16px;

// 错误:普通的 CSS 选择器和样式不应放在这里
body {
  font-family: Arial, sans-serif;
  color: $primary-color;
}

3. 解决方案

为了解决这个问题,需要遵循以下原则:

  1. 确保全局注入的 SCSS 文件只包含工具类样式
    variables.scss 和 global.scss 文件中应仅包含 Sass 变量、混入(mixin) 和 函数,而不要包含实际的 CSS 样式规则。
    示例:正确的工具类 SCSS 文件
javascript 复制代码
// variables.scss
$primary-color: #333;
$font-size-base: 16px;

// mixins.scss
@mixin flex-center {
  display: flex;
  justify-content: center;
  align-items: center;
}

```javascript
// webpack.config.js
const path = require('path');

module.exports = {
  module: {
    rules: [
      {
        test: /\.scss$/,
        use: [
          'style-loader',
          'css-loader',
          'sass-loader',
          {
            loader: 'sass-resources-loader',
            options: {
              // 仅注入工具类文件,不包括普通样式
              resources: [
                path.resolve(__dirname, 'src/styles/variables.scss'),
                path.resolve(__dirname, 'src/styles/mixins.scss'),
              ],
            },
          },
        ],
      },
    ],
  },
};
相关推荐
阿珊和她的猫1 天前
`require` 与 `import` 的区别剖析
前端·webpack
jayaccc2 天前
Webpack配置详解与实战指南
前端·webpack·node.js
阿珊和她的猫2 天前
Webpack中import的原理剖析
前端·webpack·node.js
AI前端老薛2 天前
webpack中loader和plugin的区别
前端·webpack
遗憾随她而去.2 天前
Webpack5 基础篇(二)
前端·webpack·node.js
Misnice2 天前
Webpack、Vite 、Rsbuild 区别
前端·webpack·node.js
阿珊和她的猫2 天前
Webpack 动态引入的实现原理与应用
前端·webpack·node.js
GhostPaints3 天前
Vue 2 项目中 template 使用可选链 ?. 导致的诡异编译报错及 webpack loader 配置坑
前端·vue.js·webpack
静小谢3 天前
sass笔记
前端·笔记·sass
黎明初时3 天前
React基础框架搭建6-添加业务模块示例(用于做一些示例/demo):react+router+redux+axios+Tailwind+webpack
javascript·react.js·webpack