Не удается получить Webpack 4 для разделения / фрагментации файлов Sass

#webpack #sass #webpack-4

#webpack #sass #webpack-4

Вопрос:

У меня есть ASP.Net Приложение MVC, в котором я пытаюсь создать таблицу стилей и файл javascript на страницу. Как и следовало ожидать, разные страницы будут использовать много общего кода, особенно стилей. Мы использовали Sass для стилизации, и я пытаюсь заставить Webpack дедуплицировать / разбивать код на общий код. Я также использую мини-css-extract-plugin, который, как мне кажется, может быть частью моей проблемы, но я отвлекся. Моя структура пути как таковая:

/assets
-/ js
-/styles
-/bootstrap
-/mixins
-/pages
—/page1
—-page1.scss
—/page2
—-page2.scss
-/utilities
—_general.scss
—_mixins.scss
—_utilities.scss
—app.scss


Мой файл app.css выглядит следующим образом:

 @import "./utilities/colors";
@import '~bootstrap/scss/functions';
@import './bootstrap/variables';
@import '~bootstrap/scss/bootstrap';
@import './bootstrap/selector-overrides';
@import './general';
@import "./mixins";
@import './utilities';
  

Итак, в верхней части page1.scss и page2.scss я должен импортировать этот файл app.scss. Это приводит к тому, что практически все в app.scss добавляется к каждому файлу, в результате чего их размер достигает 900 кб.

Я попытался установить этот файл app.scss в качестве отдельной точки входа и удалить импорт, но тогда страницы не могут быть собраны, потому что у них нет доступа к этим значениям во время сборки.

Я пробовал несколько разных конфигураций конфигурации splitChunks, но безуспешно.

Это мой текущий файл webpack.config.ts:

 import * as path from 'path';
import * as webpack from 'webpack';
import CleanWebpackPlugin from 'clean-webpack-plugin';
import * as ExtractCssChunks from 'extract-css-chunks-webpack-plugin';

const config: webpack.Configuration = {
    mode: 'development',
    devtool: 'inline-source-map',
    entry: {
      app: ['./assets/js/index.js'],
      page1: ['./assets/js/pages/page1.ts'],
      page2: ['./assets/js/pages/page2.ts']
    },
    module: {
        rules: [
        {
            test: /.ts$/,
            loader: 'awesome-typescript-loader'
        },
        {
            test: /.scss$/,
            use: [
                ExtractCssChunks.loader,
                {
                    loader: 'css-loader',
                    options: {
                        importLoaders: 2
                    }
                },
                'postcss-loader',
                {
                    loader: 'sass-loader',
                    options: {
                        data: '$cloudinary_url: "";'
                    }
                }
            ]
        }
    ]
},
output: {
    chunkFilename: '[name].bundle.js',
    filename: '[name].bundle.js',
    library: 'LocalLib',
    path: path.resolve(__dirname, 'wwwroot', 'app')
},
optimization: {
    splitChunks: {
        chunks: 'all',
    }
},
plugins: [
    new CleanWebpackPlugin({
        cleanOnceBeforeBuildPatterns: ['**/*', path.join(process.cwd(), 'wwwroot/css/**/*')]
    }),
    new ExtractCssChunks({
        filename: "../css/[name].css",
        chunkFilename: "../css/[name].css"
    }),
    new webpack.EnvironmentPlugin({}),
    new webpack.ProvidePlugin({
        '$': "jquery",
        'jQuery': "jquery",
        'window.jQuery': "jquery"
    })
],
resolve: {
    extensions: ['.js', '.ts'],
    alias: {
        jquery: "jquery/src/jquery"
    }
}

};

export default config;
  

В конечном счете, мой вопрос заключается в следующем: как мне выделить общие стили в отдельный файл, который я могу загружать и кэшировать отдельно от отдельных файлов страниц. Могу ли я что-то сделать в Webpack для достижения этой цели или мне нужно определенным образом изменить порядок моих файлов Sass?

Заранее благодарю вас за любую помощь.