1

在阅读了大量 SO 问题(以及在线研究)之后,我仍然无法使用 Webpack 2(v2.1.0-beta.27)、ExtractText 插件(v2.0.0-beta)生成 CSS 文件(其中包含 CSS) .4)、sass-loader (v3.2.0)、css-loader (v0.26.1) 和 style-loader (v0.13.1)。

目前,Webpack 2 成功完成并按预期生成了我的 JS 文件,但我的app.css文件是空的(Chrome 会为该文件抛出 404)但根据我在 Chrome 中的 Sources 面板在正确的位置生成。这使我相信存在与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,其中包含我requirewebpack.style.js. 此时,我没有收到任何错误,app.css也没有内容,我在我的网络面板中看到 404(尽管它显示在 Chrome 的源中)。

更新

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

4

2 回答 2

0

问题是我的数组中/以 ExtractTextPlugin 为前缀的斜杠 ( )。filenameplugins

前:

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

后:

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

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

于 2016-12-08T15:20:31.067 回答
0

您应该使用查询参数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'
      }
    ]
  })
}
于 2016-12-07T23:30:26.443 回答