Webpack 2 генерирует пустой файл CSS

После прочтения многочисленных SO вопросы (а также исследования в Интернете), я все еще не могу создать файл CSS (с CSS внутри него) с помощью Webpack 2 (v2.1.0-beta .27), подключаемый модуль ExtractText (v2.0.0-beta.4), sass-loader (v3.2.0), css-loader (v0.26.1) и style-loader (v0.13.1).

В настоящее время Webpack 2 успешно завершается и генерирует мои файлы JS, как и ожидалось, но мой файл app.css пуст (Chrome выдает ошибку 404 для файла), но создается в правильном месте в соответствии с моей панелью «Источники» в Chrome. Это наводит меня на мысль, что проблема с css-loader или другим загрузчиком.

Мой текущий файл webpack.config.js выглядит так:

const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const autoprefixer = require('autoprefixer');
const path = require('path');
const resolve = path.resolve;

const rootDir = resolve(__dirname);
const dist = resolve(rootDir, 'coolAppName/secured_assets');
const assetIndex = resolve(rootDir, 'src/app');
const vendorIndex = resolve(rootDir, 'webpack.vendor.js');
const styleIndex = resolve(rootDir, 'webpack.style.js');
const fontPath = '../static/fonts/';

module.exports = {

  watchOptions: {
    poll: 3000,
    aggregateTimeout: 1000,
  },

  devServer: {
    port: 8080,
    publicPath: 'http://localhost:8080/secured_assets/',
  },

  devtool: 'eval-source-map',

  entry: {
    app: assetIndex,
    style: styleIndex,
    vendor: vendorIndex,
  },

  output: {
    path: dist,
    filename: '[name].js',
    publicPath: 'http://localhost:8080/secured_assets/'
  },

  module: {
    loaders: [

      // CSS files
      {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract({
          fallbackLoader: 'style-loader',
          loader: [
            {
              loader: 'css-loader',
            }
          ]
        }),
      },

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

      {
        test: /\.(gif|png)$/,
        loaders: [
          {
            loader: 'url-loader',
            query: {
              mimetype: 'image/png'
            },
          },
        ],
      },

      {
        test: /\.js/,
        loaders: 'babel-loader',
        include: [
          assetIndex,
        ],
        exclude: /(node_modules|bower_components)/,
        query: {
          cacheDirectory: true,
        },
      },      

      {
        test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
        loaders: 'url-loader',
        query: {
          limit: 10000,
          mimetype: 'application/font-woff',
          name: `${fontPath}[name].[ext]`,
        },
      },

      {
        test: /\.(ttf|eot|svg|otf)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
        loaders: 'file-loader',
        query: {
          name: `${fontPath}[name].[ext]`,
        },
      },

      {
        test: /\.json$/,
        loaders: 'json-loader',
      },

      {
        test: /\.html$/,
        loaders: 'html-loader',
      },

    ],
  },

  plugins: [
    new ExtractTextPlugin({
      filename: '/css/app.css',
      allChunks: true,
    })
  ],

};

и мой файл webpack.style.js выглядит так:

// STYLE entrypoint
// vendor (CSS)
require('./coolAppName/static/fonts/custom-font-icons/styles.css');
require('font-awesome/css/font-awesome.css');
require('simple-line-icons/css/simple-line-icons.css');
require('lato-font');
require('./node_modules/bootswatch/yeti/bootstrap.min.css');
require('./node_modules/angularjs-toaster/toaster.css');
require('./node_modules/angular-busy2/dist/angular-busy.css');
require('./node_modules/perfect-scrollbar/dist/css/perfect-scrollbar.css');
require('./node_modules/angular-bootstrap-lightbox/dist/angular-bootstrap-lightbox.css');
require('./node_modules/angularjs-slider/dist/rzslider.min.css');
require('./node_modules/ui-select/dist/select.css');
require('./coolAppName/static/fonts/noto/noto.css');
// SCSS
require('./src/app/css/templates.scss');

Моя структура файла выглядит так (что правильно):

структура файла

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

Вот так выглядели важные разделы с Webpack 1 (я избавился от postcss-loader для этого примера выше)

{
    test: /\.css$/,
    loader: ExtractTextPlugin.extract('style-loader', 'css-loader?sourceMap!postcss-loader'),
},
{
    test: /\.scss$/,
    loader: ExtractTextPlugin.extract('style-loader', 'css-loader?sourceMap!sass-loader?sourceMap!postcss-loader'),
},

В конечном итоге я хочу создать 1 файл CSS в /secured_assets/css/app.css, который содержит все стили, которые я require в webpack.style.js. На данный момент я не получаю ошибок, а app.css не имеет содержимого, и я вижу 404 на панели «Сеть» (хотя он отображается в «Источниках» в Chrome).

Обновлять

Когда я просто запускаю webpack --config ./webpack.dev.js, он правильно создает мой app.css. Когда я запускаю webpack-dev-server --config ./webpack.dev.js, это не так. Похоже, это возможная проблема с webpack-dev-server...


person james    schedule 07.12.2016    source источник


Ответы (2)



Проблема заключалась в косой черте (/) перед filename ExtractTextPlugin в моем массиве plugins.

До:

new ExtractTextPlugin({
  filename: '/css/app.css',
  allChunks: true,
})

После:

new ExtractTextPlugin({
  filename: 'css/app.css',
  allChunks: true,
})

webpack-dev-server смог правильно найти этот файл после внесения этого изменения.

person james    schedule 08.12.2016