【问题标题】:Why is my webpack bundle.js and vendor.bundle.js so incredibly big?为什么我的 webpack bundle.js 和 vendor.bundle.js 这么大?
【发布时间】:2016-05-26 08:03:08
【问题描述】:

我所有的 React 项目的文件都非常大(bundle.js 为 4.87 mb,vendor.bundle.js 为 2.87 mb)。我不知道为什么它这么大。我已经启用了 uglifyJS,但这似乎没有多大帮助(5.09 > 4.87mb 和 2.9 > 2.87mb)

var webpack = require('webpack');
var ExtractTextPlugin = require("extract-text-webpack-plugin");

require('es6-promise').polyfill();

var config = {
  entry: {
    app: [
      './src/entry.jsx'
    ],
    vendor: [
      'react',
      'lodash',
      'superagent'
    ]
  },
  output: {
    path: './build',
    filename: "bundle.js"
  },
  eslint: {
    configFile: './.eslintrc'
  },
  devtool: 'eval-source-map',
  module: {
    loaders: [
      { test: /\.(js|jsx)$/, loaders: ['react-hot', 'babel?experimental'], exclude: /node_modules/},
      { test: /\.(js|jsx)$/, loader: "eslint-loader", exclude: /node_modules/},
      { test: /\.json$/, loader: 'json' },
      { test: /\.yml$/, loader: 'json!yaml' },
      { test: /\.scss$/, loader: 'style!css!sass' },
      { test: /\.(png|woff|woff2|eot|ttf|svg)$/, loader: 'url-loader?limit=100000' }
    ]
  },
  plugins: [
    new webpack.DefinePlugin({'process.env': {'NODE_ENV': JSON.stringify('production')}}),
    new webpack.optimize.CommonsChunkPlugin("vendor", "vendor.bundle.js"),
    new webpack.optimize.UglifyJsPlugin({minimize: true}),
    new webpack.NoErrorsPlugin()
  ]
};

module.exports = config;

我的 package.json

{
  "license": "MIT",
  "engines": {
    "iojs": ">= 1.6.2"
  },
  "scripts": {
    "create:index": "mustang -t index.tmpl -i config.json -o build/index.html",
    "predev": "mkdir -p build/ && npm run create:index",
    "dev": "webpack-dev-server --host 0.0.0.0 --hot --progress --colors --content-base build",
    "backend": "NODE_ENV=production node server/server.js",
    "backend:dev": "DEBUG=tinderlicht node server/server.js",
    "predeploy": "mkdir -p build/ && npm run create:index",
    "deploy": "NODE_ENV=production webpack -p",
    "test": "node webpack-mocha.config.js"
  },
  "devDependencies": {
    "autoprefixer-loader": "^3.2.0",
    "axios": "^0.7.0",
    "babel": "^5.8.23",
    "babel-core": "^5.8.25",
    "babel-eslint": "^4.1.3",
    "babel-loader": "^5.3.2",
    "bluebird": "^2.10.2",
    "css-loader": "^0.19.0",
    "es6-collections": "^0.5.1",
    "es6-promise": "^3.0.2",
    "eslint": "^1.6.0",
    "eslint-loader": "^1.1.0",
    "eslint-plugin-react": "^3.5.1",
    "extract-text-webpack-plugin": "^0.8.2",
    "file-loader": "^0.8.1",
    "firebase": "^2.3.1",
    "fireproof": "^3.0.3",
    "jquery": "^2.2.0",
    "json-loader": "^0.5.1",
    "jsonld": "^0.4.2",
    "jsx-loader": "^0.13.2",
    "lodash": "^3.3.0",
    "mustang": "^0.1.3",
    "node-sass": "^3.3.3",
    "react": "^0.14.0",
    "react-dom": "^0.14.0",
    "react-hot-loader": "^1.1.5",
    "sass-loader": "3.0.0",
    "style-loader": "^0.12.4",
    "superagent": "^1.4.0",
    "url-loader": "^0.5.5",
    "webpack": "^1.5.3",
    "webpack-dev-server": "^1.7.0"
  },
  "dependencies": {
    "body-parser": "^1.15.0",
    "cors": "^2.7.1",
    "debug": "^2.2.0",
    "express": "^4.13.4",
    "mustache": "^2.2.1",
    "nodemailer": "^2.1.0",
    "nodemailer-sendmail-transport": "^1.0.0",
    "react-radio-group": "^2.2.0",
    "uglifyjs": "^2.4.10"
  }
}

有人知道如何解决这个问题吗?

【问题讨论】:

  • David Guan 的建议听起来不错。您正在使用 devtool: "eval-source-map",它提供了良好的开发人员体验,但它包含 整个源 作为数据 url。你不应该在生产中使用它。

标签: javascript build reactjs webpack


【解决方案1】:

