@gallantalex

Как в webpack задать компиляцию в несколько файлов?

Мне нужно, чтобы webpack скрипты выводил отдельно, а стили в отдельном css-файле. Как это сделать? Пока конфиг вебпака такой и все компилится в index.js:
var path = require('path');

module.exports = {
  entry: './entry.js',
  output: {
    filename: 'testApp/www/index.js'
  },  
  resolve: {
    extensions: ['.js', '.jsx', '.json']
  },
  module: {
    loaders: [
      { test: /\.jsx?$/,
        loader: 'babel-loader',
        include: path.resolve(__dirname, "app"),
        query:
        {
          presets:['react', 'es2015', 'stage-0']
        }
      },
      {
        test: /\.scss$/,
        loader: 'style-loader!css-loader!sass-loader'
      }
    ]
  }
};

Что дописать, чтобы создавался еще и css-файл style/index.css&
  • Вопрос задан
  • 1904 просмотра
Пригласить эксперта
Ответы на вопрос 3
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
Нужно использовать extractTextPlugin
Кусочек конфига:

для webpack 2:
module.exports = {
  devtool: 'cheap-module-source-map',
  entry: [
    './src/index'
  ],
  output: {
    path: path.join(__dirname, 'production/public/'),
    filename: 'bundle.js',
    publicPath: '/',
  },
  plugins: [
    new webpack.DefinePlugin({
      'process.env': {
        'NODE_ENV': JSON.stringify('production')
      }
    }),
    new ExtractTextPlugin({
      filename: 'style.css',
      disable: false,
      allChunks: false, // true
    })
  ],
  module: {
    rules: [
      {
        test: /\.js$/,
        loaders: ['babel-loader'],
        include: path.join(__dirname, 'src'),
      },
      {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract({
          fallbackLoader: 'style-loader',
          loader: ['css-loader', 'postcss-loader'],
          publicPath: '/public',
        }),
      }, {
        test: /\.scss$/,
        loader: ExtractTextPlugin.extract({
          fallbackLoader: 'style-loader',
          loader: ['css-loader', 'postcss-loader', 'sass-loader'],
          publicPath: '/public',
        }),
      },
....


Для webpack 1:
module.exports = {
  devtool: 'cheap-module-source-map',
  entry: [
    './src/index'
  ],
  output: {
    path: path.join(__dirname, 'production/public/'),
    filename: 'bundle.js',
    publicPath: '/',
  },
  plugins: [
    new webpack.DefinePlugin({
      'process.env': {
        'NODE_ENV': JSON.stringify('production')
      }
    }),
    new ExtractTextPlugin('style.css', {
      allChunks: false
    })
  ],
  module: {
    loaders: [
      {
        test: /\.js$/,
        loaders: ['babel'],
        include: path.join(__dirname, 'src')
      },
      {
        test: /\.scss$/,
        include: path.join(__dirname, 'src'),
        loader: ExtractTextPlugin.extract('style-loader', 'css-loader!postcss-loader!sass-loader')
      },
      {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract('style-loader', 'css-loader')
      },
...


Само собой, нужно не забыть добавить ExtractTextPlugin
const ExtractTextPlugin = require('extract-text-webpack-plugin');
Ответ написан
@gallantalex Автор вопроса
То есть у меня сейча снаписано вот так, но все равно вываливается куча ошибок:
var path = require('path');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const ExtendPlugin = require('extended-define-webpack-plugin');

module.exports = {
  devtool: 'cheap-module-source-map',
  entry: [
    './entry.js'
  ],
  output: {
    path: path.join(__dirname, 'production/public/'),
    filename: 'bundle.js',
    publicPath: '/',
  },
  plugins: [
    new ExtendPlugin({
      'process.env': {
        'NODE_ENV': JSON.stringify('production')
      }
    }),
    new ExtractTextPlugin({
      filename: '/testApp/www/style.css',
      disable: false,
      allChunks: false, // true
    })
  ],
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        loaders: ['babel-loader'],
        include: path.join(__dirname, 'src'),
      },
      {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract({
          fallbackLoader: 'style-loader',
          loader: ['style-loader','css-loader','sass-loader'],
          publicPath: '/public',
        }),
      },
      {
        test: /\.scss$/,
        loader: ExtractTextPlugin.extract({
          fallbackLoader: 'style-loader',
          loader: ['style-loader','css-loader','sass-loader'],
          publicPath: '/public',
        }),
      }
    ]
  }
};
Ответ написан
Комментировать
alvvi
@alvvi
export default apathy;
Я с вебпаком знаком всего пару дней, но видел в документации компиляцию такого вида:module.exports = [{ }, { }, { }];
, которая, по сути, будет принимать несколько конфигов, которые, скорее всего, можно настроить нужным вам образом, но на практике таким пока не пользовался.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы