DEV Community

Cover image for Pure Functions in Next.js
saber-mekki
saber-mekki

Posted on

Pure Functions in Next.js

Introduction

While working with Next.js, a very famous React framework for building server-side rendered and static web applications, one of the very important concepts you are going to meet is a pure function. Pure functions are among those principal topics one has to grasp in functional programming and take a huge part in making your code reliable and serviceable. We shall look into what exactly a pure function is, why it is important, and how to use one effectively within a Next.js application.


What is a Pure Function?

A pure function could be defined as a function that meets the following two basic requirements:

  • Deterministic: It always returns the same output for a given input.

  • Side-effect Free: It has no side effects; that is, it does not
    modify any state or have an effect on the world outside.

The next example will be a pure function. JavaScript provides a very good example of such a function:

function add(a, b) {
  return a + b;
}
Enter fullscreen mode Exit fullscreen mode

No matter which a and b are passed to this function, it will always yield the same value and has no side effects, nor does it mutate any external state.


Why Use Pure Functions?

Pure functions have the following benefits:

  • Predictability: Since pure functions always return the same output for any given input, they become more predictable and easier to reason about during debugging. It means that pure functions can be tested in isolation without mocking external dependencies.

  • Immutability: There are no side effects inside pure functions, resulting in much safer, more reliable code.


Pure Functions in Next.js

Pure functions can be utilized in various areas of your Next.js app, from components and utility functions to data transformations.

Components

React components can also be pure functions. In fact, all functional components are pure functions where props are passed as an argument returning a React element as the result. The following is an example of a pure functional component in Next.js:

import React from 'react';

function SayHello(name) {
  return <h1>Hello, {name}!</h1>;
};

export default SayHello;
Enter fullscreen mode Exit fullscreen mode

This component is pure because it always returns the same output for the same props and has no side effects.

Functions

All utility functions used in your Next.js application should be pure as well

A utility function that capitalizes the first letter of a string:

export function capitalizeFirstLetter(string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}
Enter fullscreen mode Exit fullscreen mode

This function is pure because it consistently returns the same output for the same input without modifying any external state.


Fetching Data and Side Effects

While pure functions are a cornerstone, not all functions in a Next.js application can or should be pure. This is true, for example, of data fetching functions. By definition, they have side effects – they make requests to external APIs or databases.

In Next.js, data fetching generally occurs through functions like getStaticProps **or **getServerSideProps, which are explicitly designed to run side effects. Such functions are not pure, but they isolate side effects to parts of your application so that the rest is more tractable.

As for a concrete example of data fetching in Next.js, here it is:


export async function getStaticProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: {
      data,
    },
  };
}
Enter fullscreen mode Exit fullscreen mode

Combining Pure and Impure Functions

In practice, a Next.js application will contain pure and impure functions. However, what is important is that you isolate the impure ones and keep the maximum portion of your codebase pure. This will bring semantic epithets and ensure maintainability for your app.

As such, you can isolate concerns into pure functions to format data fetched from an API the following way:

// Impure function 
export async function fetchData() {
  // fetches data from an API
}

// Pure function
export function formatData(data) {
  //formats the fetched data
}
Enter fullscreen mode Exit fullscreen mode

Conclusion

Writing pure functions is one of the cornerstones of functional programming, which can bring a huge potential improvement in the quality of your Next.js applications. With them, you guarantee that your code will become more predictable, hence more testable, and less vulnerable to bugs. Totally writing pure functions is not quite possible, but isolating side effects and keeping most of your codebase pure will make for a more maintainable and robust application.

Top comments (0)