ReactJS - включая другие файлы scss в main.scss

В моем приложении activJS - я включаю все файлы.scss в один файл main.scss - в папку стилей в папке src. У меня есть следующая конфигурация webpack. Попытался включить файл main.scss непосредственно в мой основной компонент - получая ошибку в @import, где я импортирую другие файлы scss. если я включаю отдельные стили файла scss, то все в порядке - но как заставить это работать с одним файлом main.scss и как включить его?

ошибка: ожидается неожиданный токен ((1: 8)

1 | @import 'mycomponent';

module.exports = {
  entry: [
    'webpack-hot-middleware/client',
    path.resolve(__dirname, 'src'),
  ],
  output: {
    path: path.resolve(__dirname, 'src'),
    filename: 'bundle.js',
    publicPath: '/',
  },
  plugins: [
    new ExtractTextPlugin('bundle.css', { allChunks: true }),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NamedModulesPlugin(),
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: JSON.stringify('development'),
        WEBPACK: true,
      },
    }),
  ],
  module: {

    rules: [
      {
        enforce: 'pre',
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'eslint-loader',
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          query: {
            presets: ['react-hmre'],
          },
        },
        include: path.resolve(__dirname, 'src'),
      },
     {
    use: ExtractTextPlugin.extract({
      fallback: "style-loader",
      use: [
         'css-loader', 
         'sass-loader?outputStyle=expanded'.
      ]
    }),
    test: /\.scss$/,
    exclude: /node_modules/
  }
    ],
  },
};

index.js

import React from 'react';
import { render } from 'react-dom';
import { createBrowserHistory } from 'history';
import { ConnectedRouter, routerMiddleware } from 'react-router-redux';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import App from './components/homepage';
import reducers from './reducers';
import '../styles/main.scss';


const history = createBrowserHistory();
const store = createStore(reducers, applyMiddleware(routerMiddleware(history)));

render(
  <Provider store={store}>
    <ConnectedRouter history={history}>
      <App />
    </ConnectedRouter>
  </Provider>
  , document.getElementById('app'));

if (process.env.NODE_ENV === 'development' && module.hot) {
  module.hot.accept();
  module.hot.accept('./reducers', () => {
    const nextRootReducer = require('./reducers').default; // eslint-disable-line global-require
    store.replaceReducer(nextRootReducer(store.asyncReducers));
  });
}

4 ответа

Вы должны импортировать ваш .scss файл через JavaScript в вашем компоненте React верхнего уровня.

import './styles/main.scss';

Затем Webpack включит его в ваш пакет.

Для производства вы захотите использовать плагин Extract Text для веб-пакета, который будет экспортировать отдельный файл CSS из оператора импорта.

Webpack работает на .js файлы. Вам нужно конвертировать ваши .scss в .css файл с использованием ExtractTextPlugin:

{test: /\.scss$/,
    use: ExtractTextPlugin.extract({
        fallback: "style-loader",
        use: [{
            loader: "css-loader" // translates CSS into CommonJS
        }, {
            loader: "sass-loader"
        }]
    })
}

Установите для этого точку входа вашего веб-пакета в каталог, в которомmain.scss файл живет, затем создайте index.js в этом каталоге со следующей строкой:

require("./main.scss") (или же import ./main.scss)

Путь, который вы включаете здесь: <link rel="stylesheet" type="text/css" href="./styles/main.scss"> должен быть путь к сгенерированному .css файл.

Ниже настройки работают на меня.

webpack.config.js

{
    use: ExtractTextPlugin.extract({
      fallback: "style-loader",
      use: [
         'css-loader', //knows how to deal with css
         'autoprefixer-loader?browsers=last 3 versions',
         'sass-loader?outputStyle=expanded' //this one is applied first.
      ]
    }),
    test: /\.scss$/,
    exclude: /node_modules/
  }

в топ index.js

import "./styles/main.scss";
import "./reactApp";

пример main.scss

// Import any of your custom variables for bootstrap here first.
@import "my-theme/custom";
// Then, import bootstrap scss
@import "~bootstrap/scss/bootstrap";  
//for bootstrap 3 using bootstrap-sass
$icon-font-path: '~bootstrap-sass/assets/fonts/bootstrap/';
@import '~bootstrap-sass/assets/stylesheets/_bootstrap.scss';
// Finally import any custom styles.
@import "my-theme/master-theme";

Я просто импортировал бы их так, как вы делаете, и не использовал бы идентификаторы или имена классов, если вы не хотите, чтобы стили были одинаковыми, поэтому:

import '../styles/main1.scss';
import '../styles/main2.scss';
....

Вот так и так далее

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