【问题标题】:Webpack - Sass loader not compiling SassWebpack - Sass 加载器不编译 Sass
【发布时间】:2019-01-07 21:36:57
【问题描述】:

我正在尝试将Sass-loader 引入现有项目,以便能够在我的 React 组件中使用 Sass。我之前在我自己的样板中成功设置了这个并且没有任何问题,但由于某种原因,当前配置似乎无法播放。它不会给出任何错误,而是不会对我尝试导入的 .scss 文件执行任何操作。

我可以看到 cssLoaders Webpack 配置中有一些加载程序可能是罪魁祸首,但我只针对具有规则的 .scss/ .sass 文件

test: /\.s(a|c)ss$/

所以我根本不会想到这会影响它。

我有一个带有通用文件和一个用于开发的 webpack 设置。以下是这两个文件:

webpack.common.js

const CleanWebpackPlugin = require('clean-webpack-plugin');
const HtmlWebPackPlugin = require('html-webpack-plugin');
const ErrorOverlayPlugin = require('error-overlay-webpack-plugin');
const webpack = require('webpack');
const path = require('path');
require('babel-polyfill');

const Dotenv = require('dotenv-webpack');

module.exports = {
  entry: {
    main: ['babel-polyfill', './src/index.js']
  },
  output: {
    filename: '[name].[hash].js',
    path: path.resolve('./dist')
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: ['node_modules'],
        use: [{ loader: 'babel-loader' }]
      },
      {
        test: /\.s(a|c)ss$/,
        use: [
          {
            loader: 'style-loader'
          },
          {
            loader: 'css-loader'
          },
          {
            loader: 'sass-loader'
          }
        ]
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 8192,
              outputPath: 'images/'
            }
          }
        ]
      },
      {
        test: /\.(woff(2)?|ttf|eot|otf)(\?v=\d+\.\d+\.\d+)?$/,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: '[name].[ext]',
              outputPath: 'fonts/'
            }
          }
        ]
      }
    ]
  },
  plugins: [
    new ErrorOverlayPlugin(),
    new webpack.HotModuleReplacementPlugin(),
    new HtmlWebPackPlugin({
      template: 'index.html'
    }),
    new Dotenv(),
    new CleanWebpackPlugin(['dist'])
  ]
};

这里是 webpack.dev.js

const path = require('path');
const webpack = require('webpack');
const ProgressBarPlugin = require('progress-bar-webpack-plugin');
const CircularDependencyPlugin = require('circular-dependency-plugin');

const paths = require('../paths');

module.exports = require('./webpack.config.base')({
  bail: false,
  devtool: 'cheap-module-eval-source-map',
  stats: 'errors-only',
  performance: {
    hints: false
  },
  entry: {
    main: [
      require.resolve('react-dev-utils/webpackHotDevClient'),
      paths.appPolyfillsJs,
      require.resolve('react-error-overlay'),
      paths.appIndexJs
    ]
  },
  output: {
    pathinfo: true,
    filename: 'static/js/[name].js',
    chunkFilename: 'static/js/[name].chunk.js',
    devtoolModuleFilenameTemplate: info =>
      path.resolve(info.absoluteResourcePath)
  },

  // Load the CSS in a style tag in development
  cssLoaders: [
    {
      loader: require.resolve('style-loader'),
      options: {
        sourceMap: true
      }
    },
    {
      loader: require.resolve('css-loader'),
      options: {
        modules: false,
        sourceMap: true,
        importLoaders: 1
      }
    },
    {
      loader: require.resolve('postcss-loader'),
      options: { sourceMap: true }
    }
  ],
  babelQuery: {
    cacheDirectory: true
  },
  plugins: [].concat([
    new ProgressBarPlugin(),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NamedModulesPlugin(),
    new webpack.NoEmitOnErrorsPlugin(),
    new CircularDependencyPlugin({
      exclude: /a\.js|node_modules/, 
      failOnError: true 
    })
  ])
});

我添加到配置中的部分在 webpack.common 中:

      {
        test: /\.s(a|c)ss$/,
        use: [
          {
            loader: 'style-loader'
          },
          {
            loader: 'css-loader'
          },
          {
            loader: 'sass-loader'
          }
        ]
      },

然后我将它导入到模块中,如下所示:

import React, { PureComponent } from 'react';
import './test.scss';
...

谁能找出配置错误的原因?

【问题讨论】:

  • 尝试将 test: /\.s(a|c)ss$/ 替换为 /\.scss$/
  • 感谢您的帮助,但恐怕还没有解决

标签: javascript reactjs webpack sass


【解决方案1】:

sass-loader 需要 node-sass 和 webpack 作为 peerDependency

确保已安装 node-sass 并编辑加载程序 webpack.dev.js,如下所示:

{
    loader: "sass-loader",
    options: {
        includePaths: ["absolute/path/a", "absolute/path/b"]
    }
}

【讨论】:

  • 您是否安装了 node-sass 作为依赖项?
  • 是的,我已将 node-sass 安装为 dep。我将您建议的行添加到 cssLoaders 配置数组中,但现在我的一个普通 .css 文件出现错误,因此看起来 sass-loader 正在尝试解析这个...
  • 这样就解决了。尝试添加excludePath: ["path-to-css", "node_modules"]
  • 问题在于没有指向 css 的特定路径,因为 css 文件包含在任何组件文件夹中。所以没有规则我可以​​在这里申请。我需要它先确定它是 css 还是 scss,然后应用相关的加载器(如果有意义)
  • 您可以更改正则表达式并拆分 scss 部分。而不是test: /\.s(a|c)ss$/ 使用test: /\.css$test: /\.scss$。 sass 加载器应仅适用于 .scss 文件
猜你喜欢
  • 2016-07-26
  • 1970-01-01
  • 2018-09-12
  • 2017-11-25
  • 2016-03-02
  • 2016-02-23
  • 2016-11-20
  • 2017-01-19
  • 2017-03-16
相关资源
最近更新 更多