为什么使用 Webpack 和 Gulp 构建的输出包如此之大 (>1.9Mb)

Why is output bundle built with Webpack and Gulp so big (>1.9Mb)?

本文关键字:9Mb 如此之 Webpack Gulp 输出 构建 为什么      更新时间:2023-09-26

我正在使用webpackgulp通过node/npm来构建和丑化浏览器应用程序。问题是输出应用程序.js约为1.9Mb。它似乎太大了,表明我可能错过了一些东西。

我使用 gulp build --release 开始构建过程

这是我的 gulp 文件:

import path from 'path';
import cp from 'child_process';
import gulp from 'gulp';
import gulpLoadPlugins from 'gulp-load-plugins';
import del from 'del';
import mkdirp from 'mkdirp';
import runSequence from 'run-sequence';
import webpack from 'webpack';
import minimist from 'minimist';
const $ = gulpLoadPlugins();
const argv = minimist(process.argv.slice(2));
const src = Object.create(null);
let watch = false;
let browserSync;
// The default task
gulp.task('default', ['sync']);
// Clean output directory
gulp.task('clean', cb => {
  del(['.tmp', 'build/*', '!build/.git'], {dot: true}, () => {
    mkdirp('build/public', cb);
  });
});
// Static files
gulp.task('assets', () => {
  src.assets = 'src/public/**';
  return gulp.src(src.assets)
    .pipe($.changed('build/public'))
    .pipe(gulp.dest('build/public'))
    .pipe($.size({title: 'assets'}));
});
// Resource files
gulp.task('resources', () => {
  src.resources = [
    'package.json',
    'src/content*/**',
    'src/templates*/**'
  ];
  return gulp.src(src.resources)
    .pipe($.changed('build'))
    .pipe(gulp.dest('build'))
    .pipe($.size({title: 'resources'}));
});

// Bundle
gulp.task('bundle', cb => {
  const config = require('./webpack.config.js');
  const bundler = webpack(config);
  const verbose = !!argv.verbose;
  let bundlerRunCount = 0;
  function bundle(err, stats) {
    if (err) {
      throw new $.util.PluginError('webpack', err);
    }
    if (++bundlerRunCount === (watch ? config.length : 1)) {
      return cb();
    }
  }
  if (watch) {
    bundler.watch(200, bundle);
  } else {
    bundler.run(bundle);
  }
});
// Build the app from source code
gulp.task('build', ['clean'], cb => {
  runSequence(['assets', 'resources'], ['bundle'], cb);
});

编辑:

最后一个应用程序.js被缩小,我也使用DedupePluginUglifyJsPluginAggressiveMergingPlugin。这是我的webpack.config的相关(我希望)部分

const DEBUG = !argv.release;
const appConfig = merge({}, config, {
  entry: './src/app.js',
  output: {
    path: './build/public',
    filename: 'app.js'
  },
  node: {
    fs: 'empty'
  },
  devtool: DEBUG ? 'eval-cheap-module-source-map' : false,
  plugins: config.plugins.concat([
    new DefinePlugin(merge(GLOBALS, {
      '__SERVER__': false
    }))
  ].concat(DEBUG ? [] : [
    new webpack.optimize.DedupePlugin(),
    new webpack.optimize.UglifyJsPlugin(),
    new webpack.optimize.AggressiveMergingPlugin()
  ])
  )
});

我对 Gulp 不是很熟悉,但我知道看到我最初的 Webpack 构建大小,尤其是来自 Grunt 的开发服务器输出是非常令人生畏的......

解决 方案

  1. 检查你的加载器,看看你的javascript内联了哪些资产/数据/代码
  2. 仔细检查您正在import的包裹。也许您安装的某些软件包比您预期的要大。(反应本身是~150mb缩小的)
  3. 查看构建中显示的模块。如果运行开发服务器,则应看到整个列表。也许有些是重复的,或者包含你不打算添加的内容,例如开发包。
  4. 请参阅代码拆分文档并尝试创建一些子包(我个人喜欢 promise 加载器),但请确保您也使用 CommonsChunkPlugin 来删除重复的共享依赖项。
  5. 使用 Webpack v2 查看树摇晃

想法

Webpack 很棒,但比许多其他前端构建工具需要更多的使用时间。我强烈建议在一些较小的项目上单独尝试 Webpack 来启动,而不是与其他工具混合使用。如果你用 Gulp 做了一些你用 Webpack 做不到的事情,我会感到惊讶,你会省去让两个构建工具一起工作的头痛。

希望这有帮助...如果您使用的是 React,我还会查看 Pete Hunt 的 Webpack HowTo 和 Christian Alfoni 的 React-Webpack Cookbook。

类似问题

  • 使用小项目创建大文件的 Webpack
  • webpack 会让项目变得更大吗?

更新

一定要像上面提到的@djskinner研究NODE_ENV=production,以确保 npm react 包知道你正在做一个生产构建。