Guides & Tutorials

Node.js fundamentals: Build scalable applications

Image displaying node.js logo and an abstract concept of building scalable applications

Since early 2009, Node.js has supported a cross-platform open-source JavaScript runtime available on Windows, Linux, Unix, and macOS. It runs on the V8 JavaScript engine, a JavaScript and WebAssembly engine developed by Google for the Chrome browser, notably written in C++.

As a mid-level programmer, the details of the languages you develop applications with get lost in the day-to-day shuffle. That’s why we at Netlify decided to put together this refresher guide on Node.js to remind you of those details and reaffirm your appreciation for this helpful runtime.

Once you refresh your memory, you’ll be excited to develop and deploy scalable applications using Node.js with the help of Netlify.

What is Node.js? A quick refresher

You may work with Node.js every day, but it’s worth returning to the basics and remembering the specific details that make it a go-to solution for programmers worldwide. Node.js is an event-driven and asynchronous JavaScript runtime environment built with scalable network applications in mind.

What makes Node.js unique is that it utilizes an asynchronous method execution, allowing for event-driven and non-blocking I/O. The non-blocking nature means fewer threads are necessary to handle the same number of I/O requests, making Node.js excellent for efficient operations and more affordable development of scalable systems.

The event-driven model also allows non-blocking asynchronous code to respond to events in real time without waiting for other operations to complete. Continuous operation execution puts less strain on memory resources, which is essential for web app development.

Core concepts of Node.js

Now that we’ve covered some of the Node.js basics, let’s look at a few of the core concepts that make this runtime environment tick. To kick things off, we have modules, Event Emitters, Buffer, and REPL.

Modules

Modules, as you may remember, are blocks of code that provide simple or complex functionality, like communicating with external applications. They are popular for their reusability while reducing overall code complexity. There are three types of modules in Node.js: core, local, and third-party.

Core Modules

Core modules are modules you import using the require function, often written as the following:

const module = require(“name_of_module”);

Some examples of core modules include:

  • fs – handles the file system
  • http – make Node.js act as an HTTP web server
  • https – make Node.js act as an HTTPS web server
  • os – provides information about the operating system
  • dns – perform a DNS lookup and name resolution function
  • query string – handles URL query strings

Local Modules

Local modules are modules you define locally for your Node.js application. They include functions for your application via files and folders you write yourself.

To create local modules, you’ll need to use a utility file with a name that looks like utils.js.

You use export code: module.exports to allow other files to access exported code, making it easy to simplify and manipulate objects within your code. Don’t forget, you’ll need to give a require function a path to import the script you want to load, such as:

const utility = require(‘./utils.js’);

utility ();

Third-Party Modules

Third-party modules are those you locate from the Node.js community at large. You can install third-party modules from the Node Package Manager (NPM) online. The NPM initialization command creates a package.json file containing information about the third-party module. Installing these modules uses code similar to:

npm install “module_name”

Event Emitters

Event emitters are the input interactions on your application from end users (events), such as mouse clicks, keystrokes, or reactions. Node.js uses event modules and the EventEmitter class to handle coding, which can look like:

const EventEmitter = require(‘node:events’);

const eventEmitter = new EventEmitter();

The EventEmitter object exposes various methods, including emit and on, to interact with various events. You may also encounter events such as:

  • emitter.once(eventName, listener) – create a one-time listener
  • removeListener(eventName, listener)/off(eventName, listener) – remove an event listener from an event
  • removeAllListeners(eventName) – remove all listeners for an event

Buffer

Buffer handles TCP streams and read-write operations on file systems that require applications to run in pure binary code. Because Node.js cannot control the speed of the stream of binary data, you need a buffer to manage those processes.

Each buffer refers to a particular memory location and is not resizable, as each integer represents a byte of memory. You may encounter buffer code that looks like one of the following:

  • Buffer.alloc(size) – create a buffer and allocate its size
  • Buffer.from(initialization) – initialize a buffer with some given data
  • toString() – read data from a buffer and return it to the console
  • Buffer.slice(start, end=buffer.length) – return a subsection of data stored in a buffer

REPL

