Объединение SCSS и CSS в один файл с помощью WebPack


Я новичок в webpack, и мне трудно понять, как я могу взять кучу scss-файлов и css-файлов и объединить их вместе с webpack (после транспонирования sass, конечно).

С gulp, это было действительно очевидно, как я могу иметь 1 шаг транспилировать sass в css, а затем шаг после этого, чтобы объединить их вместе. Однако с webpack, похоже, все происходит одновременно.

Это довольно основное требование, которое, я уверен, имеет очевидный смысл. ответьте тем, кто более опытен.

Я дошел до того, что могу успешно вывести транспилированный scss в css и отдельно вывести файл css из CSS input, но я не могу понять, как склеить их вместе с помощью webpack.

Ниже мой webpack.конфиг.файл js:

const path = require('path');
const webpack = require('webpack');

var ExtractTextPlugin = require('extract-text-webpack-plugin');

const extractCSS = new ExtractTextPlugin('extractedCSS.css');

const extractSass = new ExtractTextPlugin({
    filename: "extractedSASS.css",
    disable: process.env.NODE_ENV === "development"
});

module.exports = function (env) {
    return {
        context: path.resolve(__dirname, './wwwroot/app'),
        entry: {
            main: './index.js',
            vendor: 'moment'
        },
        output: {
            filename: '[name].[chunkhash].js',
            path: path.resolve(__dirname, './wwwroot/mytempdist')
        },
        module: {
            rules: [{
                test: /.css$/,
                use: extractCSS.extract({
                    use: 'css-loader'
                })
            },
            {
                test: /.scss$/,
                use: extractSass.extract({
                    use: [{
                        loader: "css-loader"
                    }, {
                        loader: "sass-loader"
                    }],
                    // use style-loader in development
                    fallback: "style-loader"
                })
            }
            ]
        },
        plugins: [
            new webpack.optimize.CommonsChunkPlugin({
                name: 'vendor',
                minChunks: function (module) {
                    // this assumes your vendor imports exist in the node_modules directory
                    return module.context && module.context.indexOf('node_modules') !== -1;
                }
            }),
            //CommonChunksPlugin will now extract all the common modules from vendor and main bundles
            new webpack.optimize.CommonsChunkPlugin({
                name: 'manifest' //But since there are no more common modules between them we end up with just the runtime code included in the manifest file
            }),
            //new webpack.optimize.UglifyJsPlugin({
            //    sourceMap: options.devtool && (options.devtool.indexOf("sourcemap") >= 0 || options.devtool.indexOf("source-map") >= 0)
            //}),
            extractSass,
            extractCSS
        ],
        devtool: 'inline-source-map'
    }
}

Как я могу изменить вышесказанное, чтобы и sass, и css вошли в выходной файл css?

Если это имеет значение, ниже приводится выдержка из моего индекса.JS файл (точка входа) toastr-это пакет npm, а pace - это просто обычный загруженный css-файл:

var toastr = require('toastr');
import 'toastr/toastr.scss';

import pace from './../lib/pace/pace.min.js';
import './../lib/pace/pace.css';
1 2

1 ответ:

У вас есть 2 экземпляра Extractextplugin, определенных с явными именами, и вы используете эти отдельные экземпляры для загрузки файлов css и scss соответственно.

Вам нужен только 1 экземпляр плагина, который будет накапливать все CSS и только одно правило для файлов scss и css.

{
    test: /\.s?css$/,
    use: ExtractTextPlugin.extract({
        fallback: 'style-loader',
        use: ['css-loader', 'sass-loader']
    })
}

Это будет обрабатывать как scss, так и css файлы и поместить все это в один выходной файл CSS.