Skip to content

Commit 07fed04

Browse files
committed
Tweak APIs and fix issues
1 parent 27ce96e commit 07fed04

File tree

5 files changed

+93
-56
lines changed

5 files changed

+93
-56
lines changed

packages/react-dev-utils/FileSizeReporter.js

+47-22
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,33 @@
1+
/**
2+
* Copyright (c) 2015-present, Facebook, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the BSD-style license found in the
6+
* LICENSE file in the root directory of this source tree. An additional grant
7+
* of patent rights can be found in the PATENTS file in the same directory.
8+
*/
9+
10+
'use strict';
11+
112
var fs = require('fs');
213
var path = require('path');
314
var chalk = require('chalk');
415
var filesize = require('filesize');
16+
var recursive = require('recursive-readdir');
517
var stripAnsi = require('strip-ansi');
618
var gzipSize = require('gzip-size').sync;
7-
// Print a detailed summary of build files.
8-
function printFileSizesAfterBuild(appBuild, stats, previousSizeMap) {
9-
var assets = stats
19+
20+
// Prints a detailed summary of build files.
21+
function printFileSizesAfterBuild(webpackStats, previousSizeMap) {
22+
var root = previousSizeMap.root;
23+
var sizes = previousSizeMap.sizes;
24+
var assets = webpackStats
1025
.toJson()
1126
.assets.filter(asset => /\.(js|css)$/.test(asset.name))
1227
.map(asset => {
13-
var fileContents = fs.readFileSync(appBuild + '/' + asset.name);
28+
var fileContents = fs.readFileSync(path.join(root, asset.name));
1429
var size = gzipSize(fileContents);
15-
var previousSize = previousSizeMap[removeFileNameHash(appBuild, asset.name)];
30+
var previousSize = sizes[removeFileNameHash(root, asset.name)];
1631
var difference = getDifferenceLabel(size, previousSize);
1732
return {
1833
folder: path.join('build', path.dirname(asset.name)),
@@ -41,13 +56,13 @@ function printFileSizesAfterBuild(appBuild, stats, previousSizeMap) {
4156
chalk.cyan(asset.name)
4257
);
4358
});
44-
};
59+
}
4560

46-
function removeFileNameHash(appBuild, fileName) {
61+
function removeFileNameHash(buildFolder, fileName) {
4762
return fileName
48-
.replace(appBuild, '')
63+
.replace(buildFolder, '')
4964
.replace(/\/?(.*)(\.\w+)(\.js|\.css)/, (match, p1, p2, p3) => p1 + p3);
50-
};
65+
}
5166

5267
// Input: 1024, 2048
5368
// Output: "(+1 KB)"
@@ -64,22 +79,32 @@ function getDifferenceLabel(currentSize, previousSize) {
6479
} else {
6580
return '';
6681
}
67-
};
82+
}
6883

69-
function measureFileSizesBeforeBuild(appBuild, fileNames){
70-
return (fileNames || [])
71-
.filter(fileName => /\.(js|css)$/.test(fileName))
72-
.reduce((memo, fileName) => {
73-
var contents = fs.readFileSync(fileName);
74-
var key = removeFileNameHash(appBuild, fileName);
75-
memo[key] = gzipSize(contents);
76-
return memo;
77-
}, {});
84+
function measureFileSizesBeforeBuild(buildFolder) {
85+
return new Promise(resolve => {
86+
recursive(buildFolder, (err, fileNames) => {
87+
var sizes;
88+
if (!err && fileNames) {
89+
sizes = fileNames
90+
.filter(fileName => /\.(js|css)$/.test(fileName))
91+
.reduce((memo, fileName) => {
92+
var contents = fs.readFileSync(fileName);
93+
var key = removeFileNameHash(buildFolder, fileName);
94+
memo[key] = gzipSize(contents);
95+
return memo;
96+
}, {});
97+
}
98+
resolve({
99+
root: buildFolder,
100+
sizes: sizes || {},
101+
});
102+
});
103+
});
78104
}
79105

80106
module.exports = {
81107
measureFileSizesBeforeBuild: measureFileSizesBeforeBuild,
82-
printFileSizesAfterBuild: printFileSizesAfterBuild
83-
}
84-
108+
printFileSizesAfterBuild: printFileSizesAfterBuild,
109+
};
85110

packages/react-dev-utils/README.md

