当前位置: 首页 > 知识库问答 >
问题:

如何最小化webpack的捆绑包的大小?

祖新觉
2023-03-14

我正在使用reactwebpack作为模块绑定器编写一个web应用程序。到目前为止,我的jsx代码非常轻,整个文件夹的大小是25kb。

然而,我的bundle.js是从webpack创建的,其大小为2.2MB。在使用-p标志运行优化后,它将捆绑包减少到700kb,这仍然非常大。

我已经查看了react.min.js文件,它的大小是130kb。

有没有可能webpack产生了这么大的文件,或者我做错了什么?

webpack.config.js

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

module.exports = {
  entry: './public/components/main.jsx',
  output: {
    path: __dirname + "/public",
    filename: 'bundle.js'
  },
  module: {
    loaders: [{
      test: /.jsx?$/,
      loader: 'babel-loader',
      exclude: /node_modules/,
      query: {
        presets: ['es2015', 'react']
      }
    }, {
      test: /\.css$/,
      loader: "style!css"
    }]
  }
};

编辑

package.json:

{
  "name": "XChange",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "main": "./bin/www",
  "devDependencies": {
    "body-parser": "~1.13.2",
    "cookie-parser": "~1.3.5",
    "debug": "~2.2.0",
    "express": "~4.13.1",
    "jade": "~1.11.0",
    "morgan": "~1.6.1",
    "serve-favicon": "~2.3.0",
    "react-dom": "~0.14.3",
    "react": "~0.14.3",
    "webpack": "~1.12.9",
    "babel-loader": "~6.2.0",
    "babel-core": "~6.2.1",
    "babel-preset-react": "~6.1.18",
    "babel-preset-es2015": "~6.1.18",
    "react-bootstrap": "~0.28.1",
    "material-ui": "~0.14.0-rc1",
    "history": "~1.13.1",
    "react-router": "~1.0.2",
    "style-loader": "~0.13.0",
    "css-loader": "~0.18.0"
  },
  "dependencies": {
    "express-validator": "~2.18.0",
    "mongoose": "~4.2.9",
    "kerberos": "~0.0.17",
    "bcrypt": "~0.8.5"
  }
}

共有3个答案

戎亦
2023-03-14

更新05/18:更新UGLIFYJsPlugin设置以更好地缩小

我使用下面的配置来缩小生产代码。

 plugins: [
    new webpack.DefinePlugin({
      'process.env': {
        // This has effect on the react lib size
        'NODE_ENV': JSON.stringify('production'),
      }
    }),
    new ExtractTextPlugin("bundle.css", {allChunks: false}),
    new webpack.optimize.AggressiveMergingPlugin(),
    new webpack.optimize.OccurrenceOrderPlugin(),
    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,
        conditionals: true,
        unused: true,
        comparisons: true,
        sequences: true,
        dead_code: true,
        evaluate: true,
        if_return: true,
        join_vars: true
      },
      output: {
        comments: false,
      },
      exclude: [/\.min\.js$/gi] // skip pre-minified libs
    }),
    new webpack.IgnorePlugin(/^\.\/locale$/, [/moment$/]), 
    new CompressionPlugin({
      asset: "[path].gz[query]",
      algorithm: "gzip",
      test: /\.js$|\.css$|\.html$/,
      threshold: 10240,
      minRatio: 0
    })
  ],
柯建修
2023-03-14

01/2017编辑-我已经了解了更多关于不同的Webpack插件,并想更新这个。事实证明,UglifyJS有一大堆配置选项,这些选项似乎不是很主流,但会对您的捆绑包大小产生巨大影响。这是我当前的配置,有一些注释(网站上的文档很棒):

 new webpack.optimize.UglifyJsPlugin({
      comments: false, // remove comments
      compress: {
        unused: true,
        dead_code: true, // big one--strip code that will never execute
        warnings: false, // good for prod apps so users can't peek behind curtain
        drop_debugger: true,
        conditionals: true,
        evaluate: true,
        drop_console: true, // strips console statements
        sequences: true,
        booleans: true,
      }
    })

我曾经遇到过一个关于转义unicode字符的uglify-inization的模糊问题,所以如果您使用这些转换,请注意,类似于这种情况的边缘情况是可能的。

您可以在webpack文档中阅读更多关于webpack支持的特定选项webpack,并提供一些后续链接以进一步阅读。

(旁注:我认为您的package.json是混淆的……我看到的每个package.json(例如react starter工具包)中至少有几个开发依赖项是依赖项)

