Filipe Silva 9ec5b4ed66 feat(@angular/cli): add build-optimizer support
Adds the new flag `--build-optimizer` (`--bo`), usable only with `--aot` (or `--prod` since it auto enables `--aot`).

This feature is experimental, and may not work correctly on your project. Should it work, total bundle size should go down. Savings are heavily dependent on the project.

See https://github.com/angular/devkit/tree/master/packages/angular_devkit/build_optimizer for details about all the optimizations applied.

Usage: `ng build --prod --build-optimizer`. Disabling the vendor chunk has been shown to improve total savings, and is done automatically when `--bo` is specified unless `--vendor-chunk` has a value.

Please let us know if using `--build-optimizer` breaks your project so we can improve it further. Repos are very welcome.
2017-07-19 12:27:23 -04:00

145 lines
3.7 KiB
TypeScript

import { BuildOptions } from '../models/build-options';
import { baseBuildCommandOptions } from './build';
import { CliConfig } from '../models/config';
import { Version } from '../upgrade/version';
import { ServeTaskOptions } from './serve';
import { checkPort } from '../utilities/check-port';
import { overrideOptions } from '../utilities/override-options';
const Command = require('../ember-cli/lib/models/command');
const config = CliConfig.fromProject() || CliConfig.fromGlobal();
const serveConfigDefaults = config.getPaths('defaults.serve', [
'port', 'host', 'ssl', 'sslKey', 'sslCert', 'proxyConfig'
]);
const defaultPort = process.env.PORT || serveConfigDefaults['port'];
export interface ServeTaskOptions extends BuildOptions {
port?: number;
host?: string;
proxyConfig?: string;
liveReload?: boolean;
publicHost?: string;
disableHostCheck?: boolean;
ssl?: boolean;
sslKey?: string;
sslCert?: string;
open?: boolean;
hmr?: boolean;
}
// Expose options unrelated to live-reload to other commands that need to run serve
export const baseServeCommandOptions: any = overrideOptions([
...baseBuildCommandOptions,
{
name: 'port',
type: Number,
default: defaultPort,
aliases: ['p'],
description: 'Port to listen to for serving.'
},
{
name: 'host',
type: String,
default: serveConfigDefaults['host'],
aliases: ['H'],
description: `Listens only on ${serveConfigDefaults['host']} by default.`
},
{
name: 'proxy-config',
type: 'Path',
default: serveConfigDefaults['proxyConfig'],
aliases: ['pc'],
description: 'Proxy configuration file.'
},
{
name: 'ssl',
type: Boolean,
default: serveConfigDefaults['ssl'],
description: 'Serve using HTTPS.'
},
{
name: 'ssl-key',
type: String,
default: serveConfigDefaults['sslKey'],
description: 'SSL key to use for serving HTTPS.'
},
{
name: 'ssl-cert',
type: String,
default: serveConfigDefaults['sslCert'],
description: 'SSL certificate to use for serving HTTPS.'
},
{
name: 'open',
type: Boolean,
default: false,
aliases: ['o'],
description: 'Opens the url in default browser.',
},
{
name: 'live-reload',
type: Boolean,
default: true,
aliases: ['lr'],
description: 'Whether to reload the page on change, using live-reload.'
},
{
name: 'public-host',
type: String,
aliases: ['live-reload-client'],
description: 'Specify the URL that the browser client will use.'
},
{
name: 'disable-host-check',
type: Boolean,
default: false,
description: 'Don\'t verify connected clients are part of allowed hosts.',
},
{
name: 'hmr',
type: Boolean,
default: false,
description: 'Enable hot module replacement.',
}
], [
{
name: 'watch',
default: true,
description: 'Rebuild on change.'
}
]);
const ServeCommand = Command.extend({
name: 'serve',
description: 'Builds and serves your app, rebuilding on file changes.',
aliases: ['server', 's'],
availableOptions: baseServeCommandOptions,
run: function (commandOptions: ServeTaskOptions) {
const ServeTask = require('../tasks/serve').default;
Version.assertAngularVersionIs2_3_1OrHigher(this.project.root);
// Default vendor chunk to false when build optimizer is on.
if (commandOptions.vendorChunk === undefined) {
commandOptions.vendorChunk = !commandOptions.buildOptimizer;
}
return checkPort(commandOptions.port, commandOptions.host, defaultPort)
.then(port => {
commandOptions.port = port;
const serve = new ServeTask({
ui: this.ui,
project: this.project,
});
return serve.run(commandOptions);
});
}
});
export default ServeCommand;