DEV Community

Cover image for Mono Repository Solutions in the Industry and the PNPM Practice in ReactPress
FECommunity
FECommunity

Posted on

Mono Repository Solutions in the Industry and the PNPM Practice in ReactPress

🌟 Welcome to ReactPress!

Thank you for showing interest in our project! If you find ReactPress helpful or if you'd like to support our work, please consider giving us a 🌟 Star! It helps us gain more visibility and attract more contributors and users.

👉 Click here to Star the Project Now! 🚀

Mono Repository Solutions in the Industry and the PNPM Practice in ReactPress

In today's software development landscape, Mono Repository (Monorepo) has emerged as a popular approach to code management, especially in large-scale projects and cross-team collaborations. This article will first introduce several mainstream Monorepo solutions in the industry and then delve into why the ReactPress project chose PNPM as its package management tool, accompanied by relevant code examples and in-depth technical insights.

I. Mainstream Mono Repository Solutions in the Industry

A Mono Repository is a way to store the code of multiple projects in a single repository. Compared to Multi Repository (Multirepo), Monorepo offers advantages such as convenient code reuse, simplified dependency management, and smoother cross-team collaboration. Here are several mainstream Monorepo solutions:

  1. Bazel

Bazel, an open-source build and testing tool developed by Google, naturally supports the Monorepo model. Bazel defines build rules for projects through BUILD files, enabling efficient management and building of multiple modules within a Monorepo.

  1. Lerna

Lerna is a Monorepo management tool in the JavaScript community that supports managing multiple npm packages within a single repository. Lerna provides commands such as bootstrap and publish, facilitating tasks such as linking and publishing packages in a Monorepo environment.

  1. Bolt

Bolt, developed by Salesforce, is a tool for managing Monorepos that supports multiple programming languages. It provides a set of command-line tools to simplify Monorepo management. Bolt also offers features such as dependency injection and configuration management, enhancing the flexibility and maintainability of Monorepos.

  1. Yarn Workspaces

Yarn, a JavaScript package management tool launched by Facebook, supports Monorepos through its Workspaces feature. Yarn Workspaces automatically handles cross-package dependencies and optimizes the installation process to improve build efficiency.

II. The PNPM Practice in ReactPress

ReactPress is an open-source publishing platform based on React that supports blog management, article reading, mobile adaptation, componentization, internationalization, theme switching, and more. The ReactPress project chose PNPM as its package management tool due to several key advantages of PNPM:

  1. Efficient Storage

PNPM uses hard links and symbolic links to achieve shared package content, avoiding the installation of the same version of a package multiple times. This makes PNPM significantly more storage-efficient than npm and Yarn, especially in large Monorepo projects, where it can significantly reduce storage space usage.

  1. Fast Installation

PNPM employs content-addressed storage, uniquely identifying package content through hash values. This allows PNPM to directly copy content from local storage during installation, without downloading it from a remote repository. Additionally, PNPM supports parallel installation and incremental updates, further enhancing installation speed.

  1. Strict Dependency Management

PNPM provides strict dependency management capabilities, automatically generating a lockfile (such as pnpm-lock.yaml) to record the exact versions of project dependencies. This helps ensure consistency across different environments and avoids build issues caused by inconsistent dependency versions.

Next, we will demonstrate the PNPM practice in the ReactPress project through code examples.

1. Cloning the ReactPress Repository

First, we need to clone the ReactPress repository from GitHub. You can use the following command:

git clone https://github.com/fecommunity/reactpress.git
cd reactpress
Enter fullscreen mode Exit fullscreen mode
2. Installing PNPM

If PNPM is not already installed on your system, you can install it using the following command:

npm install -g pnpm
Enter fullscreen mode Exit fullscreen mode
3. Installing Project Dependencies

In the project root directory, run the following command to install the required dependencies for the project:

pnpm install
Enter fullscreen mode Exit fullscreen mode

PNPM will automatically resolve and install all dependencies in the project based on the package.json and pnpm-workspace.yaml files.

4. Configuring the MySQL Database

The ReactPress project uses a MySQL database to store data. Before starting the project, ensure that the MySQL database service is running and create the corresponding database and tables according to the settings in the .env configuration file.

An example .env configuration file is as follows:

DB_HOST=127.0.0.1  # Database address
DB_PORT=3306       # Port
DB_USER=reactpress # Username
DB_PASSWD=reactpress # Password
DB_DATABASE=reactpress # Database name
Enter fullscreen mode Exit fullscreen mode
5. Starting the Project

After installing the dependencies and configuring the environment variables, you can run the following command to start the ReactPress project:

pnpm run dev
Enter fullscreen mode Exit fullscreen mode

Once the project is started, you can open a browser and visit http://localhost:3000 (or the port configured in the .env file) to see the login or registration page of ReactPress.

6. Project Structure Analysis

The ReactPress project adopts a front-end and back-end separation design. The front-end uses React and NextJS frameworks, while the back-end uses the NestJS framework. The project structure is roughly as follows:

reactpress/
├── client/          # Front-end code
│   ├── components/  # Front-end components
│   ├── pages/       # NextJS pages
│   ├── public/      # Public resources
│   ├── styles/      # Style files
│   ├── utils/       # Utility functions
│   ├── ...          # Other front-end-related files
├── server/          # Back-end code
│   ├── controllers/ # Controllers
│   ├── dto/         # Data Transfer Objects
│   ├── entities/    # Entity classes
│   ├── migrations/  # Database migrations
│   ├── modules/     # Modules
│   ├── services/    # Service layer
│   ├── ...          # Other back-end-related files
├── .env             # Environment configuration file
├── package.json     # Project dependency file
├── pnpm-lock.yaml   # PNPM lock file
├── pnpm-workspace.yaml # PNPM workspace configuration file
└── ...              # Other project-related files
Enter fullscreen mode Exit fullscreen mode

In the front-end code, ReactPress uses a component-based development model, with each component being independent and reusable. With PNPM's package management capabilities, it is easy to add, modify, or delete components to meet the changing needs of the project.

In the back-end code, ReactPress uses the NestJS framework to build an efficient server-side application. NestJS provides modular design, dependency injection, and other features, making the back-end code clearer and easier to maintain.

III. Conclusion

As an open-source publishing platform based on React, ReactPress implements efficient code and dependency management through the adoption of Monorepo and PNPM practices. PNPM's efficient storage, fast installation, and strict dependency management capabilities provide powerful support for the development of the ReactPress project. As the ReactPress project continues to grow and expand in the future, it is believed that PNPM will play an increasingly important role.

Through the introductions and code examples in this article, readers can understand the applications and practices of Monorepo solutions and PNPM in the ReactPress project. We hope that this content will provide useful references and insights for readers in large-scale projects and cross-team collaborations.

Top comments (2)

Collapse
 
fecommunity_27 profile image
FECommunity

🌟 Welcome to ReactPress!

Thank you for showing interest in our project! If you find ReactPress helpful or if you'd like to support our work, please consider giving us a 🌟 Star! It helps us gain more visibility and attract more contributors and users.

👉 Click here to Star the Project Now! 🚀

Collapse
 
fecommunity_27 profile image
FECommunity