+23
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,29 @@ clearConsole();
110110
console.log('Just cleared the screen!');
111111
```
112112

113+
#### `FileSizeReporter`
114+
115+
##### `measureFileSizesBeforeBuild(buildFolder: string): Promise<OpaqueFileSizes>`
116+
117+
Captures JS and CSS asset sizes inside the passed `buildFolder`. Save the result value to compare it after the build.
118+
119+
#### `printFileSizesAfterBuild(webpackStats: WebpackStats, previousFileSizes: OpaqueFileSizes)`
120+
121+
Prints the JS and CSS asset sizes after the build, and includes a size comparison with `previousFileSizes` that were captured earlier using `measureFileSizesBeforeBuild()`.
122+
123+
```js
124+
var {
125+
measureFileSizesBeforeBuild,
126+
printFileSizesAfterBuild,
127+
} = require('react-dev-utils/FileSizeReporter');
128+
129+
measureFileSizesBeforeBuild(buildFolder).then(previousFileSizes => {
130+
return cleanAndRebuild().then(webpackStats => {
131+
printFileSizesAfterBuild(webpackStats, previousFileSizes);
132+
});
133+
});
134+
```
135+
113136
#### `formatWebpackMessages({errors: Array<string>, warnings: Array<string>}): {errors: Array<string>, warnings: Array<string>}`
114137

115138
Extracts and prettifies warning and error messages from webpack [stats](https://github.com/webpack/docs/wiki/node.js-api#stats) object.

packages/react-dev-utils/package.json

+12-11
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,28 @@
1111
"node": ">=4"
1212
},
1313
"files": [
14-
"checkRequiredFiles.js",
15-
"clearConsole.js",
16-
"formatWebpackMessages.js",
17-
"getProcessForPort.js",
18-
"InterpolateHtmlPlugin.js",
19-
"openBrowser.js",
20-
"openChrome.applescript",
21-
"printFileSizes.js",
14+
"checkRequiredFiles.js",
15+
"clearConsole.js",
16+
"FileSizeReporter.js",
17+
"formatWebpackMessages.js",
18+
"getProcessForPort.js",
19+
"InterpolateHtmlPlugin.js",
20+
"openBrowser.js",
21+
"openChrome.applescript",
2222
"prompt.js",
23-
"removeFileNameHash.js",
24-
"WatchMissingNodeModulesPlugin.js",
23+
"removeFileNameHash.js",
24+
"WatchMissingNodeModulesPlugin.js",
2525
"webpackHotDevClient.js"
2626
],
2727
"dependencies": {
2828
"ansi-html": "0.0.5",
2929
"chalk": "1.1.3",
3030
"escape-string-regexp": "1.0.5",
3131
"filesize": "3.3.0",
32-
"gzip-size": "^3.0.0",
32+
"gzip-size": "3.0.0",
3333
"html-entities": "1.2.0",
3434
"opn": "4.0.2",
35+
"recursive-readdir": "2.1.1",
3536
"sockjs-client": "1.1.2",
3637
"strip-ansi": "3.0.1"
3738
}

packages/react-scripts/package.json

-4
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,14 @@
4646
"eslint-plugin-react": "6.4.1",
4747
"extract-text-webpack-plugin": "2.0.0",
4848
"file-loader": "0.10.0",
49-
"filesize": "3.3.0",
5049
"fs-extra": "0.30.0",
51-
"gzip-size": "3.0.0",
5250
"html-webpack-plugin": "2.28.0",
5351
"http-proxy-middleware": "0.17.3",
5452
"jest": "18.1.0",
5553
"object-assign": "4.1.1",
5654
"postcss-loader": "1.3.1",
5755
"promise": "7.1.1",
5856
"react-dev-utils": "^0.5.1",
59-
"recursive-readdir": "2.1.1",
60-
"strip-ansi": "3.0.1",
6157
"style-loader": "0.13.1",
6258
"url-loader": "0.5.7",
6359
"webpack": "2.2.1",

packages/react-scripts/scripts/build.js

+11-19
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,13 @@ var chalk = require('chalk');
2222
var fs = require('fs-extra');
2323
var path = require('path');
2424
var url = require('url');
25-
var filesize = require('filesize');
26-
var gzipSize = require('gzip-size').sync;
2725
var webpack = require('webpack');
2826
var config = require('../config/webpack.config.prod');
2927
var paths = require('../config/paths');
3028
var checkRequiredFiles = require('react-dev-utils/checkRequiredFiles');
31-
var fileSizeReporter = require('react-dev-utils/fileSizeReporter');
32-
var recursive = require('recursive-readdir');
33-
var stripAnsi = require('strip-ansi');
29+
var FileSizeReporter = require('react-dev-utils/FileSizeReporter');
30+
var measureFileSizesBeforeBuild = FileSizeReporter.measureFileSizesBeforeBuild;
31+
var printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild;
3432

3533
var useYarn = fs.existsSync(paths.yarnLockFile);
3634

@@ -41,22 +39,16 @@ if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) {
4139

4240
// First, read the current file sizes in build directory.
4341
// This lets us display how much they changed later.
44-
recursive(paths.appBuild, (err, fileNames) => {
45-
var previousSizeMap = fileSizeReporter.measureFileSizesBeforeBuild(paths.appBuild, fileNames);
46-
42+
measureFileSizesBeforeBuild(paths.appBuild).then(previousFileSizes => {
4743
// Remove all content but keep the directory so that
4844
// if you're in it, you don't end up in Trash
4945
fs.emptyDirSync(paths.appBuild);
5046

5147
// Start the webpack build
52-
build(previousSizeMap);
48+
build(previousFileSizes);
5349

5450
// Merge with the public folder
55-
copyPublicFolder(
56-
paths.appPublic,
57-
paths.appBuild,
58-
paths.appHtml
59-
);
51+
copyPublicFolder();
6052
});
6153

6254
// Print out errors
@@ -70,7 +62,7 @@ function printErrors(summary, errors) {
7062
}
7163

7264
// Create the production build and print the deployment instructions.
73-
function build(previousSizeMap) {
65+
function build(previousFileSizes) {
7466
console.log('Creating an optimized production build...');
7567

7668
var compiler;
@@ -102,7 +94,7 @@ function build(previousSizeMap) {
10294

10395
console.log('File sizes after gzip:');
10496
console.log();
105-
fileSizeReporter.printFileSizesAfterBuild(paths.appBuild, stats, previousSizeMap);
97+
printFileSizesAfterBuild(stats, previousFileSizes);
10698
console.log();
10799

108100
var openCommand = process.platform === 'win32' ? 'start' : 'open';
@@ -178,10 +170,10 @@ function build(previousSizeMap) {
178170
});
179171
}
180172

181-
function copyPublicFolder(appPublic, appBuild, appHtml) {
182-
fs.copySync(appPublic, appBuild, {
173+
function copyPublicFolder() {
174+
fs.copySync(paths.appPublic, paths.appBuild, {
183175
dereference: true,
184-
filter: file => file !== appHtml
176+
filter: file => file !== paths.appHtml
185177
});
186178
};
187179

0 commit comments

Comments
 (0)