Simplify Immutable Data Structures in JavaScript with Immer.js

Introduction

It can be difficult to maintain immutability with JavaScript, especially when working with intricate data structures. However, leveraging immutable data structures can simplify code complexity and enhance performance by preventing unintended modifications to data.

Although JavaScript offers certain built-in features for immutability, the procedure of constructing and modifying immutable objects can quickly become tedious and prone to mistakes. However, with Immer.js a lightweight and easy-to-use library, developers can simplify the process of creating and updating immutable data structures in JavaScript.

In this blog post, we will explore how Immer.js works and how it can simplify creating and updating immutable data structures in JavaScript. We will also cover the advantages of using Immer.js, provide examples, and highlight some common use cases. If you're a developer looking to streamline your code and ensure data consistency, Immer.js might just be the tool you need.

Prerequisites

Immer.js is a JavaScript library designed for working with immutable data structures. To use Immer.js, it's important to have a basic understanding of JavaScript and its syntax. Additionally, you should keep in mind the following prerequisites:

  • Familiarity with ES6 syntax

  • Knowledge of immutable data structures

Get Started

To get started with Immer.js, you first need to install it using npm or yarn:

  • NPM: npm install immer

  • Yarn: yarn add immer

Using CDN link:

Once you have included Immer.js, you can then use it to create immutable objects by calling the produce function. The produce function takes two arguments: the original object and a function that modifies the object. Then, after the function returns the modified object, Immer.js will use it to create a new, immutable version of the object.

For example, let's say you have an object called "cars" that contains a name and a productionYear:

without Immer.js:

const car1 = { name: "Benz", productionYear: 1966 };
const car2 = { name: "Lexus", productionYear: 1973 };
const car3 = { name: "Kia", productionYear: 2000 };
const newCar = [car1, car2, car3].map((car) => ({
  ...car,
  productionYear:
    car.name === "Benz" ? 1965 : car.name === "Lexus" ? 1974 : 1999,
}));

console.log(newCar);

In this code, there are three car objects: car1, car2, and car3. These objects contain properties such as name and productionYear that describe each car. The newCar variable uses the map() method to create a new array based on the original array of cars. For each car object in the original array, the map() method creates a new object with the spread syntax (...car) to copy all the properties of the original object.

With Immer.js:

import produce from "immer";

const car1 = { name: "Benz", productionYear: 1966 };
const car2 = { name: "Lexus", productionYear: 1973 };
const car3 = { name: "Kia", productionYear: 2000 };
const newCar = produce([car1, car2, car3], (draft) => {
  draft[0].productionYear = 1965;
  draft[1].productionYear = 1974;
  draft[2].productionYear = 1999;
});

console.log(newCar);

This code imports the produce function from the immer library. The produce function is used for creating immutable state by allowing developers to work with a draft version of the state, apply changes to the draft, and then automatically generate an updated immutable state.

In this code, three objects car1, car2, and car3 are defined with two properties: name and productionYear. These objects are then passed as an array to the produce function along with a callback function that modifies the production year property of each car in the draft array.

The callback function uses the draft parameter to modify the production year property of each car in the draft array. Finally, the produce function generates a new immutable state with the updated properties, which is stored in the newCar variable.

Conclusion

In conclusion, immer.js is a useful and powerful library for developers who work with immutable data structures in JavaScript. Its API is intuitive and user-friendly, enabling developers to write cleaner and more concise code that is easy to understand. With immer.js, developers can create immutable copies of complex data structures and make changes to them without worrying about unintended mutations. Additionally, immer.js provides advanced features such as automatic freezing, deep cloning, and structural sharing, which can enhance performance in high-traffic applications. Whether you are working on a small personal project or a large-scale enterprise application, immer.js can help you write better code with fewer errors and less complexity.

Credits

0
Subscribe to my newsletter

Read articles from Adegoke Ayobami Seun directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Adegoke Ayobami Seun
Adegoke Ayobami Seun

Hi, I'm Adegoke Ayobami Seun, a software developer. I'm proficient in working with languages such as JavaScript, TypeScript, and C#. I also build frontend applications using libraries like React and Next.js and backend applications with Node Express and .NET. Additionally, I have experience working with AWS services.