REPL or Read, Evaluate, Print, Loop is a programming environment that allows users to input single expressions and receive results on the console after execution. It’s basically a convenient method of testing simple TypeScript code in a short amount of time. You can access REPL by running the node command without any script or arguments.

Global and Process Objects

Global objects are objects available in all Node.js modules. While some variables appear to be global objects, they are likely built-in objects included in the JavaScript language, including:

  • _dirname
  • _filename
  • exports
  • module
  • require()

Consequently, process objects are simply global objects that you can access within a module without having to “require” it.

Key benefits of using Node.js

Though Node.js is undoubtedly more complex than Python, its similarities with JavaScript make it familiar to many programmers. It also has several benefits that make it an ideal tool when creating web and mobile apps. You might find some of these benefits when working with Node.js yourself, including:

  • High-performance and scalability: The non-blocking asynchronous I/O allows for several concurrent requests, making it easy to scale applications. Likewise, the continuous event loops mean processes execute quicker and demand fewer memory resources than in other languages.
  • Large and active community: Node.js is an open-source runtime environment, meaning users can contribute with tips, tricks, and troubleshooting help. The Node.js team uses GitHub.com as a repository, and many team members are active in online spaces, like Discord, Slack communities, Reddit, and public team meetings.
  • Full-stack JavaScript development: Because Node.js uses the V8 engine, it serves as a versatile full-stack framework. Node.js supports front-end and back-end development, regardless of which stage your project is in development.
  • Cross-platform compatibility: Node.js uses JavaScript, which is widely supported by most web browsers and digital platforms. Relying on JavaScript allows programmers to write code once and have it work on many platforms. Additionally, the NPM provides a wide range of modules and packets to further support and simplify cross-platform development.

Of course, you might find that Node.js serves a greater purpose than those listed above. Its flexibility gives programmers greater control over how their applications function and reduces their time to produce a workable product.

Getting started with Node.js

The current version of Node.js is v22.5.1, which was released in April. The Node.js team has long-term support (LTS) scheduled for October, and several other versions are still live with active support. Not only is Node.js flexible for coding, but it’s also available on your favorite operating systems, including Windows, Linux, and macOS.

Installation and setup

Many programmers use Node.js as a back-end runtime environment, leaving many wondering why you would want to install the software on your local device. Many of Node.js’s tools are in JavaScript, meaning your computer needs an engine to run those tools locally.

Furthermore, local debugging and testing are also more efficient and easier. Plus, more often than not, locally maintained development is cheaper than having a separate testing server.

Luckily, downloading and installing Node.js is straightforward, and you have many options for downloading, including:

  • Package Manager
  • Prebuilt Installer
  • Prebuilt Binaries
  • Source Code

Each download choice allows you to select which Node.js version you want to use, the OS, and which platform you want to run it on, such as nvm, fnm, Brew, and Docker. To install Node.js:

  1. Navigate to the node.js/download/package-manager website.
  2. Select which version, operating system, and platform.
  3. Run program installer (if applicable)

Once you have Node.js installed, you will be able to access the node executable program in your command line interface.

Basic Node.js programs

Node.js typically runs in the command line terminal on your devices, and the functions, modules, and engines are available globally. Aside from the obligatory “Hello World!” programs, many high-profile international organizations deploy Node.js programs to meet their needs.

For example, Netflix found that Node.js decreases start-up times and creates a smoother transition from the back end to the front end. The reduced load time and smoother transitions contribute to a more intuitive streaming experience, making audiences wait less as Netflix calls databases for content.

Government entities also find utility in Node.js, as NASA used the technology to move legacy databases into cloud-based environments, which, by some estimates, improved access times by as much as 300%.

Building applications with Node.js

The large community, robust testing, and debugging capabilities, combined with a rich third-party package ecosystem, make building apps with Node.js easy and practical. It has a large set of APIs and features non-blocking I/O, ideal for web apps and command-line applications.

Web development with Node.js

When developing web applications with Node.js, programmers turn to popular frameworks, such as Nest.js or Express.js. Nest.js takes inspiration from the Angular web application framework, and many programmers use it for monolithic design, Rest APIs, server-side applications, and GraphQL applications.

