# Lowering Build times
Our goal is to lower our build times on AWS Amplify, after some research, our biggest issue here is the sheer amount of dependencies we're pulling in. We have a Node modules folder that takes up more than 1.5GB, which for a medium size app is a lot.
Our main focus will be on trying to dampen the impact in the build steps, trying out different combinations of caching strategies and install flags.
The results show a 50% reduction on overall time, counterintuitivelly, what made the most difference was removing all the default caching altogether, since a lot of the time consumed by AWS was spent trying to compress and deflate the cache artifact, which ended up being 2873MB.
## Results
### Baseline run:
Using yarns default install behaviour and taking into account that Amplify, by default, tries to cache the node modules folder

### Using a frozen lockfile:
Using yarn's --frozen-lockfile, which doesn't generate a new file and avoids going through the whole dependency tree, this is a resource intensive task, but didn't seem to impact too much the overall time spent building the app

However, we can see in the logs (Posted below) a big portion of build time is spent in creating the cache artifact
### Frozen yarn.lock + no cache:
I played around with the settings but since our biggest issue came from the node modules folder and trying to cache it was being detrimental for the build times (~6mins in building, compressing and uploading the cache artifact (2873MB)), i ended up scraping the cache alltogether

This reduced overall build times by ~50%, 5 minutes of build time on a cloud server isn't by any metrics fast for a small/mid-size react app, but it's way better that we used to have considering the size of the build file
## Full build logs
Baseline run:
```
# Starting phase: preBuild
# Executing command: nvm install 10.19.0
2021-06-08T21:53:09.625Z [INFO]: Downloading and installing node v10.19.0...
2021-06-08T21:53:09.721Z [WARNING]: Downloading https://nodejs.org/dist/v10.19.0/node-v10.19.0-linux-x64.tar.gz...
2021-06-08T21:53:09.840Z [WARNING]: #########
2021-06-08T21:53:09.840Z [WARNING]: 13.2%
2021-06-08T21:53:09.927Z [WARNING]: ###############################
2021-06-08T21:53:09.927Z [WARNING]: ######################################### 100.0%
2021-06-08T21:53:09.939Z [WARNING]: Computing checksum with sha256sum
2021-06-08T21:53:10.015Z [WARNING]: Checksums matched!
2021-06-08T21:53:11.216Z [INFO]: Now using node v10.19.0 (npm v6.13.4)
2021-06-08T21:53:11.243Z [INFO]: # Executing command: nvm use 10.19.0
2021-06-08T21:53:11.618Z [INFO]: Now using node v10.19.0 (npm v6.13.4)
2021-06-08T21:53:11.618Z [INFO]: # Executing command: yarn install
2021-06-08T21:53:12.537Z [INFO]: yarn install v1.22.0
2021-06-08T21:53:12.675Z [INFO]: [1/4] Resolving packages...
2021-06-08T21:53:13.475Z [INFO]: success Already up-to-date.
2021-06-08T21:53:13.479Z [INFO]: Done in 0.95s.
2021-06-08T21:53:13.488Z [INFO]: # Completed phase: preBuild
# Starting phase: build
2021-06-08T21:53:13.489Z [INFO]: # Executing command: yarn run build
2021-06-08T21:53:13.650Z [INFO]: yarn run v1.22.0
2021-06-08T21:53:13.678Z [INFO]: $ react-scripts --max_old_space_size=2048 build
2021-06-08T21:53:14.665Z [INFO]: Creating an optimized production build...
2021-06-08T21:55:38.067Z [INFO]: Compiled successfully.
File sizes after gzip:
2021-06-08T21:55:38.443Z [INFO]: 1.33 MB build/static/js/8.94c1a63a.chunk.js
2021-06-08T21:55:38.443Z [INFO]: 202.13 KB build/static/js/main.0b63927e.chunk.js
60.43 KB build/static/js/9.09289636.chunk.js
40.8 KB build/static/js/17.87fef630.chunk.js
39.28 KB build/static/js/10.bf36739e.chunk.js
23.28 KB build/static/js/3.f1af80f9.chunk.js
17.27 KB build/static/js/13.6e389d1a.chunk.js
16.74 KB build/static/js/11.4dc3c994.chunk.js
12.39 KB build/static/js/14.cabc28c7.chunk.js
11.13 KB build/static/js/12.ab45ecf3.chunk.js
7.75 KB build/static/js/0.36f4d55a.chunk.js
6.95 KB build/static/js/15.db514245.chunk.js
6.6 KB build/static/js/2.3084c328.chunk.js
6.3 KB build/static/js/5.2d5c94fb.chunk.js
5.29 KB build/static/js/1.76c5e1cf.chunk.js
5.15 KB build/static/js/4.5d123c8b.chunk.js
4.89 KB build/static/css/8.d7f4bf98.chunk.css
4.73 KB build/static/js/33.3908c618.chunk.js
4.23 KB build/static/js/21.d0e2015a.chunk.js
4.01 KB build/static/js/19.64a49f69.chunk.js
3.74 KB build/static/js/18.e5971879.chunk.js
3.64 KB build/static/js/16.7dc9bbc3.chunk.js
2.1 KB build/static/js/25.35f1c01f.chunk.js
1.95 KB build/static/js/26.1b38de67.chunk.js
2021-06-08T21:55:38.444Z [INFO]: 1.86 KB build/static/js/20.bdc1207a.chunk.js
1.82 KB build/static/js/runtime-main.236fe0c6.js
1.17 KB build/static/js/22.15cc26db.chunk.js
1.11 KB build/static/css/0.c8ccacc5.chunk.css
944 B build/static/js/23.b991e0be.chunk.js
428 B build/static/js/28.6ed5eb48.chunk.js
339 B build/static/js/24.e3648347.chunk.js
336 B build/static/js/27.47651706.chunk.js
319 B build/static/js/30.a5e590ad.chunk.js
318 B build/static/js/29.5af21e79.chunk.js
309 B build/static/js/31.4475ba1c.chunk.js
302 B build/static/js/32.2a2f604a.chunk.js
241 B build/static/css/main.2d5defd0.chunk.css
2021-06-08T21:55:38.444Z [INFO]: The bundle size is significantly larger than recommended.
Consider reducing it with code splitting: https://goo.gl/9VhYWB
You can also analyze the project dependencies: https://goo.gl/LeUzfb
2021-06-08T21:55:38.444Z [INFO]: The project was built assuming it is hosted at /.
You can control this with the homepage field in your package.json.
The build folder is ready to be deployed.
You may serve it with a static server:
2021-06-08T21:55:38.444Z [INFO]: yarn global add serve
serve -s build
Find out more about deployment here:
bit.ly/CRA-deploy
2021-06-08T21:55:38.537Z [INFO]: Done in 144.89s.
2021-06-08T21:55:38.540Z [INFO]: # Completed phase: build
2021-06-08T21:55:38.541Z [INFO]: ## Build completed successfully
2021-06-08T21:55:38.543Z [INFO]: # Starting caching...
2021-06-08T21:55:38.695Z [INFO]: Creating cache artifact...
2021-06-08T22:00:29.200Z [INFO]: # Cache artifact is: 2688MB
2021-06-08T22:00:29.349Z [INFO]: # Uploading cache artifact...
2021-06-08T22:00:57.468Z [INFO]: # Caching completed
2021-06-08T22:00:57.601Z [INFO]: No custom headers found.
2021-06-08T22:00:57.678Z [INFO]: # Starting build artifact upload process...
2021-06-08T22:00:58.754Z [INFO]: # Build artifact is: 9MB
2021-06-08T22:00:58.755Z [INFO]: # Uploading build artifact '__artifacts.zip'...
2021-06-08T22:00:58.790Z [INFO]: # Build artifact is: 9MB
2021-06-08T22:00:58.791Z [INFO]: # Uploading build artifact '__artifactsHash.zip'...
2021-06-08T22:00:59.169Z [INFO]: # Build artifact upload completed
2021-06-08T22:00:59.170Z [INFO]: # Starting environment caching...
2021-06-08T22:00:59.171Z [INFO]: # Uploading environment cache artifact...
2021-06-08T22:00:59.269Z [INFO]: # Environment caching completed
Terminating logging...
```
### Using a frozen lockfile
```
# Starting phase: preBuild
# Executing command: nvm install 10.19.0
2021-06-11T14:36:30.207Z [INFO]: Downloading and installing node v10.19.0...
2021-06-11T14:36:30.302Z [WARNING]: Downloading https://nodejs.org/dist/v10.19.0/node-v10.19.0-linux-x64.tar.gz...
2021-06-11T14:36:30.421Z [WARNING]: ######
2021-06-11T14:36:30.422Z [WARNING]: 9.4%
2021-06-11T14:36:30.521Z [WARNING]: ################################
2021-06-11T14:36:30.522Z [WARNING]: ################################# 90.8%
2021-06-11T14:36:30.531Z [WARNING]: ####################
2021-06-11T14:36:30.531Z [WARNING]: #################################################### 100.0%
2021-06-11T14:36:30.543Z [WARNING]: Computing checksum with sha256sum
2021-06-11T14:36:30.622Z [WARNING]: Checksums matched!
2021-06-11T14:36:31.946Z [INFO]: Now using node v10.19.0 (npm v6.13.4)
2021-06-11T14:36:31.974Z [INFO]: # Executing command: nvm use 10.19.0
2021-06-11T14:36:32.357Z [INFO]: Now using node v10.19.0 (npm v6.13.4)
2021-06-11T14:36:32.357Z [INFO]: # Executing command: yarn install --frozen-lockfile
2021-06-11T14:36:33.128Z [INFO]: yarn install v1.22.0
2021-06-11T14:36:33.274Z [INFO]: [1/4] Resolving packages...
2021-06-11T14:36:34.095Z [INFO]: success Already up-to-date.
2021-06-11T14:36:34.099Z [INFO]: Done in 0.97s.
2021-06-11T14:36:34.109Z [INFO]: # Completed phase: preBuild
# Starting phase: build
2021-06-11T14:36:34.109Z [INFO]: # Executing command: yarn run build
2021-06-11T14:36:34.278Z [INFO]: yarn run v1.22.0
2021-06-11T14:36:34.308Z [INFO]: $ react-scripts --max_old_space_size=2048 build
2021-06-11T14:36:35.328Z [INFO]: Creating an optimized production build...
2021-06-11T14:38:54.646Z [INFO]: Compiled successfully.
2021-06-11T14:38:54.648Z [INFO]: File sizes after gzip:
2021-06-11T14:38:55.041Z [INFO]: 1.33 MB build/static/js/8.954f83c0.chunk.js
2021-06-11T14:38:55.041Z [INFO]: 200.79 KB build/static/js/main.342162a8.chunk.js
60.42 KB build/static/js/9.b220e25c.chunk.js
40.8 KB build/static/js/17.87fef630.chunk.js
39.28 KB build/static/js/10.8015f651.chunk.js
23.28 KB build/static/js/3.7c27c7c1.chunk.js
17.27 KB build/static/js/13.4a23ea48.chunk.js
16.74 KB build/static/js/11.4dc3c994.chunk.js
12.39 KB build/static/js/14.d638e5bb.chunk.js
11.13 KB build/static/js/12.416db321.chunk.js
7.75 KB build/static/js/0.36f4d55a.chunk.js
6.95 KB build/static/js/15.ded575a1.chunk.js
6.6 KB build/static/js/2.1a05b2cd.chunk.js
6.3 KB build/static/js/5.69b5297a.chunk.js
5.29 KB build/static/js/1.76c5e1cf.chunk.js
5.15 KB build/static/js/4.5d123c8b.chunk.js
4.89 KB build/static/css/8.424ab3d1.chunk.css
4.73 KB build/static/js/33.3908c618.chunk.js
4.23 KB build/static/js/21.382601f8.chunk.js
4.01 KB build/static/js/19.df416acf.chunk.js
3.74 KB build/static/js/18.4320f0c0.chunk.js
2021-06-11T14:38:55.041Z [INFO]: 3.64 KB build/static/js/16.a782c7aa.chunk.js
2.11 KB build/static/js/25.93150d8f.chunk.js
1.95 KB build/static/js/26.e20eecbd.chunk.js
1.86 KB build/static/js/20.35fc2d51.chunk.js
1.82 KB build/static/js/runtime-main.fcd4bd90.js
1.17 KB build/static/js/22.a71065ed.chunk.js
1.11 KB build/static/css/0.b924743b.chunk.css
2021-06-11T14:38:55.042Z [INFO]: 945 B build/static/js/23.99b879f3.chunk.js
428 B build/static/js/28.6ed5eb48.chunk.js
339 B build/static/js/24.e3648347.chunk.js
336 B build/static/js/27.47651706.chunk.js
319 B build/static/js/30.a5e590ad.chunk.js
318 B build/static/js/29.5af21e79.chunk.js
309 B build/static/js/31.4475ba1c.chunk.js
302 B build/static/js/32.2a2f604a.chunk.js
242 B build/static/css/main.be003f03.chunk.css
The bundle size is significantly larger than recommended.
Consider reducing it with code splitting: https://goo.gl/9VhYWB
2021-06-11T14:38:55.042Z [INFO]: You can also analyze the project dependencies: https://goo.gl/LeUzfb
The project was built assuming it is hosted at /.
2021-06-11T14:38:55.042Z [INFO]: You can control this with the homepage field in your package.json.
The build folder is ready to be deployed.
You may serve it with a static server:
yarn global add serve
serve -s build
2021-06-11T14:38:55.042Z [INFO]: Find out more about deployment here:
bit.ly/CRA-deploy
2021-06-11T14:38:55.131Z [INFO]: Done in 140.86s.
2021-06-11T14:38:55.135Z [INFO]: # Completed phase: build
2021-06-11T14:38:55.136Z [INFO]: ## Build completed successfully
2021-06-11T14:38:55.138Z [INFO]: # Starting caching...
2021-06-11T14:38:55.269Z [INFO]: Creating cache artifact...
2021-06-11T14:43:34.940Z [INFO]: # Cache artifact is: 2816MB
2021-06-11T14:43:35.023Z [INFO]: # Uploading cache artifact...
2021-06-11T14:43:54.077Z [INFO]: # Caching completed
2021-06-11T14:43:54.159Z [INFO]: No custom headers found.
2021-06-11T14:43:54.258Z [INFO]: # Starting build artifact upload process...
2021-06-11T14:43:55.381Z [INFO]: # Build artifact is: 9MB
2021-06-11T14:43:55.383Z [INFO]: # Uploading build artifact '__artifactsHash.zip'...
2021-06-11T14:43:55.421Z [INFO]: # Build artifact is: 9MB
2021-06-11T14:43:55.421Z [INFO]: # Uploading build artifact '__artifacts.zip'...
2021-06-11T14:43:56.164Z [INFO]: # Build artifact upload completed
2021-06-11T14:43:56.165Z [INFO]: # Starting environment caching...
2021-06-11T14:43:56.166Z [INFO]: # Uploading environment cache artifact...
2021-06-11T14:43:56.257Z [INFO]: # Environment caching completed
Terminating logging...
```
### Frozen yarn.lock + no cache:
```
# Starting phase: preBuild
# Executing command: nvm install 10.19.0
2021-06-11T15:46:31.593Z [INFO]: Downloading and installing node v10.19.0...
2021-06-11T15:46:31.701Z [WARNING]: Downloading https://nodejs.org/dist/v10.19.0/node-v10.19.0-linux-x64.tar.gz...
2021-06-11T15:46:31.816Z [WARNING]: ##
2021-06-11T15:46:31.817Z [WARNING]: 2.9%
2021-06-11T15:46:31.917Z [WARNING]: ####################################
2021-06-11T15:46:31.917Z [WARNING]: ############ 67.5%
2021-06-11T15:46:31.964Z [WARNING]: #############################
2021-06-11T15:46:31.964Z [WARNING]: ########################################### 100.0%
2021-06-11T15:46:31.975Z [WARNING]: Computing checksum with sha256sum
2021-06-11T15:46:32.055Z [WARNING]: Checksums matched!
2021-06-11T15:46:33.242Z [INFO]: Now using node v10.19.0 (npm v6.13.4)
2021-06-11T15:46:33.269Z [INFO]: # Executing command: nvm use 10.19.0
2021-06-11T15:46:33.665Z [INFO]: Now using node v10.19.0 (npm v6.13.4)
2021-06-11T15:46:33.665Z [INFO]: # Executing command: yarn install --frozen-lockfile
2021-06-11T15:46:34.452Z [INFO]: yarn install v1.22.0
2021-06-11T15:46:34.601Z [INFO]: [1/4] Resolving packages...
2021-06-11T15:46:35.391Z [INFO]: success Already up-to-date.
2021-06-11T15:46:35.395Z [INFO]: Done in 0.95s.
2021-06-11T15:46:35.404Z [INFO]: # Completed phase: preBuild
# Starting phase: build
2021-06-11T15:46:35.405Z [INFO]: # Executing command: yarn run build
2021-06-11T15:46:35.568Z [INFO]: yarn run v1.22.0
2021-06-11T15:46:35.597Z [INFO]: $ react-scripts --max_old_space_size=2048 build
2021-06-11T15:46:36.636Z [INFO]: Creating an optimized production build...
2021-06-11T15:49:02.974Z [INFO]: Compiled successfully.
2021-06-11T15:49:02.977Z [INFO]: File sizes after gzip:
2021-06-11T15:49:03.369Z [INFO]: 1.33 MB build/static/js/8.954f83c0.chunk.js
2021-06-11T15:49:03.370Z [INFO]: 200.79 KB build/static/js/main.f57b277d.chunk.js
60.43 KB build/static/js/9.1893fe4c.chunk.js
40.8 KB build/static/js/17.87fef630.chunk.js
39.28 KB build/static/js/10.e0ac8d5f.chunk.js
23.28 KB build/static/js/3.7c27c7c1.chunk.js
17.28 KB build/static/js/13.b1195bd9.chunk.js
16.74 KB build/static/js/11.4dc3c994.chunk.js
12.39 KB build/static/js/14.2ae34c98.chunk.js
11.13 KB build/static/js/12.f2e7b2e1.chunk.js
7.75 KB build/static/js/0.36f4d55a.chunk.js
6.95 KB build/static/js/15.1be0e0d2.chunk.js
6.6 KB build/static/js/2.ad203ca7.chunk.js
6.29 KB build/static/js/5.5d79e89e.chunk.js
5.29 KB build/static/js/1.76c5e1cf.chunk.js
5.15 KB build/static/js/4.5d123c8b.chunk.js
4.89 KB build/static/css/8.b4198469.chunk.css
4.73 KB build/static/js/33.3908c618.chunk.js
4.23 KB build/static/js/21.02c1c1c6.chunk.js
4.01 KB build/static/js/19.900cf608.chunk.js
3.74 KB build/static/js/18.e7383a29.chunk.js
3.64 KB build/static/js/16.bbc59d56.chunk.js
2.11 KB build/static/js/25.f26db511.chunk.js
2021-06-11T15:49:03.370Z [INFO]: 1.95 KB build/static/js/26.1b8fec0f.chunk.js
1.86 KB build/static/js/20.ca1e818b.chunk.js
1.82 KB build/static/js/runtime-main.6a971ce4.js
1.17 KB build/static/js/22.a71065ed.chunk.js
1.11 KB build/static/css/0.6609840a.chunk.css
945 B build/static/js/23.99b879f3.chunk.js
428 B build/static/js/28.6ed5eb48.chunk.js
339 B build/static/js/24.e3648347.chunk.js
336 B build/static/js/27.47651706.chunk.js
319 B build/static/js/30.a5e590ad.chunk.js
318 B build/static/js/29.5af21e79.chunk.js
309 B build/static/js/31.4475ba1c.chunk.js
302 B build/static/js/32.2a2f604a.chunk.js
2021-06-11T15:49:03.370Z [INFO]: 243 B build/static/css/main.7826d10c.chunk.css
The bundle size is significantly larger than recommended.
Consider reducing it with code splitting: https://goo.gl/9VhYWB
You can also analyze the project dependencies: https://goo.gl/LeUzfb
2021-06-11T15:49:03.370Z [INFO]: The project was built assuming it is hosted at /.
You can control this with the homepage field in your package.json.
The build folder is ready to be deployed.
You may serve it with a static server:
2021-06-11T15:49:03.370Z [INFO]: yarn global add serve
serve -s build
Find out more about deployment here:
bit.ly/CRA-deploy
2021-06-11T15:49:03.464Z [INFO]: Done in 147.90s.
2021-06-11T15:49:03.468Z [INFO]: # Completed phase: build
2021-06-11T15:49:03.468Z [INFO]: ## Build completed successfully
2021-06-11T15:49:03.471Z [INFO]: # Starting caching...
2021-06-11T15:49:03.623Z [INFO]: Creating cache artifact...
2021-06-11T15:54:30.467Z [INFO]: # Cache artifact is: 2873MB
2021-06-11T15:54:30.546Z [INFO]: # Uploading cache artifact...
2021-06-11T15:55:00.172Z [INFO]: # Caching completed
2021-06-11T15:55:00.269Z [INFO]: No custom headers found.
2021-06-11T15:55:00.356Z [INFO]: # Starting build artifact upload process...
2021-06-11T15:55:01.515Z [INFO]: # Build artifact is: 9MB
2021-06-11T15:55:01.517Z [INFO]: # Uploading build artifact '__artifacts.zip'...
2021-06-11T15:55:01.549Z [INFO]: # Build artifact is: 9MB
2021-06-11T15:55:01.549Z [INFO]: # Uploading build artifact '__artifactsHash.zip'...
2021-06-11T15:55:02.654Z [INFO]: # Build artifact upload completed
2021-06-11T15:55:02.654Z [INFO]: # Starting environment caching...
2021-06-11T15:55:02.655Z [INFO]: # Uploading environment cache artifact...
2021-06-11T15:55:02.755Z [INFO]: # Environment caching completed
Terminating logging...
```