ExtractTextPlugin和postCSS - autoprefixer不工作

Héc*_*tor 5 webpack autoprefixer postcss webpack-plugin

我正在尝试设置webpack以获得一个编译传递,它会扫描一个文件树中的所有css文件,然后生成一个css文件,其中包含所有样式的捆绑,autoprefixed和最小化.

我无法让autoprefixer插件工作.

这是相关的webpack配置部分:

const webpack = require('webpack')
const path = require('path')
const glob = require('glob')
const ExtractTextPlugin = require('extract-text-webpack-plugin');

// postCSS plugins
const autoprefixer = require('autoprefixer')

module.exports = [
{
  // another compilation pass
},
{
  name: 'static-css',
  entry: {
    vendor: glob.sync(path.join(__dirname, 'assets/stylesheets/vendor/**/*.css')),
    styles: glob.sync(path.join(__dirname, 'assets/stylesheets/src/**/*.css'))
  },
  devtool: 'source-map',
  output: {
    path: path.join(__dirname, 'assets/stylesheets/build/'),
    filename: 'bundle.js',
  },
  module: {
    loaders: [
      // css loader for custom css
      {
        test: /\.css$/,
        include: path.join(__dirname, 'assets/stylesheets/src'),
        loader: ExtractTextPlugin.extract('style-loader', 'css-loader!postcss-loader')
      },
      // css loader for vendor css
      {
        test: /\.css$/,
        include: path.join(__dirname, 'assets/stylesheets/vendor'),
        loader: 'style-loader!css-loader'
      },
      // other loaders for images, fonts, and svgs
      {
        test: /\.png$/,
        loader: 'url-loader?limit=100000'
      },
      {
        test: /\.jpg$/,
        loader: 'file-loader'
      },
      {
        test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/,
        loader: 'url?limit=10000&mimetype=application/font-woff'
      },
      {
        test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
        loader: 'url?limit=10000&mimetype=application/octet-stream'
      },
      {
        test: /\.eot(\?v=\d+\.\d+\.\d+)?$/,
        loader: 'file'
      },
      {
        test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
        loader: 'url?limit=10000&mimetype=image/svg+xml'
      }
    ],
    postcss: function() {
      return [
        autoprefixer
      ]
    }
  },
  plugins: [
    // extract css in a .css file
    new ExtractTextPlugin('[name].css')
  ]
}
];
Run Code Online (Sandbox Code Playgroud)

当我运行webpack时,我得到了bundle.js中压缩的所有文件,并在一个单独的styles.css文件中正确提取.但是不应用供应商前缀.

我正在使用这个类来测试前缀:

.autoprefixer-test {
  display: flex;
  transition: all .5s;
  background: linear-gradient(to bottom, white, black);
  user-select: none;
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试将调用更改为ExtractTextPlugin.extract,就像ExtractTextPlugin.extract('style-loader', ['css-loader', 'postcss-loader'])在其他帖子中看到的那样,但它根本没有帮助.

有任何想法吗?

And*_*tin 5

看起来你错放了postcss参数.根据https://github.com/postcss/postcss-loader上的文档,以下代码应放在配置的顶层,而不是放在以下module部分:

postcss: function() {
  return [
    autoprefixer
  ]
}
Run Code Online (Sandbox Code Playgroud)

更新.

事实上,为了使postcss和webpack的集成工作,需要编写更多的配置.感谢以下主题,我找到了解决方案https://github.com/postcss/postcss-loader/issues/8

首先,为了postcss能够处理@import'ed文件,postcss-import需要使用插件.要将此插件与webpack集成(例如,启用文件监视以进行热重新加载或重建),从初始化程序的函数参数中获取的特殊参数将作为参数传递,postcssImport如下所示:

var autoprefixer = require('autoprefixer');
var postcssImport = require('postcss-import');
....
postcss: function(webpack) {
  return [
    postcssImport({ addDependencyTo: webpack }), // should be first
    autoprefixer
  ];
]
Run Code Online (Sandbox Code Playgroud)

遗憾的是,当使用url(...)相对路径时,这会通过webpack中断资产加载.发生这种情况是因为postcss-import将所有@import'ed文件合并为一个,但路径仍然相对于文件初始目录.为了重写相对路径,postcss-url应该使用插件,配置现在看起来像这样:

var autoprefixer = require('autoprefixer');
var postcssImport = require('postcss-import');
var postcssUrl = require('postcss-url');
....
postcss: function(webpack) {
  return [
    postcssImport({ addDependencyTo: webpack }),
    postcssUrl(),
    autoprefixer
  ];
]
Run Code Online (Sandbox Code Playgroud)