Webpack 3 + Sass Loader:不能将 scss 用作模块

Posted

技术标签:

【中文标题】Webpack 3 + Sass Loader:不能将 scss 用作模块【英文标题】:Webpack 3 + Sass Loader : Cannot use scss as a module 【发布时间】:2018-12-08 17:40:35 【问题描述】:

我正在使用 Webpack 3 + Sass Loader + Sass Resources Loader 来构建一个多主题的 React App。

这是我的 webpack.config:

 
test: /\.css$/,
exclude: /node_modules/,
loader: ExtractTextPlugin.extract(
  fallback: 'style-loader',
  use: [
    
      loader: 'css-loader',
      options: 
        importLoaders: 1,
        modules: true,
        minimize: IS_PRODUCTION,
        sourceMap: IS_DEVELOPMENT,
        localIdentName: IS_DEVELOPMENT ? '[name]__[local]__[hash:8]' : '[hash:8]'
      ,
    ,
    
      loader: 'postcss-loader',
      options: 
        sourceMap: IS_DEVELOPMENT,
        plugins: postCssPlugins,
      
    ,
  ],
),
  ,  

test: /\.scss$/,
loader: ExtractTextPlugin.extract(
  use: [
    
      loader: 'css-loader',
      options: 
        sourceMap: IS_DEVELOPMENT,
      
    ,
    
      loader: 'sass-loader',
      options: 
        sourceMap: IS_DEVELOPMENT
      
    ,
    
      loader: 'sass-resources-loader',
      options: 
        sourceMap: IS_DEVELOPMENT,
        resources: [
          './common/style/flaticon/_flaticon_class.scss',
          `./common/branding/$BRANDING/$BRANDING.scss`,
          './common/style/bootstrap/_general_variables.scss',
          './node_modules/bootstrap/scss/bootstrap-reboot.scss', // functions, variables, mixins, reboot
          './node_modules/bootstrap/scss/_root.scss',
          './node_modules/bootstrap/scss/_type.scss',
          './node_modules/bootstrap/scss/_images.scss',
          './node_modules/bootstrap/scss/_grid.scss',
          './node_modules/bootstrap/scss/_utilities.scss',
        ]
      ,
    ,
  ]
)

,

实际上,它工作得很好,但是当我尝试将我的 scss 文件导入我的 react 组件并像 css 文件一样利用它时,类名是未定义的。

在我的组件文件中:

import styles from './ActivityGridItem.scss';
...
<div className=`m-2 $styles.activityTypeIcon`></div>

通常,样式 .activityTypeIcon 应该应用于我的 div,但现在它是未定义的。

我尝试像这样添加选项“模块:true”:

test: /\.scss$/,
loader: ExtractTextPlugin.extract(
  use: [
    
      loader: 'css-loader',
      options: 
        modules: true,
        sourceMap: IS_DEVELOPMENT,
      
    ,

但是,每个 sass 文件都被识别为一个模块,我不能使用全局 boostrap 类,如 row、col、m-* 等。

【问题讨论】:

【参考方案1】:

有几种方法可以做到这一点

您可以在 css-modules 中使用 global block 使引导类成为全局的。 您可以创建 2 个加载器,一个启用 css 模块,另一个启用全局样式并以某种方式区分它们。例如,您可以让所有以.module.scss 结尾的文件都使用modules: true

【讨论】:

以上是关于Webpack 3 + Sass Loader:不能将 scss 用作模块的主要内容,如果未能解决你的问题,请参考以下文章

webpack 3 sass-loader 无法导入没有相对路径的 scss 文件

Webpack 5 sass-loader 不编译嵌套的 scss 文件

图片不显示在生产版本中,仅在开发中(webpack/sass-loader)

webpack 4 sass-loader 不生成 scss 源映射

Webpack 和 sass-loader 文件导入顺序

webpack sass-loader 不生成类选择器样式