【问题标题】:How to run POSTCSS AFTER sass-loader and ExtractTextPlugin have finished?如何在 sass-loader 和 ExtractTextPlugin 完成后运行 POSTCSS?
【发布时间】:2016-07-07 10:17:49
【问题描述】:

我试图弄清楚如何在我的最终输出 css 文件上运行 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 提取它们时效果很好。

似乎我可以在 CSS 块上运行 POSTCSS 优化,但不能在最终产品上运行。这意味着我无法摆脱重复的 CSS 规则。

在 sass-loader 和 extractTextPlugin 发挥作用后,如何在最终状态的 CSS 文件上运行 POSTCSS?

【问题讨论】:

  • 您可以将 postcss 加载程序移动到 module.postLoaders ( webpack.github.io/docs/… ) 但我不确定它是否适用于 ExtractTextPlugin
  • 不幸的是,它似乎不起作用。我假设由于加载程序的工作方式,当我到达 postLoader 执行 POSTCSS 时,文件中不再有任何 CSS 可供操作,也无法将 postcss 指向新合并的 CSS 文件/文件在 dist.我认为加载器不能只指向文件系统上的任意文件,我认为它必须连接到 JS 入口点。

标签: css sass webpack postcss


【解决方案1】:

由于 ExtractTextPlugin 目前不支持“onComplete”回调或类似的,您可以使用WebpackShellPlugin

设置一个脚本来运行所需的postcss 插件并在onBuildExit 中执行你的脚本来处理你编译的CSS。

【讨论】:

    【解决方案2】:

    我在使用 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')

    【讨论】:

    • 我的示例中已经列出了上面已经列出的几乎完全相同的代码(不包括包含行),它以及它的几乎任何变体都没有帮助。我已经尝试过分离和管道示例。提取物工作正常,一直都有,但有大量重复
    • 我刚刚有了一个“可能”有帮助的疯狂想法。如果您尝试以下操作会发生什么:loader: ExtractTextPlugin.extract('style', 'postcss', ['css', 'postcss', 'sass'])。请注意数组外部但在样式任务之前(从右到左)的 post css。
    猜你喜欢
    • 2017-09-07
    • 2021-04-18
    • 2018-10-28
    • 2019-02-24
    • 2018-02-21
    • 2018-04-13
    • 2018-07-07
    • 2021-06-28
    • 2018-11-02
    相关资源
    最近更新 更多