为什么使用 Webpack 和 Gulp 构建的输出包如此之大 (>1.9Mb)
Why is output bundle built with Webpack and Gulp so big (>1.9Mb)?
我正在使用webpack
和gulp
通过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被缩小,我也使用DedupePlugin
、UglifyJsPlugin
和AggressiveMergingPlugin
。这是我的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 的开发服务器输出是非常令人生畏的......
解决 方案
- 检查你的加载器,看看你的javascript内联了哪些资产/数据/代码
- 仔细检查您正在
import
的包裹。也许您安装的某些软件包比您预期的要大。(反应本身是~150mb缩小的) - 查看构建中显示的模块。如果运行开发服务器,则应看到整个列表。也许有些是重复的,或者包含你不打算添加的内容,例如开发包。
- 请参阅代码拆分文档并尝试创建一些子包(我个人喜欢 promise 加载器),但请确保您也使用 CommonsChunkPlugin 来删除重复的共享依赖项。
- 使用 Webpack v2 查看树摇晃
想法
Webpack 很棒,但比许多其他前端构建工具需要更多的使用时间。我强烈建议在一些较小的项目上单独尝试 Webpack 来启动,而不是与其他工具混合使用。如果你用 Gulp 做了一些你用 Webpack 做不到的事情,我会感到惊讶,你会省去让两个构建工具一起工作的头痛。
希望这有帮助...如果您使用的是 React,我还会查看 Pete Hunt 的 Webpack HowTo 和 Christian Alfoni 的 React-Webpack Cookbook。
类似问题
- 使用小项目创建大文件的 Webpack
- webpack 会让项目变得更大吗?
更新
一定要像上面提到的@djskinner研究NODE_ENV=production
,以确保 npm react 包知道你正在做一个生产构建。
相关文章:
- JavaScript上的通配符(也许这不费吹灰之力?)
- d3命运之轮
- 如何使用pouchdb创建动态查询(couchdb可能也是如此)
- 失踪的引导程序之谜
- 为什么我用于检查所需输入字段的jQuery脚本如此缓慢
- 如果匈牙利的记法大多被贬低;建设者的UpperCamel与其他一切的lowerCamel“;如此受欢迎
- 字符串对象类型或基元类型也是如此
- 为什么在React中,todo列表的显示如此脆弱
- 为什么严格的模式会让如此简单的动作变得如此不同
- 当与之关联的 ng-model 为 false 时,Angularjs 复选框值不会取消选中
- 打开除域之外在新选项卡中打开的所有外部链接
- 如何将我必须的众多PHP变量之一传递给JavaScript
- ASP.Net MVC 脚本无法使用控制器的默认操作 URL.使用控制器/操作 URL 也是如此
- 为什么使用 Webpack 和 Gulp 构建的输出包如此之大 (>1.9Mb)
- 为什么在这个例子中图像高度变得如此之大
- Meebo栏是如何跨浏览器运行得如此之好?
- 为什么选择排序在Javascript中如此之快?
- 动画帧的动画速度如此之慢的原因是什么
- 为什么与jar文件相比,js框架的大小如此之小
- 是什么让Twitter页面之间的导航如此之快