@@ -22,14 +22,13 @@ var chalk = require('chalk');
2222var fs = require ( 'fs-extra' ) ;
2323var path = require ( 'path' ) ;
2424var url = require ( 'url' ) ;
25- var filesize = require ( 'filesize' ) ;
26- var gzipSize = require ( 'gzip-size' ) . sync ;
2725var webpack = require ( 'webpack' ) ;
2826var config = require ( '../config/webpack.config.prod' ) ;
2927var paths = require ( '../config/paths' ) ;
3028var checkRequiredFiles = require ( 'react-dev-utils/checkRequiredFiles' ) ;
31- var recursive = require ( 'recursive-readdir' ) ;
32- var stripAnsi = require ( 'strip-ansi' ) ;
29+ var FileSizeReporter = require ( 'react-dev-utils/FileSizeReporter' ) ;
30+ var measureFileSizesBeforeBuild = FileSizeReporter . measureFileSizesBeforeBuild ;
31+ var printFileSizesAfterBuild = FileSizeReporter . printFileSizesAfterBuild ;
3332
3433var useYarn = fs . existsSync ( paths . yarnLockFile ) ;
3534
@@ -38,88 +37,20 @@ if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) {
3837 process . exit ( 1 ) ;
3938}
4039
41- // Input: /User/dan/app/build/static/js/main.82be8.js
42- // Output: /static/js/main.js
43- function removeFileNameHash ( fileName ) {
44- return fileName
45- . replace ( paths . appBuild , '' )
46- . replace ( / \/ ? ( .* ) ( \. \w + ) ( \. j s | \. c s s ) / , ( match , p1 , p2 , p3 ) => p1 + p3 ) ;
47- }
48-
49- // Input: 1024, 2048
50- // Output: "(+1 KB)"
51- function getDifferenceLabel ( currentSize , previousSize ) {
52- var FIFTY_KILOBYTES = 1024 * 50 ;
53- var difference = currentSize - previousSize ;
54- var fileSize = ! Number . isNaN ( difference ) ? filesize ( difference ) : 0 ;
55- if ( difference >= FIFTY_KILOBYTES ) {
56- return chalk . red ( '+' + fileSize ) ;
57- } else if ( difference < FIFTY_KILOBYTES && difference > 0 ) {
58- return chalk . yellow ( '+' + fileSize ) ;
59- } else if ( difference < 0 ) {
60- return chalk . green ( fileSize ) ;
61- } else {
62- return '' ;
63- }
64- }
65-
6640// First, read the current file sizes in build directory.
6741// This lets us display how much they changed later.
68- recursive ( paths . appBuild , ( err , fileNames ) => {
69- var previousSizeMap = ( fileNames || [ ] )
70- . filter ( fileName => / \. ( j s | c s s ) $ / . test ( fileName ) )
71- . reduce ( ( memo , fileName ) => {
72- var contents = fs . readFileSync ( fileName ) ;
73- var key = removeFileNameHash ( fileName ) ;
74- memo [ key ] = gzipSize ( contents ) ;
75- return memo ;
76- } , { } ) ;
77-
42+ measureFileSizesBeforeBuild ( paths . appBuild ) . then ( previousFileSizes => {
7843 // Remove all content but keep the directory so that
7944 // if you're in it, you don't end up in Trash
8045 fs . emptyDirSync ( paths . appBuild ) ;
8146
8247 // Start the webpack build
83- build ( previousSizeMap ) ;
48+ build ( previousFileSizes ) ;
8449
8550 // Merge with the public folder
8651 copyPublicFolder ( ) ;
8752} ) ;
8853
89- // Print a detailed summary of build files.
90- function printFileSizes ( stats , previousSizeMap ) {
91- var assets = stats . toJson ( ) . assets
92- . filter ( asset => / \. ( j s | c s s ) $ / . test ( asset . name ) )
93- . map ( asset => {
94- var fileContents = fs . readFileSync ( paths . appBuild + '/' + asset . name ) ;
95- var size = gzipSize ( fileContents ) ;
96- var previousSize = previousSizeMap [ removeFileNameHash ( asset . name ) ] ;
97- var difference = getDifferenceLabel ( size , previousSize ) ;
98- return {
99- folder : path . join ( 'build' , path . dirname ( asset . name ) ) ,
100- name : path . basename ( asset . name ) ,
101- size : size ,
102- sizeLabel : filesize ( size ) + ( difference ? ' (' + difference + ')' : '' )
103- } ;
104- } ) ;
105- assets . sort ( ( a , b ) => b . size - a . size ) ;
106- var longestSizeLabelLength = Math . max . apply ( null ,
107- assets . map ( a => stripAnsi ( a . sizeLabel ) . length )
108- ) ;
109- assets . forEach ( asset => {
110- var sizeLabel = asset . sizeLabel ;
111- var sizeLength = stripAnsi ( sizeLabel ) . length ;
112- if ( sizeLength < longestSizeLabelLength ) {
113- var rightPadding = ' ' . repeat ( longestSizeLabelLength - sizeLength ) ;
114- sizeLabel += rightPadding ;
115- }
116- console . log (
117- ' ' + sizeLabel +
118- ' ' + chalk . dim ( asset . folder + path . sep ) + chalk . cyan ( asset . name )
119- ) ;
120- } ) ;
121- }
122-
12354// Print out errors
12455function printErrors ( summary , errors ) {
12556 console . log ( chalk . red ( summary ) ) ;
@@ -131,7 +62,7 @@ function printErrors(summary, errors) {
13162}
13263
13364// Create the production build and print the deployment instructions.
134- function build ( previousSizeMap ) {
65+ function build ( previousFileSizes ) {
13566 console . log ( 'Creating an optimized production build...' ) ;
13667
13768 var compiler ;
@@ -163,7 +94,7 @@ function build(previousSizeMap) {
16394
16495 console . log ( 'File sizes after gzip:' ) ;
16596 console . log ( ) ;
166- printFileSizes ( stats , previousSizeMap ) ;
97+ printFileSizesAfterBuild ( stats , previousFileSizes ) ;
16798 console . log ( ) ;
16899
169100 var openCommand = process . platform === 'win32' ? 'start' : 'open' ;
0 commit comments