2016-03-21 17 views
10

最終出力CSSファイルでpostcssを実行する方法を理解しようとしています。sass-loaderとExtractTextPluginの終了後にPOSTCSSを実行するにはどうすればよいですか?

'strict'; 

const path = require('path'); 
const webpack = require('webpack'); 
const StatsPlugin = require('stats-webpack-plugin'); 

/* POSTCSS Optimizations of CSS files */ 
const clean = require('postcss-clean'); 
const colorMin = require('postcss-colormin'); 
const discardDuplicates = require('postcss-discard-duplicates'); 
const discardEmpty = require('postcss-discard-empty'); 
const mergeRules = require('postcss-merge-rules'); 
const mergeLonghand = require('postcss-merge-longhand'); 
const minifyFonts = require('postcss-minify-font-values'); 
const orderedValues = require('postcss-ordered-values'); 
const uniqueSelectors = require('postcss-unique-selectors'); 

/* EXTRACT CSS for optimization and parallel loading */ 
const ExtractTextPlugin = require('extract-text-webpack-plugin'); 

module.exports = { 
    entry: './src/index', 
    output: { 
     path: path.join(__dirname, 'dist'), 
     filename: '[name].js', 
     chunkFilename: '[id].bundle.js', 
     publicPath: '/dist/', 
     soureMapFilename: '[file].map' 
    }, 
    plugins: [ 
     new webpack.optimize.OccurenceOrderPlugin(), 
     new webpack.NoErrorsPlugin(), 
     new StatsPlugin('stats.json'), 
     new ExtractTextPlugin('assets/css/[name].css?[hash]-[chunkhash]-[contenthash]-[name]', { 
      disable: false, 
      allChunks: true 
     }) 
    ], 
    node: { 
     net: 'empty', 
     tls: 'empty', 
     dns: 'empty' 
    }, 
    module: { 
     loaders: [{ 
      test: /\.js$/, 
      loaders: ['babel'], 
      exclude: /node_modules/, 
      include: __dirname 
     }, 
     { 
      test: /\.scss$/i, 
      loader: ExtractTextPlugin.extract('style', ['css', 'postcss', 'sass']) 
     }, 
     { 
      test: /\.css$/, 
      loader: ExtractTextPlugin.extract('style', ['css']) 
     }, 
     { 
      test: /\.(eot|woff|woff2|ttf|svg|png|jpg)$/, 
      loader: 'url-loader?limit=30000&name=[name]-[hash].[ext]' 
     }] 
    }, 
    postcss() { 
     return [mergeRules, mergeLonghand, colorMin, clean, discardEmpty, 
       orderedValues, minifyFonts, uniqueSelectors, discardDuplicates]; 
    }, 
    sassLoader: { 
     includePaths: [path.resolve(__dirname, './node_modules')] 
    } 
}; 

私の現在の構成は従属SASSのすべてをコンパイルし、その静的なCSSの輸入を取り、ExtractTextPluginを使用してそれらを抽出するに適しています。

また、私はPOSTCSS最適化をCSSのチャンクで実行できますが、最終製品では実行できないようです。つまり、私は重複CSSルールを取り除くことはできません。

最終状態のCSSファイルでPOSTCSSを実行するにはどうしたらよいですか?sass-loaderおよびextractTextPluginが魔法を働かせたらどうしますか?

+0

'postcss'ローダーを' module.postLoaders'(https://webpack.github.io/docs/configuration.html#module-preloaders-module-postloaders)に移動できますが、 ExtractTextPluginで作業してください。 –

+0

残念ながら、動作していないようです。私は、POSTCSSを実行するpostLoaderになった時点で、ローダーが動作する方法のために、操作するファイルにCSSが残っておらず、新しくマージされたCSSファイルをpostcssに指す方法もないと仮定しています/ distの中の/ファイル。 ローダーがファイルシステム上の任意のファイルを指すことはできないと思うので、JSエントリーポイントに接続する必要があります。 – nhavar

答えて

8

ExtractTextPluginと同様の設定作業をする上で問題がありましたが、私の問題はExtractTextPluginプラグインをどのように使用しているかにありました。私は唯一の生産のためにそれを使用してい

が構築され、これは私のために働いていたものです:

module: { 
    loaders: [ 
     { // styles 
      test: /\.scss$/, 
      include: [ path.join(__dirname, 'source/styles') ], 
      loader: ExtractTextPlugin.extract('style', ['css', 'postcss', 'sass']) 
     } 
    ] 
}, 

注アレイ[ 'CSS'、 'postcss'、 'SASS']。それが私が欠けていた部分です。この配列は最初に解決され、プラグインによって最後に抽出されるスタイルを実行します。

そして、プラグインの配列にはnew ExtractTextPlugin('styles-[chunkhash].css')を使用しています。

+0

私の例ですでに上に挙げたほぼ正確なコード(インクルード行を除く)を持っています。ほとんどのバリエーションはそれを助けませんでした。私は分離した例とパイプの例を試しました。エクストラクトはうまく動作し、いつも持っていますが、重複しています – nhavar

+0

私はちょうど助けてくれるかもしれないというクレイジーアイデアを持っていました。 'loader:ExtractTextPlugin.extract( 'style'、 'postcss'、['css'、 'postcss'、 'sass'])'のようなものを試してみたらどうなりますか?ポストCSSは配列外ですが、スタイルタスクの前(右から左)に注意してください。 – rafaelbiten

0

ExtractTextPluginは現在、 "onComplete"コールバックなどをサポートしていないため、WebpackShellPluginを使用できます。

postcssプラグインを実行するスクリプトを設定し、onBuildExitでスクリプトを実行して、コンパイル済みCSSを処理します。

関連する問題