Monorepo Patterns

+15 Mana ✨

Share code across multiple apps with a monorepo.

Monorepo Structure

my-monorepo/
ā”œā”€ā”€ apps/
│   ā”œā”€ā”€ web/               # Main SvelteKit app
│   │   ā”œā”€ā”€ package.json
│   │   └── src/
│   ā”œā”€ā”€ admin/             # Admin SvelteKit app
│   │   └── package.json
│   └── docs/              # Documentation site
ā”œā”€ā”€ packages/
│   ā”œā”€ā”€ ui/                # Shared components
│   │   ā”œā”€ā”€ package.json
│   │   └── src/
│   │       ā”œā”€ā”€ Button.svelte
│   │       └── index.js
│   ā”œā”€ā”€ core/              # Business logic
│   │   ā”œā”€ā”€ package.json
│   │   └── src/
│   │       └── cart.svelte.js
│   └── config/            # Shared configs
│       ā”œā”€ā”€ eslint/
│       └── tsconfig/
ā”œā”€ā”€ package.json
ā”œā”€ā”€ pnpm-workspace.yaml    # or npm/yarn workspaces
└── turbo.json             # Turborepo config

Workspace Configuration

yaml
# pnpm-workspace.yaml
packages:
  - 'apps/*'
  - 'packages/*'

Sharing Svelte Components

json
// packages/ui/package.json
{
  "name": "@myorg/ui",
  "svelte": "./src/index.js",
  "exports": {
    ".": {
      "svelte": "./src/index.js"
    }
  }
}
javascript
// packages/ui/src/index.js
export { default as Button } from './Button.svelte';
export { default as Card } from './Card.svelte';
javascript
// apps/web - Using shared components
import { Button, Card } from '@myorg/ui';

Sharing Runes Logic

javascript
// packages/core/src/cart.svelte.js
export class Cart {
  items = $state([]);
  
  get total() {
    return this.items.reduce((sum, i) => sum + i.price, 0);
  }
  
  add(item) {
    this.items = [...this.items, item];
  }
}

This works in Svelte apps, React apps (with adapter), or Node.js scripts!

Build Tools

Turborepo - Fast builds with caching

bash
npx create-turbo@latest

Nx - Full-featured monorepo tool

bash
npx create-nx-workspace

šŸ“– Turborepo

āœ“ Completed