Like any kind of apps, JavaScript apps also have to be written well.
Otherwise, we run into all kinds of issues later on.
In this article, we’ll look at some best practices we should follow when writing Node apps.
Monitoring
We must monitor our app to make sure that it’s in a healthy state.
The number of restarts, resource usage, and more indicates how our app is doing.
We use these tools to get a good idea of what’s happening in production
Delegate Anything Possible to a Reverse Proxy
Anything that can be done by a reverse proxy should be done by it.
So we can use one like Nginx to do things like SSL, gzipping, etc.
Otherwise, our app would be busy dealing with network tasks rather than dealing with the app’s core tasks.
Express has middleware for all these tasks, but it’s better to offload them to a reverse proxy because Node’s single thread model would keep our app busy just doing networking tasks.
Make Use of SSL
SSL is a given since we don’t want attackers to snoop the communication channels between our clients and the server.
We should use a reverse proxy for this so we can delegate this to it rather than using our app for SSL.
Smart Logging
We can use a logging platform to make logging and searching the logs easier.
Otherwise, everything our app is doing is a black box.
Then if troubles arise, we’ll have problems fixing issues since we don’t know what’s going on.
Lock Dependencies
Dependencies should be locked so that new version won’t be installed without changing the version explicitly.
The NPM config in each environment should have the exact version and not the latest version of every package.
We can use npm shrinkwrap
for finer controls of the dependencies.
They’re locked by default by NPM so we don’t have to worry about this.
Ensure Error Management Best Practices are Met
Errors should be handled so that we have a stable app.
Error handling is different for synchronous and async code.
We got to understand their differences.
Promises call catch
to catch errors.
Synchronous code uses the catch
block to catch errors.
We don’t want our app to crash when it does basic operations like parsing invalid JSON, using undefined variables, etc.
Guard Process Uptime Using the Right Tool
Node processes must be guarded against failures.
This means that they’ve to be restarted automatically when they crash.
A process manager like PM2 would do this for us and more.
It also provides us with cluster management features which we get without modifying our app’s code.
There’re also other tools like Forever that does the same thing.
Use All CPU Cores
We should use all CPU cores to run our Node app.
Node.js can only run on one CPU core without clustering.
This means by default, it’ll just leave the other cores idle.
We can do that with Docker or deployment scripts based on the Linux init system to replicate the process.
Conclusion
There’re many things we can do to maximize the performance of our Node app.
We can improve logging and monitoring to make troubleshooting easier.