Использование extract-text-webpack-plugin, стиль (less, scss) не работает - PullRequest
0 голосов
/ 18 мая 2018

Невозможно скомпилировать и запустить приложение с более чем 8 модулями, используя webpack 4 и ленивую загрузку с AOT.

Если я использую ExtractTextWebpackPlugin для извлечения меньшего количества файлов, то webpack зависает на 70% и не выдает никакой ошибки.В то же время я удаляю ExtractTextWebpackPlugin и удаляю все таблицы стилей из приложения, после чего веб-пакет работает правильно.

У меня есть следующие зависимости в файле package.json:

  "devDependencies": {
    "@angular/compiler-cli": "5.2.9",
    "@angularclass/hmr": "2.1.3",
    "@angularclass/hmr-loader": "3.0.4",
    "@ngtools/webpack": "6.0.0-rc.5",
    "@types/node": "7.0.7",
    "angular-mocks": "^1.6.2",
    "angular-router-loader": "0.8.5",
    "angular2-template-loader": "0.6.2",
    "autoprefixer": "8.2.0",
    "awesome-typescript-loader": "5.0.0",
    "browserify": "^14.1.0",
    "clean-webpack-plugin": "0.1.19",
    "compression-webpack-plugin": "1.1.11",
    "copy-webpack-plugin": "4.5.1",
    "css-hot-loader": "^1.3.9",
    "css-loader": "0.28.11",
    "css-to-string-loader": "^0.1.3",
    "csso-webpack-plugin": "1.0.0-beta.10",
    "del": "latest",
    "gulp": "^3.9.1",
    "gulp-sass": "latest",
    "gulp-sourcemaps": "latest",
    "gulp-tslint": "latest",
    "gulp-typescript": "latest",
    "html-loader": "0.5.4",
    "html-webpack-plugin": "2.30.1",
    "http-server": "^0.10.0",
    "iso-morphic-style-loader": "2.0.1",
    "jasmine-core": "^2.6.4",
    "karma": "2.0.0",
    "karma-browserify": "^5.1.1",
    "karma-chrome-launcher": "^2.0.0",
    "karma-coverage": "^1.1.1",
    "karma-firefox-launcher": "^1.0.0",
    "karma-jasmine": "1.1.1",
    "karma-phantomjs-launcher": "1.0.4",
    "karma-sourcemap-loader": "0.3.7",
    "karma-webpack": "2.0.9",
    "less": "2.7.3",
    "less-loader": "4.0.5",
    "merge-jsons-webpack-plugin": "1.0.14",
    "mini-css-extract-plugin": "^0.4.0",
    "postcss-loader": "^1.2.0",
    "pushstate-server": "3.0.1",
    "raw-loader": "^0.5.1",
    "remap-istanbul": "^0.9.1",
    "replace-webpack-plugin": "0.1.2",
    "string-replace-loader": "2.1.1",
    "style-loader": "^0.13.2",
    "systemjs": "^0.19.27",
    "systemjs-builder": "latest",
    "to-string-loader": "^1.1.4",
    "ts-helpers": "1.1.2",
    "tslint": "latest",
    "typescript": "2.8.3",
    "typings": "2.1.1",
    "uglifyjs-webpack-plugin": "1.2.4",
    "watchify": "^3.9.0",
    "webpack": "4.5.0",
    "webpack-cli": "2.0.14",
    "webpack-merge": "4.1.2"
  }

, и следующим является webpack.config.jsфайл:

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

var Autoprefixer = require('autoprefixer');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var CopyWebpackPlugin = require('copy-webpack-plugin');
var CleanWebpackPlugin = require('clean-webpack-plugin');
var helpers = require('./webpack.helpers');
var MergeJsonWebpackPlugin = require("merge-jsons-webpack-plugin");
var AngularCompilerPlugin = require('@ngtools/webpack').AngularCompilerPlugin;
var UglifyJsPlugin = require('uglifyjs-webpack-plugin');
var ReplacePlugin = require('replace-webpack-plugin');