我强烈推荐使用 Webpack Bundle Analyzer 来缩小你的 bundle (https://github.com/th0r/webpack-bundle-analyzer)。您可以看到是什么使您的捆绑包如此之大。您可能还使用了所有的 firebase、lodash 和 jquery。除了使用 webpack 生产插件之外,尝试使用忽略你不使用的任何内容并只导入你需要的内容,如下所示: 在 webpack 插件中:

    new webpack.IgnorePlugin(/^\.\/auth$/, /firebase$/),
    new webpack.IgnorePlugin(/^\.\/storage$/, /firebase$/),
    new webpack.IgnorePlugin(/^\.\/messaging$/, /firebase$/),

在您的导入中:

 const Firebase: any = require('firebase/app');  require('firebase/database');

对于 lodash,仅导入您需要的内容或进行自定义构建 (https://lodash.com/custom-builds):

import find from 'lodash/find' 

您也可以创建 jquery 自定义构建。

【讨论】:

    【解决方案2】:

    编辑

    我不确定您使用的是 Mac/IO 还是 Windows,但我注意到了两件事:

    1:"deploy": "NODE_ENV=production webpack -p" 看起来不正确,您必须在为开发和部署构建它时设置变量,而这里您没有设置它。

    2:您必须事先在终端/命令提示符下进行设置。

    这里有一个 webpack 缩小和部署的例子,你必须稍微适应一下,但我觉得这应该对你有帮助。

    您必须先在命令提示符下为节点设置此环境变量,然后在 windows 或终端中打开它,然后:

    Mac: export NODE_ENV=production
    
    Windows: set NODE_ENV=production
    

    您可以在windows中回显或在mac中列出来检查变量是否已添加。

    然后在你的 webpack.config.js 中

        var PROD = process.env.NODE_ENV == 'production';
        var config = {
          entry: {
                app: [
              './src/entry.jsx'
            ],
            vendor: [
              'react',
              'lodash',
              'superagent'
            ],
             output: {
               path: './build',
               filename: PROD ? "bundle.min.js" : "bundle.js"
             },
             plugins: PROD ? [
                  new webpack.optimize.UglifyJsPlugin({minimize: true}),
                  new webpack.optimize.CommonsChunkPlugin('vendor', 'vendor.min.js'),
              ]:[
                new webpack.optimize.CommonsChunkPlugin('vendor', 'vendor.js'),
              ]
    };
    

    在你的 package.json 中你可以设置这个脚本:

    如果您使用的是 Windows:

    "scripts": {
             "dev": "set NODE_ENV=development&&webpack-dev-server --host 0.0.0.0 --hot --progress --colors --content-base build",
            "deploy": "set NODE_ENV=production&&webpack -p"
        }
    

    如果您使用的是 Mac IOS: 如果此处导出不起作用,请改用 set,与 windows 和 mac 的区别在于 && 后面的空格。

    "scripts": {
             "dev": "export NODE_ENV=development&& webpack-dev-server --host 0.0.0.0 --hot --progress --colors --content-base build",
            "deploy": "export NODE_ENV=production&& webpack -p"
        }
    

    使用命令 npm run watch 在开发中构建,使用 npm run deploy 在缩小版本中构建它以用于生产。

    【讨论】:

    • NODE_ENV=production webpack -p 确实设置了环境变量。
    【解决方案3】:

    我有一个只有 React / React Dom 和一个 Hello Word React 组件的 repo 设置。 vendor.js 文件为 189 KB。

    https://github.com/timarney/react-setup

    var path = require('path')
    var webpack = require('webpack')
    
    var config = {
      entry: {
        app: path.resolve(__dirname, './src/main.js'),
        vendors: ['react']
      },
      output: {
        path: './src',
        filename: 'bundle.js'
      },
      devServer: {
        inline: true,
        contentBase: './src',
        port: 3000
      },
      module: {
        loaders: [
          {
            test: /\.js$/,
            exclude: /node_modules/,
            loader: 'babel'
          }
        ]
      },
      plugins: [
        new webpack.optimize.OccurenceOrderPlugin(true),
        new webpack.optimize.DedupePlugin(),
        new webpack.optimize.UglifyJsPlugin({
          output: {
            comments: false
          },
          compress: {
            warnings: false,
            screw_ie8: true
          }
        }),
        new webpack.optimize.CommonsChunkPlugin('vendors', 'vendors.js')
      ]
    }
    
    if (process.env.NODE_ENV === 'production') {
      config.output.path = path.join(__dirname, 'dist/')
    }
    
    module.exports = config
    

    注意:我正在通过 NPM 脚本设置 NODE ENV

    "scripts": {
        "start": "webpack-dev-server",
        "test": "echo \"Error: no test specified\" && exit 1",
        "build": "NODE_ENV=production webpack -p && cp src/index.html dist/index.html"
      },
    

    【讨论】:

    • 如果有人使用 OccurenceOrderPlugin。确保名称已更新,因此请使用 OccurrenceOrderPlugin。
    【解决方案4】:

    你能试试添加这个吗 devtool: 'cheap-module-source-map',config?

     var config = {
         devtool: 'cheap-module-source-map',
         entry: {
     ....
    

    http://webpack.github.io/docs/configuration.html#devtool

    【讨论】:

      【解决方案5】:

      React expects youNODE_ENV 设置为 'production' 用于生产构建,并通过 Uglify 运行它——这消除了许多额外的冗长、控制台日志记录等。确保设置了该环境变量通过 webpack 构建时(例如,NODE_ENV=production webpack 在命令行中)。

      【讨论】:

        猜你喜欢
        • 2016-11-12
        • 2018-09-10
        • 2017-06-20
        • 1970-01-01
        • 2013-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多