Angular AOT / Webpack memory trick
If you're dealing with a growing javascript app, you might reach that point where your build scripts will run out of memory. Wait what? I have 16 GB on my machine, how can this happen?
Update 15/03/2018
Starting with node 8, you should be able to use the NODE_OPTIONS environment variable to define your preferences globally.
NODE_OPTIONS=--max-old-space-size=4096
The problem
Let say for instance that you are using Rollup with a set of very common plugins such as:
rollup-plugin-node-builtins
rollup-plugin-node-globals
rollup-plugin-node-resolve
rollup-plugin-commonjs
rollup-plugin-uglify
You now write a lot of code and add a bunch of 3rd party libs. You're happy everything works fine. Proud and ready to commit you try to bundle and uglify the thing using your home made shiny npm run build:prod
or whatever script you use to do that. And Boom!
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
What happens? Well I think it starts with that:
OK ok, but javascript world is what it is and for the sake of getting things done, what can you do?
Solution
The core problem is that node comes with a default memory restriction to 1.76 GB. If you need more you need to set the option --max_old_space_size={desiredSize}
when you start a node process.
Wait! What? I'm running an npm command how do I pass an option to node? Well you don't!
Since npm does not provide the ability to set this option, we have to do something else. If you are using bash or a similar you can use aliases. If you are running on windows, you're life is gonna be harder.
Well, maybe not, there is one guy who wrote a simple npm utility: Increase Memory Limit.
How do you use it?
Just install it globally
npm install -g increase-memory-limit
Then in your project folder run
increase-memory-limit
What does it do ? It actually patches the files in node_module/.bin
directory adding the --max-old-space-size=4096
option.
Now you are all set! What's good about it? It's easy to use and Xplat. It's also very easy to integrate in your CI/CD pipeline.