module.exports = function (options)
{

    isProd = options.env === 'production';
    return {
        mode: options.env,
        entry: {
            'polyfills': './polyfills.ts',
            'intl': './datetimepolyfills.ts',
            'globals': [
                'reflect-metadata',
                'rxjs'
            ],
            'app': './public/app/main.ts', // our angular app
            'style': './public/assets/style/app.less'
        },
        output: {
            path: path.join(__dirname, 'wwwroot/'),
            filename: 'app/[name]-[hash].bundle.js',
            publicPath: "/"
        },

        resolve: {
            modules: [
                'node_modules',
                path.resolve(__dirname, 'app')
            ],
            extensions: ['.ts', '.js', '.json', '.css', '.less', '.html']
        },
        module: {
            rules:
                [
                    {
                        test: /\.ts$/,
                        loaders:
                            [
                                '@ngtools/webpack',
                                'awesome-typescript-loader',
                                'angular2-template-loader?keepUrl=true',
                                'angular-router-loader'
                            ]
                    },
                    {
                        test: /\.html$/,
                        loader: 'html-loader'
                    },
                    {
                        test: /\.css$/,
                        loader: 'css-to-string-loader!iso-morphic-style-loader!css-loader'
                    },
                    {
                        test: /\.scss$/,
                        include: /node_modules/,
                        loader: 'css-to-string-loader!iso-morphic-style-loader!raw-loader'
                    },
                    {
                        test: /\.less$/,
                        exclude: helpers.root('node_modules', 'app'),
                        loader: ExtractTextPlugin.extract({
                            fallback: 'style-loader',
                            use: ['to-string-loader', 'css-loader', 'less-loader']
                        })
                    },
                    {
                        test: /\.scss$/,
                        exclude: /node_modules/,
                        loaders: ['iso-morphic-style-loader', 'css-loader', 'sass-loader']
                    },
                    {
                        test: /\.(png|jpg|gif|ico|woff|woff2|ttf|svg|eot|json)$/,
                        exclude: /node_modules/,
                        loader: "file?name=assets/[name]-[hash:6].[ext]",
                    }
                ],
        },

        plugins: [
            new CleanWebpackPlugin(
                [
                    './wwwroot'
                ]
            ),
            new ExtractTextPlugin("./assets/[name].css"),
            new AngularCompilerPlugin({
                tsConfigPath: './tsconfig.json',
                entryModule: 'public/app/app.module#AppModule',
                skipMetadataEmit: true
            }),

            new CopyWebpackPlugin([{
                from: './node_modules/syx-general-components/src/fonts/**',
                to: "./assets/fonts/",
                flatten: true
            }]),
            new CopyWebpackPlugin([{
                from: './node_modules/syx-general-components/src/scripts/**',
                to: "./assets/scripts/",
                flatten: true
            }]),
            new CopyWebpackPlugin([{
                from: './node_modules/syx-general-components/src/img/**',
                to: "./assets/img/",
                flatten: true
            }]),
            new CopyWebpackPlugin([{
                from: './public/assets/docs/*.*',
                to: "./assets/docs/",
                flatten: true
            }]),
            new CopyWebpackPlugin([{
                from: './public/assets/img/*.*',
                to: "./assets/img/",
                flatten: true
            }]),
            new CopyWebpackPlugin([{
                from: './public/config/*.*',
                to: "./config/",
                flatten: true
            }]),
            new ReplacePlugin({
                entry: './public/index.html',
                hash: '[hash]',
                output: './wwwroot/index.html'
            }),
            new CopyWebpackPlugin([{
                from: './public/print-ticket.html',
                to: "./",
                flatten: true
            }]),
            new CopyWebpackPlugin([{
                from: './public/assets/scripts/**',
                to: "./assets/scripts/",
                flatten: true
            }]),
            new CopyWebpackPlugin([{
                from: './public/favicon*',
                to: "./",
                flatten: true
            }]),
            new CopyWebpackPlugin([{
                from: './public/favicon_*.*',
                to: "./",
                flatten: true
            }]),
            new webpack.optimize.ModuleConcatenationPlugin(),
            new MergeJsonWebpackPlugin({
                "output": {
                    "groupBy": [{
                        "pattern": "{./public/assets/locale/*-nl.json,./node_modules/syx-general-components/src/locale/*-nl.json}",
                        "fileName": "./assets/locale/locale-nl.json"
                    },
                    {
                        "pattern": "{./public/assets/locale/*-en.json,./node_modules/syx-general-components/src/locale/*-en.json}",
                        "fileName": "./assets/locale/locale-en.json"
                    },
                    {
                        "pattern": "{./public/assets/locale/*-fr.json,./node_modules/syx-general-components/src/locale/*-fr.json}",
                        "fileName": "./assets/locale/locale-fr.json"
                    }
                    ]
                }
            })
        ],
        optimization: {
            noEmitOnErrors: true,
            minimize: true,
            minimizer: [
                // we specify a custom UglifyJsPlugin here to get source maps
                new UglifyJsPlugin({
                    cache: true,
                    parallel: true,
                    uglifyOptions: {
                        compress: true,
                        ecma: 5,
                        mangle: true
                    },
                    sourceMap: false
                })
            ]
        },
        devServer: {
            historyApiFallback: true,
            stats: 'minimal',
            outputPath: path.join(__dirname, 'wwwroot/')
        }
    }
};

Если я использую ExtractTextWebpackPlugin, чтобы извлечь меньше файлов, то веб-пакет зависает на 70%.В то же время я удаляю ExtractTextWebpackPlugin и удаляю все таблицы стилей из приложения, после чего веб-пакет работает правильно.

Может кто-нибудь помочь с этим?

...