DEV Community

Cover image for A Step-by-Step Guide to Debugging and Setting Up a Turborepo-Driven Monorepo with Next.js and pnpm
TD!
TD!

Posted on

A Step-by-Step Guide to Debugging and Setting Up a Turborepo-Driven Monorepo with Next.js and pnpm

Introduction

In modern web development, managing multiple applications or services in a monorepo setup is becoming increasingly common, especially in complex projects involving both frontend and backend services. Tools like Turborepo make it easier to handle builds, development tasks, and performance optimizations in such a setup, while pnpm provides a powerful package management solution with workspace support. However, setting up these tools in a Next.js project and troubleshooting issues can be daunting, especially for beginners.

This guide will walk through the technical details, debugging steps, and solutions learned from an issue encountered during the development of a Next.js e-commerce project using pnpm, Turborepo, and Next.js. By the end of this report, you'll have a clear understanding of how to configure and troubleshoot a Turborepo monorepo setup using pnpm and Next.js.

Key Concepts and Tools

1. Monorepo and Turborepo

  • Monorepo: A monorepo is a single repository that holds multiple projects or packages, which can be related or unrelated. In this case, the repository contains both the backend and frontend (Next.js) projects.
  • Turborepo: Turborepo is a high-performance build system for JavaScript and TypeScript monorepos. It helps manage the build pipeline and caches operations to reduce build times in large projects.

2. pnpm: A Fast and Efficient Package Manager

  • pnpm is a package manager that helps manage dependencies efficiently using a unique symlink strategy. It supports workspaces, making it ideal for monorepos.

3. Next.js: A React Framework for Production

  • Next.js is a popular framework for React applications, providing server-side rendering, static site generation, and API routes out-of-the-box.

Problem Overview

During the development of a monorepo-based e-commerce project with Next.js, we encountered an error while running the development environment for the frontend:

Error: Cannot find module 'C:\Dev\coconoto\frontend\node_modules\turbo\bin\turbo'
Enter fullscreen mode Exit fullscreen mode

This error occurred when trying to run the dev script for the frontend workspace via Turborepo. The root cause was related to incorrect Turborepo configuration and dependency management in the pnpm workspace setup.

Key Challenges:

  1. Turbo CLI not found in the workspace: The dev script was not working because the turbo binary was missing.
  2. Configuration issues with turbo.json: Tasks such as dev and build were not configured correctly in turbo.json.
  3. Dependency management with pnpm: Proper installation and linking of the turbo package across workspaces was essential.

Step-by-Step Guide to Setting Up Turborepo with pnpm and Next.js

Step 1: Setting Up the Monorepo with pnpm Workspaces

Start by configuring pnpm workspaces to manage the backend and frontend projects within the same repository.

Directory Structure:
root/
 ├── backend/
 ├── frontend/
 ├── package.json
 ├── pnpm-workspace.yaml
Enter fullscreen mode Exit fullscreen mode
package.json in Root Directory:
{
  "name": "vendure-nextjs-ecommerce",
  "version": "1.0.0",
  "scripts": {
    "build:backend": "npm run build -w backend",
    "build:frontend": "npm run build -w frontend",
    "run:dev:backend": "npm run dev -w backend",
    "run:dev:frontend": "npm run dev -w frontend",
    "run:dev:all": "run-p run:dev:backend run:dev:frontend"
  },
  "workspaces": ["backend", "frontend"],
  "dependencies": {
    "npm-run-all": "^4.1.5"
  }
}
Enter fullscreen mode Exit fullscreen mode
pnpm-workspace.yaml:
packages:
  - "backend"
  - "frontend"
Enter fullscreen mode Exit fullscreen mode

This configuration allows pnpm to manage dependencies across the backend and frontend directories, treating them as part of the same workspace.

Step 2: Installing and Configuring Turborepo

Installing Turbo

You need to install Turborepo as a development dependency in the root of the project. The following command adds Turbo to the root workspace:

pnpm add turbo@latest -D -w
Enter fullscreen mode Exit fullscreen mode

This ensures that Turborepo is available for both the backend and frontend workspaces.

Step 3: Creating the turbo.json Configuration

In the frontend directory, create a turbo.json file to define tasks for Turborepo. Here's a sample configuration:

{
  "$schema": "https://turborepo.org/schema.json",
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**"]
    },
    "dev": {
      "cache": false
    },
    "lint": {
      "outputs": []
    },
    "test": {
      "outputs": []
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

This defines basic tasks for build, dev, lint, and test. The dev task will be used to run the Next.js development server.

Step 4: Configuring Next.js in the Frontend

In the frontend/package.json, ensure that Next.js is correctly installed and the dev script points to it:

{
  "name": "frontend",
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start"
  },
  "dependencies": {
    "next": "latest",
    "react": "latest",
    "react-dom": "latest"
  }
}
Enter fullscreen mode Exit fullscreen mode

Next.js will now be available to run in the frontend workspace.

Step 5: Running the Project

With everything configured, you can now start the development server for the frontend using:

pnpm run run:dev:frontend
Enter fullscreen mode Exit fullscreen mode

If everything is set up correctly, this command will invoke the dev script in the frontend workspace, running next dev to start the Next.js development server.


Troubleshooting Common Issues

1. Turbo Binary Not Found

If you encounter an error like this:

Error: Cannot find module 'C:\Dev\coconoto\frontend\node_modules\turbo\bin\turbo'
Enter fullscreen mode Exit fullscreen mode

Ensure that:

  • Turbo is installed correctly in the root directory.
  • You've run pnpm install in the root to link all dependencies.
  • The turbo.json file is correctly configured in the frontend workspace.

2. Workspace Configuration in pnpm

If you see errors related to workspace configuration, verify that your pnpm-workspace.yaml is correctly set up and all workspaces are listed.

Run:

pnpm install --filter frontend
Enter fullscreen mode Exit fullscreen mode

to install the dependencies specific to the frontend workspace.


Conclusion

This report covered the process of configuring and troubleshooting a monorepo setup using pnpm, Turborepo, and Next.js. Managing a monorepo can introduce complexity, but tools like Turborepo help streamline the process by handling task orchestration and caching.

By following the steps outlined in this guide, you can effectively set up a Next.js-based project in a monorepo structure, manage dependencies with pnpm, and leverage Turborepo to optimize build and development tasks.

Key Learnings:

  • How to set up a monorepo with pnpm workspaces.
  • The role of Turborepo in managing build and dev pipelines.
  • Troubleshooting common issues with package managers and task runners in a monorepo.

Top comments (0)