сжатие ReactJS bundle.js

#reactjs #webpack #build

#reactjs #webpack #сборка

Вопрос:

Привет, у меня есть приложение ReactJS. Я тоже использую webpack. Когда я запускаю npm run build , мое приложение объединяется и сохраняется.

Теперь мой build.js составляет около 60 МБ.

Есть ли способ сжать или уменьшить это?

Заранее спасибо

Обновить:

У меня много импортированных пакетов. должен ли я также опубликовать package.json?

webpack.config

 const path = require('path');
const webpack = require('webpack');
const CopyWebpackPlugin = require('copy-webpack-plugin');


const settings = {
    entry: {
        bundle: [
            'babel-polyfill',
            'whatwg-fetch',
            'react-hot-loader/patch',
            './src/frontend/Index.js'
        ]
    },
    output: {
        filename: '[name].js',
        publicPath: '/',
        path: path.resolve('build')
    },
    resolve: {
        extensions: ['.js', '.json', '.css']
    },
    devtool: 'eval-source-map',
    module: {
        rules: [
            {
                test: /.js?$/,
                loader: 'babel-loader',
                options: {
                    presets: [
                        ['es2015', {modules: false}],
                        'stage-0',
                        'stage-2',
                        'react'
                    ],
                    plugins: [
                        'transform-node-env-inline'
                    ],
                    env: {
                        development: {
                            plugins: ['react-hot-loader/babel']
                        }
                    }
                }
            },
            {
                test: /.scss$/,
                use: [{
                    loader: 'style-loader' // creates style nodes from JS strings
                }, {
                    loader: 'css-loader' // translates CSS into CommonJS
                }, {
                    loader: 'sass-loader' // compiles Sass to CSS
                }]
            },
            {
                test: /.(woff|woff2)(?v=d .d .d )?$/,
                loader: 'url-loader?limit=10000amp;mimetype=application/font-woff'
            },
            {
                test: /.woff2(?v=d .d .d )?$/,
                loader: 'url-loader?limit=10000amp;mimetype=application/font-woff'
            },
            {
                test: /.ttf(?v=d .d .d )?$/,
                loader: 'url-loader?limit=10000amp;mimetype=application/octet-stream'
            },
            {
                test: /.eot(?v=d .d .d )?$/,
                loader: 'file-loader'
            },
            {
                test: /.svg(?v=d .d .d )?$/,
                loader: 'url-loader?limit=10000amp;mimetype=image/svg xml'
            },
            {
                test: /.(jpe?g|png|gif)$/i,
                loaders: ['file-loader?context=src/imagesamp;name=images/[path][name].[ext]', {
                    loader: 'image-webpack-loader',
                    query: {
                        mozjpeg: {
                            progressive: true
                        },
                        gifsicle: {
                            interlaced: false
                        },
                        optipng: {
                            optimizationLevel: 4
                        },
                        pngquant: {
                            quality: '75-90',
                            speed: 3
                        }
                    }
                }],
                exclude: /node_modules/,
                include: __dirname
            },
            {
                test: /.css$/,
                use: [
                    'style-loader',
                    {
                        loader: 'css-loader',
                        options: {
                            modules: true,
                            sourceMap: true,
                            importLoaders: 1,
                            localIdentName: '[name]--[local]--[hash:base64:8]'
                        }
                    },
                    'postcss-loader' // has separate config, see postcss.config.js nearby
                ]
            }
        ]
    },
    devServer: {
        contentBase: path.resolve('src/www'),
        publicPath: '/',
        port: 8080,
        quiet: false,
        hot: true,
        historyApiFallback: true,
        inline: true
    },
    plugins: [
        new webpack.HotModuleReplacementPlugin(),
        new webpack.NamedModulesPlugin(),
        new webpack.LoaderOptionsPlugin({
            debug: true
        }),
        new CopyWebpackPlugin([
            {from: 'src/www/'}
        ])
    ]
};

module.exports = settings;
  

Комментарии:

1. 60 МБ очень большой, даже для сборки разработки. Боюсь, трудно сказать, что может быть не так, без дополнительной информации.

2. Не могли бы вы опубликовать свою конфигурацию webpack?

3. если вы запускаете с mode:production, он уже все делает.

4. как я могу создать рабочую версию? просто npm run build mode:production ?

5. какую версию webpack вы используете?

Ответ №1:

Существуют плагины, которые можно использовать для уменьшения размера пакета приложений с помощью webpack с использованием производственного режима

 var CompressionPlugin = require("compression-webpack-plugin");

plugins: [
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': '"production"'
    }),
    new webpack.optimize.DedupePlugin(),
    new webpack.optimize.UglifyJsPlugin({
      mangle: true,
      compress: {
        warnings: false, // Suppress uglification warnings
        pure_getters: true,
        unsafe: true,
        unsafe_comps: true,
        screw_ie8: true
      },
      output: {
        comments: false,
      },
      exclude: [/.min.js$/gi] // skip pre-minified libs
    }),
    new webpack.IgnorePlugin(/^./locale$/, [/moment$/]),
    new webpack.NoErrorsPlugin(),
    new CompressionPlugin({
      asset: "[path].gz[query]",
      algorithm: "gzip",
      test: /.js$|.css$|.html$/,
      threshold: 10240,
      minRatio: 0
    })
  

Проверьте эти блоги:

https://hackernoon.com/optimising-your-application-bundle-size-with-webpack-e85b00bab579

https://developers.google.com/web/fundamentals/performance/webpack/decrease-frontend-size

Комментарии:

1. Это зависит от того, какую версию webpack вы используете, также вам необходимо установить каждый плагин перед его использованием. Webpack обновляет список плагинов -> webpack.js.org/plugins где вы можете найти более подробную информацию о том, как настроить каждый из них

Ответ №2:

В weboack.config измените devtool как пустой

devtool:''

Затем используйте плагин webpack bundle analyzer для анализа, какой модуль потребляет больше размера