Express.js is another popular framework for RESTful APIs, thanks to the MVC (Model-View-Controller) architecture programming, which allows you to segment an application’s logic into distinct components. Express.js also offers extensive support for template engines, which are essential for dynamic web pages.

These frameworks are popular because of their utility. The asynchronous, non-blocking nature of Node.js in conjunction with these frameworks is ideal for RESTFUL APIs and real-time APIs because the architectural style leverages HTTP to facilitate data exchanges.

Programmers familiar with Node.js and JavaScript will be able to use either Express.js or Nest.js with a minor learning curve, as they’re both designed to complement Node’s capabilities.

Command-line tools

The command-line interface (CLI) is a powerful tool programmers use to communicate with their machines. Creating a basic command-line tool is relatively simple and involves only a handful of steps:

  1. Launch your code editor.
  2. Create a new folder for your new project and name it.
  3. Launch your computer’s terminal or the command-line interface and navigate to your new project.
  4. Run the npm init command. Follow the set-up instructions that populate.
  5. Create an entry-point file such as index.js to write your code.

From there, you can start developing your application using JavaScript, built-in Node.js modules, or third-party modules installed from the NPM.

Data access with Node.js

Node.js is also flexible enough to handle database management. Relational databases like MS SQL Server, Oracle, MySQL, PostgreSQL, and SQLite have drivers available for Node.js for data management.

Likewise, there are drivers available for NoSQL databases, including MongoDB, Cassandra, LevelDB, RavenDB, Neo4j, Redis, and CouchDB. In order to access databases using Node.js, you will need to install its accompanying driver.

Thanks to its platform agnosticism, code reusability, and global access, Node.js is an excellent choice for data access and management.

Deploying and scaling Node.js applications

Node.js is a powerful programming language for modern web applications.

Challenges of deployment

For all of its benefits, there are, naturally, challenges that come with using Node.js for application deployment. Most programmers who frequent Reddit encounter users asking why something or another isn’t working, and most come down to a few recurring themes:

  • Source code is out of date
  • Database issues (versions that are not compatible)
  • Forgetting the NPM install (more common than we’d like to admit)
  • Undefined variable names
  • Not allowing IP access to the server app if firewall rules are in place
  • Poor server management (parsing, storage management, file management)
  • Not utilizing the proper security protocols

The tools found in the Netlify platform can help overcome many of these challenges through a unique blend of features, conditions, and workflows. The Netlify platform builds upon layers to ensure you follow best practices and develop applications that meet your needs rather than wasting time with needless redundancies.

Introduction to serverless functions

Node.js has robust server-side application support, but it can require dedicated time and resources to maintain. A growing trend is the move toward serverless functions, an approach to software design that allows you to build and run applications without maintaining the underlying infrastructure.

Basically, serverless functions allow you to code while a cloud provider, such as us here at Netlify, provides servers to run your applications, databases, and storage systems at virtually any scale.

Not only does that allow you to focus on best practices of code development, testing, debugging, and deployment, but it also saves you the money you would spend maintaining the infrastructure requirements.

Netlify as a platform for Node.js

So, what do Node.js, frameworks, and serverless functions all have in common? The answer is Netlify.

Netlify’s CLI makes Node.js development and deployment quick and easy. It supports global CDN and continuous deployment (CD), which improves security, stability, and application quality.

When you use the express.js framework with Netlify, you enjoy serverless functions, allowing you to program without worrying about a dedicated server. It’s also possible to develop and deploy Node.js apps with Netlify with or without a front-end app, giving you even more flexibility.

Request a demo today to explore the new possibilities of combining Node.js with Netlify.

Unleash the power of Node.js with Netlify

Node.js is a powerful asynchronous, non-blocking I/O JavaScript runtime with the ability to develop web apps and manage databases. We’ve touched on some of the fundamentals and concepts essential to programming in Node.js and why mid-level programmers like you choose to use it.

We also covered serverless functions and how transitioning away from dedicated servers can save you money and resources for other projects. Finding the right partner for your Node.js and serverless functions is just as important as the fundamentals.

Partnering with Netlify ends that search early, allowing you to return to programming and developing apps. Sign up today to start deploying Node.js with Netlify and experience a more enjoyable way to program.

Keep reading

Recent posts

How do the best dev and marketing teams work together?