2015-06-25 5 views
17

Ich habe mein Webpack eine große main.js-Datei (1,7 MB) mit einem kleinen Projekt von ~ 20-30 Dateien weniger als 100 Zeilen generieren. Die Abhängigkeiten erforderlich sind gering an Zahl (Reaktion, Fluxible) und ich jede optimize Plugin verwende ich verstehen kann:Webpack Erstellen einer großen Datei mit kleinem Projekt

module.exports = { 
    output: { 
    path: './build', 
    publicPath: '/public/', 
    filename: '[name].js' 
    }, 
    debug: false, 
    devtool: 'eval', 
    target: 'web', 
    entry: [ 
    'bootstrap-sass!./bootstrap-sass.config.js', 
    './client.js', 
    ], 
    stats: { 
    colors: true, 
    reasons: false 
    }, 
    resolve: { 
    extensions: ['', '.js'], 
    alias: { 
     'styles': __dirname + '/src/styles', 
     'components': __dirname + '/src/scripts/components', 
     'actions': __dirname + '/src/scripts/actions', 
     'stores': __dirname + '/src/scripts/stores', 
     'constants': __dirname + '/src/scripts/constants', 
     'mixins': __dirname + '/src/scripts/mixins', 
     'configs': __dirname + '/src/scripts/configs', 
     'utils': __dirname + '/src/scripts/utils' 
    } 
    }, 
    module: { 
    loaders: [ 
     { test: /\.css$/, loader: 'style!css' }, 
     { test: /\.js$/, exclude: /node_modules/, loader: require.resolve('babel-loader') }, 
     { test: /\.json$/, loader: 'json-loader'}, 
     { test: /\.(png|svg|jpg)$/, loader: 'url-loader?limit=8192' }, 
     { test: /\.(ttf|eot|svg|woff|woff(2))(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: "url?name=/[name].[ext]"}, 
     { test: /\.scss$/, 
     loader: ExtractTextPlugin.extract('style-loader', 
      'css!sass?outputStyle=expanded&' + 
      "includePaths[]=" + 
      (path.resolve(__dirname, "./node_modules")) 
     ) 
     } 
    ] 
    }, 
    plugins: [ 
    new webpack.NoErrorsPlugin(), 
    new webpack.ProvidePlugin({ 
     $: "jquery", 
     jQuery: "jquery", 
     "windows.jQuery": "jquery" 
    }), 
    new ExtractTextPlugin("[name].css", {allChunks: true}), 
    new webpack.optimize.DedupePlugin(), 
    new webpack.optimize.UglifyJsPlugin(), 
    new webpack.optimize.OccurenceOrderPlugin(), 
    new webpack.optimize.AggressiveMergingPlugin() 
    ], 

}; 

Was mache ich falsch oder wo kann ich weiterhin die Größe der Datei verbessern?

Antwort

9

Sie sollten mindestens

plugins: [ 
    new webpack.DefinePlugin({ 
    'process.env': { 
     // This has effect on the react lib size 
     'NODE_ENV': JSON.stringify('production'), 
    } 
    }), 
    ... 
], 

gesetzt, die wesentlich mit Reagieren helfen.

Zusätzlich ist die Einstellung devtool auf source-map in der Produktionsumgebung vorzuziehen. Weitere Informationen finden Sie unter official documentation.

Sie könnten versuchen, die Ausgabe mit the analyse tool zu überprüfen. Um den JSON zu erhalten, müssen Sie etwas wie machen und dann das stats.json an das Tool übergeben. Das könnte dir einen Einblick geben.

+0

Ja definitiv werde ich einen Blick darauf werfen und sehen, wie es den Code beeinflusst. Außerdem habe ich meinen Fehler gefunden, den ich vorschlagen würde, der Antwort hinzuzufügen, ich habe 'Devtools: true' gemacht, was meine Datei sehr groß gemacht hat, während sie für die Produktion nicht wahr sein muss. –

+1

Cool, ich habe das hinzugefügt. Habe 'Devtool' komplett vergessen. –

+0

Eine alternative, Kommandozeilen-Tool für Webpack-Bundle-Analyse: https://github.com/robertknight/webpack-bundle-size-analyzer – jmu

13

Ich habe meine Reaktion runter von 2,1mb herunter auf 160kb gezippt, nur indem ich die Dinge hier (Devtools: 'source-map'), mit Uglifyjs mit den Standardeinstellungen (ohne gzip es ist etwa 670kb).

Es ist wahrscheinlich nicht dass groß, aber zumindest ist es nicht mehr verrückt.

Für die Nachwelt hier ist mein webpack config:

// webpack.config.js 
var webpack = require('webpack'); 

module.exports = { 
    devtool: 'source-map', 
    entry: [ 
     'webpack-dev-server/client?http://127.0.0.1:2992', 
     'webpack/hot/only-dev-server', 
     './js/main' 
    ], 
    output: { 
     path: './out/', 
     filename: 'main.js', 
     chunkFilename: '[name]-[chunkhash].js', 
     publicPath: 'http://127.0.0.1:2992/out/' 
    }, 
    module: { 
     loaders: [ 
      { 
       test: /\.jsx?$/, 
       exclude: /(node_modules|bower_components)/, 
       loaders: ['react-hot', 'babel?optional=runtime&stage=0&plugins=typecheck'] 
      } 
     ] 
    }, 
    progress: true, 
    resolve: { 
     modulesDirectories: [ 
      'js', 
      'node_modules' 
     ], 
     extensions: ['', '.json', '.js'] 
    }, 
    plugins: [ 
     new webpack.HotModuleReplacementPlugin(), 
     new webpack.NoErrorsPlugin(), 
     new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), 
     new webpack.DefinePlugin({ 
      'process.env': { 
       // This has effect on the react lib size 
       'NODE_ENV': JSON.stringify('production'), 
      } 
     }), 
     new webpack.optimize.UglifyJsPlugin() 
    ] 
}; 
+1

Mein Projekt führt zu einer ähnlichen Dateigröße wie Ihre, und ebenso ist es nicht verrückt, aber dann wieder Meine Website hat kaum etwas, also erwarte ich, dass die Dateigröße immer noch viel kleiner ist. Ich verbinde es; überprüfe z.B. package.json darin, um zu sehen, ob es irgendetwas gibt, das Ihr Projekt auch verwendet, das viel Platz einnehmen könnte: https://github.com/amcsi/szeremi/tree/f93671a –

+0

Ich nahm das HotModuleReplacementPlugin für mein Prod-Release heraus –

+0

Warum nimmst du ein devtool für einen Produktions-Build? Dies sollte auf falsch gesetzt werden ... –

5

Sie können auch einen Blick auf Webpack Bundle Analyzer nehmen.

Es stellt Bündelinhalt als bequeme interaktive zoombare treemap dar.

Verwandte Themen