如果您正在为生产做准备,那么还需要采取一些步骤来降低文件大小。下面是我的webpack.config.js的剪贴画:

 plugins: [


        new webpack.optimize.UglifyJsPlugin(),
        new webpack.optimize.DedupePlugin(),
        new webpack.DefinePlugin({
            'process.env': {
                'NODE_ENV': JSON.stringify('production')
            }
        })
    ],

1) 缩小/丑化您的代码

2)替换重复的代码以最小化文件大小

3)告诉webpack省略一些它用于节点环境构建的东西

最后,如果您使用源映射(您可能应该这样做),您将需要添加适当的行。Sentry为此写了一篇很好的博客文章。

在我的构建中,我使用devtool:'source-map'进行生产

吴镜
2023-03-14

根据您的评论,您正在使用材质uireact bootstrap。这些依赖项与您的reactreact-dom包一起通过webpack打包。无论何时需要导入包,它都会作为捆绑包文件的一部分进行捆绑。

这是我的猜测。您可能正在使用库方式导入react引导material ui组件:

import { Button } from 'react-bootstrap';
import { FlatButton } from 'material-ui';

这非常好用,但它不仅捆绑了ButtonFlatButton(及其依赖项),而且还捆绑了整个库。

缓解它的一种方法是尝试只导入需要所需要的东西,比方说组件方式。使用相同的例子:

import Button from 'react-bootstrap/lib/Button';
import FlatButton from 'material-ui/lib/flat-button';

这将仅捆绑按钮扁平按钮及其各自的依赖项。但不是整个图书馆。因此,我将尝试摆脱所有库导入,改用组件方式。

如果您没有使用很多组件,那么它应该会大大减少捆绑文件的大小。

作为进一步的解释:

当您使用库的方式时,您将导入所有这些反应引导和所有这些材料UI组件,而不管您实际使用的是哪一个。

 类似资料:
  • 所以我能够将我的捆绑包大小从13mb减少到681 mb 我做了一些优化,比如正确的生产配置,优化库,比如lodash,用date fns替换momentjs。 现在,大多数软件包都不超过1mb,并且大多数都是由npm安装的依赖项。 在这里使用webpack-bundle-Analyzer就是我的bundle现在的样子 你们觉得我能做些什么来减少包裹的大小吗?也许删除jquery并转到vanilla

  • 问题内容: 我正在使用和作为模块捆绑程序编写一个Web应用程序。到目前为止,我的代码还很轻巧,整个文件夹的大小为25 kb。 我创建的虽然是2.2 mb。使用标志运行优化后,它将捆绑包减少到700kb,这仍然非常大。 我调查了文件,文件大小为130kb。 Webpack是否可能产生如此大的文件,或者我做错了什么? webpack.config.js 编辑 package.json: 问题答案: 根

  • 我有一个使用react开发的网站,它只有一个页面,但产品包大小是1.11MIB。我正在使用firestore、firebase storage、material UI、react redux,该应用程序运行良好,除了捆绑包大小外,一切正常。 我的网页包配置文件 我不知道我在这里错过了什么来减小节点模块的大小。如果我们有任何其他选择,以减少捆绑大小,请给我一个建议。

  • 问题内容: 这是我的 我正在与 在我的文件夹中,我只会 我也想看看未压缩的 问题答案: webpack.config.js : 自从Webpack 4 被弃用以来,其使用导致错误: webpack.optimize.UglifyJsPlugin已被删除,请改用config.optimization.minimize 如手册所述,可以使用选项替换插件。通过指定实例,可以向插件提供自定义配置: 这样就

  • 我有一个Gatsby.js项目,其中我的包的解析大小是3.92MB。其中1.1MB是。传单似乎也提供了只有508KB的。阅读本期后,每当我导入传单时,我总是导入较小的版本,如下所示: 不管怎样,每当我运行Webpack Bundle Analyzer时,都会导入和:Webpack Bundle Analyzer Result 我提到的GitHub问题似乎暗示了如何配置webpack以使用优化版本,

  • 问题内容: 我已经为此花了好一会儿,想知道是否有可能从头开始。感谢您对此的任何帮助! npm包 我有一个npm包,它基本上是一个React组件库。该库具有嵌入式样式表,该样式表引用了CSS中的资源,例如字体和图像。然后将所有这些都使用webpack捆绑到中。 的配置如下所示: 随着看起来像: 到目前为止,一切都很好。 应用程序 现在,在另一个代码库中,我有了主应用程序,该应用程序安装了该npm软件