Webpack-simple: переменные SASS не переводятся в свои значения на странице

После установки Vue-CLI с webpack-simple, а затем выполнения npm install sass-loader node-sass webpack --save-dev, у меня действительно есть style.scss в моем /src folder.

Однако, несмотря на соблюдение Документы Vue.js, SCSS не работает должным образом: если я создаю переменную SCSS$gray1: #dddddd, а затем использую ее как background: $gray, $gray не переводится в #dddddd в браузере (консоль показывает background: $gray1, что, конечно, не имеет смысла для Хром).

Есть ли какие-то особые шаги, чтобы заставить SASS работать в этом случае?

Содержимое моего файла Webpack.config.js:

var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: './src/main.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'build.js'
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'vue-style-loader',
          'css-loader',
          {
          loader: 'sass-loader',
          options: {}
          }
        ],
      },
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
          }
          // other vue-loader options go here
        }
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        loader: 'file-loader',
        options: {
          name: '[name].[ext]?[hash]'
        }
      }
    ]
  },
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    },
    extensions: ['*', '.js', '.vue', '.json']
  },
  devServer: {
    historyApiFallback: true,
    noInfo: true,
    overlay: true,
    clientLogLevel: 'none'
  },
  performance: {
    hints: false
  },
  devtool: '#eval-source-map'
}

if (process.env.NODE_ENV === 'production') {
  module.exports.devtool = '#source-map'
  // http://vue-loader.vuejs.org/en/workflow/production.html
  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      sourceMap: true,
      compress: {
        warnings: false
      }
    }),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    })
  ])
}

Вот как я импортирую свой файл style.scss в свой основной компонент:

<style>
@import '../style.scss';
</style>

что вы имеете в виду под «не применяется». Как вы применяете это в своих файлах Vue? (Я предполагаю, что вы используете SFC). Покажите, как вы импортируете / используете файл scss.

A. L 14.11.2018 03:31

Отредактировал вопрос, чтобы прояснить. Да, я использую SFC. CSS в моем файле SCSS применяется правильно, но переменные SCSS не заменяются их значением в браузере.

drake035 24.11.2018 20:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
1 310
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Убедитесь, что вы выполнили следующие действия:

В конфигурации вашего веб-пакета импортируйте extract-text-webpack-plugin.

var ExtractTextPlugin = require('extract-text-webpack-plugin');

После того, как вы поместите свою запись scss в конфигурацию:

module.exports = {
  entry: ['app.js', 'anotherfile.scss', './scss/your-main-file.scss'],
...

И в модуле ..

...
module: {

    rules: [

      {
        test: /\.(sass|scss)$/,
        loader: ExtractTextPlugin.extract(['css-loader', 'sass-loader'])
      }
    ]
  },
...

Выполнение этих шагов и правильная установка модулей должны работать на вас. Удачи с этим!

Спасибо, но я получаю: «ОШИБКА в ./src/style.scss - Ошибка сборки модуля: Ошибка: загрузчик 'extract-text-webpack-plugin' используется без соответствующего плагина». Я добавил в свой вопрос содержимое моего webpack.config.js.

drake035 08.11.2018 20:07

Попробуйте что-то вроде этого:

{
  test: /\.(css|scss)$/,
  use: [isProduction ? MiniCssExtractPlugin.loader : "style-loader", "css-loader", "sass-loader"],
}

Я не могу найти источник прямо сейчас. Но если экспортируемый файл SASS включает переменные, которые вы пытаетесь использовать в других файлах SASS / тегах стиля, имя файла должно быть начать с подчеркивания.

style.scss -> _style.scss

Если в файле SASS используются только переменные использует SASS из других файлов SASS, то начальное подчеркивание не требуется.

Попробуйте изменить правила для sass примерно так

{ test: /\.scss$/, use: [{ loader: "style-loader" // creates style nodes from JS strings }, { loader: "css-loader" // translates CSS into CommonJS }, { loader: "sass-loader" // compiles Sass to CSS }] }

Глядя на мои собственные конфиги и файлы, меняю правило:

  {
    test: /\.css$/,
    use: [
      'vue-style-loader',
      'css-loader',
      {
      loader: 'sass-loader',
      options: {}
      }
    ],
  },

к

        {
            test: /\.s[a|c]ss$/,
            loader: "style!css!sass"
        },

для вашего <style> в вашем SFC вам также понадобится lang, то есть <style lang = "scss">

и если вы импортируете, вам может потребоваться поставить ~ перед вашим путем, например @import "~../style.scss";

Пытался, возникло множество проблем, включая "./node_modules/vuetify/dist/vuetify.min.css Ошибка синтаксического анализа модуля: неожиданный символ '@' (5: 2)"

drake035 26.11.2018 18:40

попробуйте удалить строку @import и посмотреть, компилируется ли она сначала, если работает, то работайте над частью импорта

A. L 27.11.2018 03:54

Импорт работает, потому что мой SCSS выполняется и применяется на странице. Проблема в том, что переменные SCSS не заменяются их значениями. Извините, заголовок вводит в заблуждение, я только что обновил его.

drake035 14.12.2018 15:56

С вашими правилами это должно работать ... Если ваш style.scss находится в вашей папке src, попробуйте вместо этого изменить путь импорта:

<style lang = "scss">
  @import './style.scss';
</style>
Ответ принят как подходящий

Если кто-то с такой же проблемой сталкивается с этой веткой, проблема заключалась в том, что я забыл указать lang = "scss" при вызове моего файла SCSS:

<style lang = "scss">
  @import './style.scss';
</style>

Все CSS, содержащиеся в style.scss, по-прежнему работали. Что касается определенных или используемых в нем переменных SCSS, они не работали. Теперь они это делают.

Почему-то этого никто не заметил :)

Другие вопросы по теме