From 4b5d48ff202e37e63b8e7e14be4eb53892a0746a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3f=20Poduszl=C3=B3?= Date: Tue, 2 Aug 2016 18:58:39 +0200 Subject: [PATCH 1/3] Display difference from the previous build in filesize (resolves #326) --- scripts/build.js | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/scripts/build.js b/scripts/build.js index e57e040bd6e..cda81afdb81 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -24,7 +24,22 @@ var paths = require('../config/paths'); rimrafSync(paths.appBuild + '/*'); console.log('Creating an optimized production build...'); -webpack(config).run(function(err, stats) { + +var oldAssets; +var compiler = webpack(config, function(err, stats) { + oldAssets = stats.toJson().assets + .filter(asset => /\.(js|css)$/.test(asset.name)) + .map(asset => { + var fileContents = fs.readFileSync(paths.appBuild + '/' + asset.name); + var size = gzipSize(fileContents); + return { + name: path.basename(asset.name), + size: size + }; + }); +}); + +compiler.run(function(err, stats) { if (err) { console.error('Failed to create a production build. Reason:'); console.error(err.message || err); @@ -41,11 +56,27 @@ webpack(config).run(function(err, stats) { .map(asset => { var fileContents = fs.readFileSync(paths.appBuild + '/' + asset.name); var size = gzipSize(fileContents); + var sizeDiffLabel = ''; + + for (var i = oldAssets.length - 1; i >= 0; --i) { + var oldAsset = oldAssets[i]; + if (oldAsset.name === asset.name) { + var sizeDiff = asset.size - oldAsset.size; + if (sizeDiff !== 0) { + sizeDiffLabel = ' (' + + (sizeDiff < 0 ? '-' : '+') + + filesize(Math.abs(sizeDiff)) + + ')'; + } + break; + } + } + return { folder: path.join('build', path.dirname(asset.name)), name: path.basename(asset.name), size: size, - sizeLabel: filesize(size) + sizeLabel: filesize(size) + sizeDiffLabel }; }); assets.sort((a, b) => b.size - a.size); From 5773299386bdce18705df63fa577084399287567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3f=20Poduszl=C3=B3?= Date: Tue, 2 Aug 2016 19:42:24 +0200 Subject: [PATCH 2/3] Started to fix PR #329 --- package.json | 2 ++ scripts/build.js | 53 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 4f49a5c89c2..f4087f6240f 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,8 @@ "html-webpack-plugin": "2.22.0", "jest": "14.1.0", "json-loader": "0.5.4", + "memory-fs": "^0.3.0", + "mkdirp": "^0.5.1", "opn": "4.0.2", "postcss-loader": "0.9.1", "promise": "7.1.1", diff --git a/scripts/build.js b/scripts/build.js index cda81afdb81..2c944b2cfe8 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -14,32 +14,51 @@ var fs = require('fs'); var path = require('path'); var filesize = require('filesize'); var gzipSize = require('gzip-size').sync; +var MemoryFS = require('memory-fs'); +var mkdirpSync = require('mkdirp').sync; var rimrafSync = require('rimraf').sync; var webpack = require('webpack'); var config = require('../config/webpack.config.prod'); var paths = require('../config/paths'); -// Remove all content but keep the directory so that -// if you're in it, you don't end up in Trash -rimrafSync(paths.appBuild + '/*'); - console.log('Creating an optimized production build...'); -var oldAssets; -var compiler = webpack(config, function(err, stats) { - oldAssets = stats.toJson().assets +var memFs = new MemoryFS(); +var compiler = webpack(config); +compiler.outputFileSystem = memFs; + +compiler.run(function(err, stats) { + var statsAssets = stats.toJson().assets; + + // Read old assets from the file system + var oldAssets = statsAssets .filter(asset => /\.(js|css)$/.test(asset.name)) .map(asset => { - var fileContents = fs.readFileSync(paths.appBuild + '/' + asset.name); - var size = gzipSize(fileContents); - return { - name: path.basename(asset.name), - size: size - }; + try { + var fileContents = fs.readFileSync(paths.appBuild + '/' + asset.name); + var size = gzipSize(fileContents); + return { + fullName: asset.name, + size: size + }; + } catch (e) { + return {}; + } + }); + + // Remove all content but keep the directory so that + // if you're in it, you don't end up in Trash + rimrafSync(paths.appBuild + '/*'); + + // Write new assets to the file system + statsAssets + .map(asset => { + var fileFullPath = paths.appBuild + '/' + asset.name; + var fileContents = memFs.readFileSync(fileFullPath); + mkdirpSync(path.dirname(fileFullPath)); + fs.writeFileSync(fileFullPath, fileContents); }); -}); -compiler.run(function(err, stats) { if (err) { console.error('Failed to create a production build. Reason:'); console.error(err.message || err); @@ -51,7 +70,7 @@ compiler.run(function(err, stats) { console.log('File sizes after gzip:'); console.log(); - var assets = stats.toJson().assets + var assets = statsAssets .filter(asset => /\.(js|css)$/.test(asset.name)) .map(asset => { var fileContents = fs.readFileSync(paths.appBuild + '/' + asset.name); @@ -60,7 +79,7 @@ compiler.run(function(err, stats) { for (var i = oldAssets.length - 1; i >= 0; --i) { var oldAsset = oldAssets[i]; - if (oldAsset.name === asset.name) { + if (oldAsset.fullName === asset.name) { var sizeDiff = asset.size - oldAsset.size; if (sizeDiff !== 0) { sizeDiffLabel = ' (' + From c90254659f35f4c8d814cbe48239dc9989ba1bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3f=20Poduszl=C3=B3?= Date: Tue, 2 Aug 2016 19:54:41 +0200 Subject: [PATCH 3/3] Fixed file size difference calculation --- scripts/build.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build.js b/scripts/build.js index 2c944b2cfe8..fdec283132b 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -80,7 +80,7 @@ compiler.run(function(err, stats) { for (var i = oldAssets.length - 1; i >= 0; --i) { var oldAsset = oldAssets[i]; if (oldAsset.fullName === asset.name) { - var sizeDiff = asset.size - oldAsset.size; + var sizeDiff = size - oldAsset.size; if (sizeDiff !== 0) { sizeDiffLabel = ' (' + (sizeDiff < 0 ? '-' : '+') +