From 71bc1ac2d4ef166248dd4c8527056a27f4ab633b Mon Sep 17 00:00:00 2001 From: Varun Vachhar Date: Mon, 23 Jan 2017 22:29:27 -0500 Subject: [PATCH] Added support for webpack stats JSON output --- docs/documentation/build.md | 2 ++ packages/@angular/cli/commands/build.ts | 2 ++ packages/@angular/cli/tasks/build.ts | 10 ++++++++++ tests/e2e/tests/build/json.ts | 10 ++++++++++ 4 files changed, 24 insertions(+) create mode 100644 tests/e2e/tests/build/json.ts diff --git a/docs/documentation/build.md b/docs/documentation/build.md index d4d63bbd757b..4ffb5953042d 100644 --- a/docs/documentation/build.md +++ b/docs/documentation/build.md @@ -94,3 +94,5 @@ or `ng serve --prod` will also make use of uglifying and tree-shaking functional `--extract-css` (`-ec`) extract css from global styles onto css files instead of js ones `--output-hashing` define the output filename cache-busting hashing mode + +`--stats-json` generates a `stats.json` file which can be analyzed using tools such as: `webpack-bundle-analyzer` or https://webpack.github.io/analyse diff --git a/packages/@angular/cli/commands/build.ts b/packages/@angular/cli/commands/build.ts index caaa241f3649..2ea277a10a17 100644 --- a/packages/@angular/cli/commands/build.ts +++ b/packages/@angular/cli/commands/build.ts @@ -31,10 +31,12 @@ export const baseBuildCommandOptions: any = [ description: 'define the output filename cache-busting hashing mode', aliases: ['oh'] }, + { name: 'stats-json', type: Boolean, default: false }, ]; export interface BuildTaskOptions extends BuildOptions { watch?: boolean; + statsJson?: boolean; } const BuildCommand = Command.extend({ diff --git a/packages/@angular/cli/tasks/build.ts b/packages/@angular/cli/tasks/build.ts index c2a2ccc86beb..62d71d151a83 100644 --- a/packages/@angular/cli/tasks/build.ts +++ b/packages/@angular/cli/tasks/build.ts @@ -7,6 +7,7 @@ import { BuildTaskOptions } from '../commands/build'; import { NgCliWebpackConfig } from '../models/webpack-config'; import { getWebpackStatsConfig } from '../models/webpack-configs/utils'; import { CliConfig } from '../models/config'; +const fs = require('fs'); export default Task.extend({ @@ -36,6 +37,15 @@ export default Task.extend({ return; } + if (!runTaskOptions.watch && runTaskOptions.statsJson) { + const jsonStats = stats.toJson('verbose'); + + fs.writeFileSync( + path.resolve(project.root, outputPath, 'stats.json'), + JSON.stringify(jsonStats, null, 2) + ); + } + if (stats.hasErrors()) { reject(); } else { diff --git a/tests/e2e/tests/build/json.ts b/tests/e2e/tests/build/json.ts new file mode 100644 index 000000000000..a003122fdda8 --- /dev/null +++ b/tests/e2e/tests/build/json.ts @@ -0,0 +1,10 @@ +import {ng} from '../../utils/process'; +import {expectFileToExist} from '../../utils/fs'; +import {expectGitToBeClean} from '../../utils/git'; + + +export default function() { + return ng('build', '--stats-json') + .then(() => expectFileToExist('./dist/stats.json')) + .then(() => expectGitToBeClean()); +}