Webpack没有缩小文件

时间:2017-12-05 17:26:53

标签: webpack

我已经实现了webpack,因为角度页面加载速度太慢(需要1m +才能加载)。由webpack生成的捆绑app.js非常庞大(大约27MB)。因此尝试使用uglify插件缩小文件但无法获得该文件。

使用了下面的webpack配置,但是文件没有使用UglifyJsPlugin缩小。如果我遗失了什么,请你帮忙。

提前感谢您的帮助和感谢。

代码 -

    // Helper: root() is defined at the bottom
    var path = require('path');
    var webpack = require('webpack');

    // Webpack Plugins
    var CommonsChunkPlugin = webpack.optimize.CommonsChunkPlugin;
    var autoprefixer = require('autoprefixer');
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    var ExtractTextPlugin = require('extract-text-webpack-plugin');
    var CopyWebpackPlugin = require('copy-webpack-plugin');

    var ENV = process.env.npm_lifecycle_event;
    var isTestWatch = ENV === 'test-watch';
    var isTest = ENV === 'test' || isTestWatch;
    var isProd = ENV === 'build';

    module.exports = function makeWebpackConfig() {
    var config = {};

    if (isProd) {
        config.devtool = 'source-map';
    }
    else if (isTest) {
        config.devtool = 'inline-source-map';
    }
    else {
        config.devtool = 'eval-source-map';
    }

    if (!isTest) {

        config.entry = isTest ? {} : {
            'polyfills': './src/polyfills.ts',
            'vendor': './src/vendor.ts',
            'app': './src/main.ts' // our angular app
        };
    }

    config.output = isTest ? {} : {
        path: root('dist'),
        publicPath: isProd ? '/' : 'http://localhost:8080/',
        filename: isProd ? 'js/[name].[hash].js' : 'js/[name].js',
        chunkFilename: isProd ? '[id].[hash].chunk.js' : '[id].chunk.js'
    };

    config.resolve = {
        // only discover files that have those extensions
        extensions: ['.ts', '.js', '.json', '.css', '.scss', '.html'],
    };

    var atlOptions = '';
    if (isTest && !isTestWatch) {

        atlOptions = 'inlineSourceMap=true&sourceMap=false';
    }


    config.module = {
        rules: [
          // Support for .ts files.
          {
              test: /\.ts$/,
              loaders: ['awesome-typescript-loader?' + atlOptions, 'angular2-template-loader', '@angularclass/hmr-loader'],
              exclude: [isTest ? /\.(e2e)\.ts$/ : /\.(spec|e2e)\.ts$/, /node_modules\/(?!(ng2-.+))/]
          },

          // copy those assets to output
          {
              test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
              loader: 'file-loader?name=fonts/[name].[hash].[ext]?'
          },

          // Support for *.json files.
          { test: /\.json$/, loader: 'json-loader' },

          // Support for CSS as raw text
          // use 'null' loader in test mode (https://github.com/webpack/null-loader)
          // all css in src/style will be bundled in an external css file
          {
              test: /\.css$/,
              exclude: root('src', 'app'),
              loader: isTest ? 'null-loader' : ExtractTextPlugin.extract({ fallback: 'style-loader', use: ['css-loader', 'postcss-loader'] })
          },
          // all css required in src/app files will be merged in js files
          { test: /\.css$/, include: root('src', 'app'), loader: 'raw-loader!postcss-loader' },

          // support for .scss files
          // use 'null' loader in test mode (https://github.com/webpack/null-loader)
          // all css in src/style will be bundled in an external css file
          {
              test: /\.(scss|sass)$/,
              exclude: root('src', 'app'),
              loader: isTest ? 'null-loader' : ExtractTextPlugin.extract({ fallback: 'style-loader', use: ['css-loader', 'postcss-loader', 'sass-loader'] })
          },
          // all css required in src/app files will be merged in js files
          { test: /\.(scss|sass)$/, exclude: root('src', 'style'), loader: 'raw-loader!postcss-loader!sass-loader' },

          // support for .html as raw text
          // todo: change the loader to something that adds a hash to images
          { test: /\.html$/, loader: 'raw-loader', exclude: root('src', 'public') }
        ]
    };

    if (isTest && !isTestWatch) {
        // instrument only testing sources with Istanbul, covers ts files
        config.module.rules.push({
            test: /\.ts$/,
            enforce: 'post',
            include: path.resolve('src'),
            loader: 'istanbul-instrumenter-loader',
            exclude: [/\.spec\.ts$/, /\.e2e\.ts$/, /node_modules/]
        });
    }

    if (!isTest || !isTestWatch) {
        // tslint support
        config.module.rules.push({
            test: /\.ts$/,
            enforce: 'pre',
            loader: 'tslint-loader'
        });
    }


    config.plugins = [
      // Define env variables to help with builds
      // Reference: https://webpack.github.io/docs/list-of-plugins.html#defineplugin
      new webpack.DefinePlugin({
          // Environment helpers
          'process.env': {
              ENV: JSON.stringify(ENV)
          }
      }),

      // Workaround needed for angular 2 angular/angular#11580
      new webpack.ContextReplacementPlugin(
        // The (\\|\/) piece accounts for path separators in *nix and Windows
        /angular(\\|\/)core(\\|\/)@angular/,
        root('./src') // location of your src
      ),

      // Tslint configuration for webpack 2
      new webpack.LoaderOptionsPlugin({
          options: {

              tslint: {
                  emitErrors: false,
                  failOnHint: false
              },

              sassLoader: {
                  //includePaths: [path.resolve(__dirname, "node_modules/foundation-sites/scss")]
              },

              postcss: [
                autoprefixer({
                    browsers: ['last 2 version']
                })
              ]
          }
      })
    ];

    if (!isTest && !isTestWatch) {
        config.plugins.push(
          // Generate common chunks if necessary
          // Reference: https://webpack.github.io/docs/code-splitting.html
          // Reference: https://webpack.github.io/docs/list-of-plugins.html#commonschunkplugin
          new CommonsChunkPlugin({
              name: ['vendor', 'polyfills']
          }),

          // Inject script and link tags into html files
          // Reference: https://github.com/ampedandwired/html-webpack-plugin
          new HtmlWebpackPlugin({
              template: './src/public/index.html',
              chunksSortMode: 'dependency'
          }),

          //new webpack.optimize.UglifyJsPlugin({ sourceMap: true, mangle: { keep_fnames: true } }),

          new webpack.optimize.UglifyJsPlugin({
              mangle: true,
              compress: {
                  sequences: true,
                  dead_code: true,
                  conditionals: true,
                  booleans: true,
                  unused: true,
                  if_return: true,
                  join_vars: true,
                  drop_console: true
              }
          }),

          // Extract css files
          // Reference: https://github.com/webpack/extract-text-webpack-plugin
          // Disabled when in test mode or not in build mode
          new ExtractTextPlugin({ filename: 'css/[name].[hash].css', disable: !isProd })
        );
    }

    // Add build specific plugins
    if (isProd) {
        config.plugins.push(
          // Reference: http://webpack.github.io/docs/list-of-plugins.html#noerrorsplugin
          // Only emit files when there are no errors
          new webpack.NoEmitOnErrorsPlugin(),

          // // Reference: http://webpack.github.io/docs/list-of-plugins.html#dedupeplugin
          // // Dedupe modules in the output
          // new webpack.optimize.DedupePlugin(),

          // Reference: http://webpack.github.io/docs/list-of-plugins.html#uglifyjsplugin
          // Minify all javascript, switch loaders to minimizing mode
          //new webpack.optimize.UglifyJsPlugin({ sourceMap: true, mangle: { keep_fnames: true } }),

          new webpack.optimize.UglifyJsPlugin({
              mangle: true,
              compress: {
                  sequences: true,
                  dead_code: true,
                  conditionals: true,
                  booleans: true,
                  unused: true,
                  if_return: true,
                  join_vars: true,
                  drop_console: true
              }
          }),   // **this piece of code block is not minifying the js files.**


          // Copy assets from the public folder
          // Reference: https://github.com/kevlened/copy-webpack-plugin
          new CopyWebpackPlugin([{
              from: root('src/public')
          }])
        );
    }

    /**
     * Dev server configuration
     * Reference: http://webpack.github.io/docs/configuration.html#devserver
     * Reference: http://webpack.github.io/docs/webpack-dev-server.html
     */
    config.devServer = {
        contentBase: './src/public',
        historyApiFallback: true,
        quiet: true,
        stats: 'minimal' // none (or false), errors-only, minimal, normal (or true) and verbose
    };

    return config;
}();

// Helper functions
function root(args) {
    args = Array.prototype.slice.call(arguments, 0);
    return path.join.apply(path, [__dirname].concat(args));
}

0 个答案:

没有答案