Webpack 2 生成空 CSS 文件

Webpack 2 generates empty CSS file

阅读 (以及在线研究)后,我仍然无法使用 Webpack 2 (v2.1) 生成 CSS 文件(其中包含 CSS)。 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'),
},

最终我想在 /secured_assets/css/app.css 中创建 1 个 CSS 文件,其中包含我 requirewebpack.style.js 中的所有样式。此时,我没有收到任何错误,app.css 没有内容,我在网络面板中看到 404(尽管它显示在 Chrome 的源代码中)。

更新

当我简单地 运行 webpack --config ./webpack.dev.js 时,它会正确创建我的 app.css。当我 运行 webpack-dev-server --config ./webpack.dev.js 它没有。所以看起来可能是 webpack-dev-server 问题...

您应该使用查询参数 importLoaders(文档:importing and chained loaders):

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

问题出在我的 plugins 数组中 ExtractTextPlugin 的 filename 前面的斜杠 (/)。

之前:

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

之后:

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

webpack-dev-server 进行此更改后能够正确找到此文件。