DEV Community

Cover image for Monorepo Concept
Melih Şahin
Melih Şahin

Posted on

Monorepo Concept

Monorepo is a software development strategy where multiple projects are managed in a single code repository. In this strategy, each project has its own folder or package, but all code resides in a single repository. Monorepo can be a powerful tool for managing large and complex codebases.

Image description

Advantages of monoreponement:

  • Reduces repetition: Because code used in multiple projects is kept in one place, code duplication is reduced. This makes the code base more consistent and easier to maintain.
  • Increases productivity: Monorepo makes it easier for development teams to make changes to the codebase and add new features. Using a single repository makes things like code reviews and merges simpler.
  • Accelerates development: Monorepo ensures that changes to the codebase are instantly reflected across all projects. This speeds up the development cycle and enables faster deliveries.

Disadvantages of Monorepon:

  • Complexity: Monorepo can be a more complex structure for large and complex codebases. This can make it difficult to navigate and debug the codebase.
  • Performance: Monorepo may require more storage and processing power for large codebases.
  • Training: Monorepo may require development teams to learn a new way of working.

JavaScript Libraries for Using Monorepo:

Many JavaScript libraries are available to facilitate development with Monorepo. Some of the most popular libraries are:

  • Lerna: A JavaScript library that makes developing with Monorepo easier. Lerna helps automate things like package management, task execution and version control.
  • Yarn: JavaScript package manager. It has many features that make developing with Monorepo easier.
  • Nx: It is a tool for developing applications with various technologies such as Angular and React. Nx supports monorepo builds and allows you to manage multiple projects or libraries in a single repository. It also offers various features to facilitate the development process.
  • Rush: It is a monorepository management tool developed by Microsoft. It has many features similar to Lerna.

Monorepo can be a powerful tool for managing large and complex codebases. If you are considering using Monorepo, it is important to first carefully evaluate the advantages and disadvantages of this strategy.

Let’s make a simple monorepo project using Lerna and React JS.

  • First, install Lerna:
npm install -g lerna

Enter fullscreen mode Exit fullscreen mode
  • Next, create a home folder and go into it:
mkdir monorepo-example
cd monorepo-example
Enter fullscreen mode Exit fullscreen mode
  • Command to install monorepo with Lerna:
lerna init
Enter fullscreen mode Exit fullscreen mode

Let’s have two packages, “common” and “sample-app”. Our scenario is to use the modal component in the common package in the sample-app application.

  • Let’s create a folder packages and inside it create a folder common and a folder sample-app:
mkdir packages
cd packages
mkdir common
mkdir sample-app
Enter fullscreen mode Exit fullscreen mode
  • Let’s go inside each package and create React applications:
cd packages/common
npx create-react-app .
cd ../sample-app
npx create-react-app .
Enter fullscreen mode Exit fullscreen mode
  • To add the dependency between sample-app and common, let’s give the common package as a dependency of the sample-app package:

package.json

...
 "dependencies": {
    "common": "file:../common/src/components/modal"
  },
...
Enter fullscreen mode Exit fullscreen mode

Then run the yarn command to install the package:

yarn
Enter fullscreen mode Exit fullscreen mode

Let’s add the Modal component in the sample-app package:

App.js

import Modal from "common/src/components/modal/Modal";

const App = () => {
  return (
    <div className="App">
      <header className="App-header">
        <h1>Monorepo Example App</h1>
        <Modal/>
      </header>
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

You may need an additional loader to handle the result of these loaders.

When we stand up the sample-app package, we are likely to get an error like below. So we will need to configure webpack with a package called “craco”. After installing the package, let’s create a craco.config.js file in the main directory and add the following codes.

yarn add -D @craco/craco
Enter fullscreen mode Exit fullscreen mode
const path = require("path");
const { getLoader, loaderByName } = require("@craco/craco");

const packages = [];
packages.push(path.join(__dirname, "../common"));
module.exports = {
  webpack: {
    configure: (webpackConfig, arg) => {
      const { isFound, match } = getLoader(webpackConfig, loaderByName("babel-loader"));
      if (isFound) {
        const include = Array.isArray(match.loader.include)
          ? match.loader.include
          : [match.loader.include];

        match.loader.include = include.concat(packages);
      }

      return webpackConfig;
    },
  },
};
Enter fullscreen mode Exit fullscreen mode

Image description

You can access the source codes of the sample project from this link. 🔗

Continue with content 🚀
You can access my other content by clicking this link. I would be very happy if you like and leave a comment 😇

Quadratic AI

Quadratic AI – The Spreadsheet with AI, Code, and Connections

  • AI-Powered Insights: Ask questions in plain English and get instant visualizations
  • Multi-Language Support: Seamlessly switch between Python, SQL, and JavaScript in one workspace
  • Zero Setup Required: Connect to databases or drag-and-drop files straight from your browser
  • Live Collaboration: Work together in real-time, no matter where your team is located
  • Beyond Formulas: Tackle complex analysis that traditional spreadsheets can't handle

Get started for free.

Watch The Demo 📊✨

Top comments (0)

Image of DataStax

AI Agents Made Easy with Langflow

Connect models, vector stores, memory and other AI building blocks with the click of a button to build and deploy AI-powered agents.

Get started for free

👋 Kindness is contagious

Engage with a wealth of insights in this thoughtful article, valued within the supportive DEV Community. Coders of every background are welcome to join in and add to our collective wisdom.

A sincere "thank you" often brightens someone’s day. Share your gratitude in the comments below!

On DEV, the act of sharing knowledge eases our journey and fortifies our community ties. Found value in this? A quick thank you to the author can make a significant impact.

Okay