Skip to content

Performance

Projex is designed to add minimal overhead to your project. This page documents component render performance and API fetch efficiency.

Benchmarks

Projex includes comprehensive benchmarks for measuring component render times, API fetch performance, and utility function efficiency.

Running Benchmarks

bash
# Run all benchmarks
pnpm --filter @manningworks/projex benchmark

# Or from the core package
cd packages/core && pnpm benchmark

Component Render Performance

Components are benchmarked with 100 renders to get accurate average times:

ComponentMean Render TimeStatus
ProjectCard (full)< 1ms
ProjectView (full)< 1ms

All component renders complete in sub-millisecond time. The compound component architecture ensures minimal overhead.

API Fetch Performance

Fetch functions are measured with mocked responses to isolate parsing overhead:

FunctionTargetActual (mean)Status
fetchGitHubRepo (cached)< 1s~18ms
fetchGitHubRepo (no cache)< 2s~19ms
fetchNpmPackage< 2s~34ms
fetchProductHuntPost< 3s~20ms

TIP

All API functions complete well under their targets. Real-world performance depends on network latency and API response times.

Utility Function Performance

Utility benchmarks process 1000 projects to measure filtering and sorting efficiency:

OperationTargetActualStatus
filterByType< 50ms< 1ms
filterByStatus< 50ms< 1ms
filterByFeatured< 50ms< 1ms
sortByName< 50ms< 1ms
sortByDate< 50ms< 1ms
sortByStars< 50ms< 1ms
Combined (filter + sort)< 50ms< 1ms

All utility operations on 1000 projects complete in under 1ms.

CI Integration for Performance Regression

Add to your CI pipeline to catch performance regressions:

yaml
# .github/workflows/benchmarks.yml
- name: Run benchmarks
  run: pnpm --filter @manningworks/projex benchmark

Benchmarks run on every PR to ensure no performance regressions are introduced.

Tree-Shaking

All exports are fully tree-shakeable. Importing only what you need significantly reduces bundle impact.

Component Imports

tsx
// Import only ProjectCard (~320 B gzipped)
import { ProjectCard } from '@manningworks/projex'

// Import multiple components (only used ones are included)
import { ProjectCard, ProjectView } from '@manningworks/projex'

Utility Imports

tsx
// Import only what you need
import { defineProjects, sortByStars } from '@manningworks/projex'

// Type imports have zero runtime cost
import type { ProjexProject, ProjectType } from '@manningworks/projex'

NPM Timestamps Option

The fetchNpmTimestamps option extracts timestamps from the npm registry with zero extra API calls:

tsx
defineProjects(projects, {
  fetchNpmTimestamps: true,  // No additional network requests
})

The npm registry response already includes time.created and time.modified fields. Enabling this option simply extracts the data from the existing response.

What Gets Tree-Shaken

  • Unused components are completely eliminated
  • Unused utilities are removed (e.g., defineProjects is an identity function that compiles away)
  • Types have zero runtime impact

Zero Styling Overhead

Projex ships with zero CSS. All styling hooks are provided through data attributes:

css
/* You control every byte of CSS */
[data-projex-card] {
  /* Your styles here */
}

This means:

  • No CSS-in-JS runtime
  • No styled-components dependency
  • No CSS file downloads
  • Complete styling flexibility

External Dependencies

@manningworks/projex

Projex has zero runtime dependencies beyond React (which you already have):

react        - peer dependency (you provide)
react-dom    - peer dependency (you provide)

The CLI is included in the same package and has minimal dependencies for its functionality:

commander    - CLI framework (~20 KB)
inquirer     - Interactive prompts (~30 KB)
chalk        - Terminal colors (~10 KB)

These CLI dependencies are only used when running npx @manningworks/projex commands - they don't impact your production bundle.

Optimization Tips

1. Use Type-Only Imports

tsx
// Good: Zero runtime cost
import type { ProjexProject } from '@manningworks/projex'

// Works the same but doesn't hint tree-shaking
import { ProjexProject } from '@manningworks/projex'

2. Import Components Individually

tsx
// Good: Tree-shakes unused components
import { ProjectCard } from '@manningworks/projex'
import { ProjectView } from '@manningworks/projex'

// Avoid: Prevents tree-shaking analysis
import * as Projex from '@manningworks/projex'

3. Use Data Attributes for Styling

css
/* Good: Pure CSS, zero JS */
[data-projex-card] { ... }

/* Avoid: Adds CSS-in-JS runtime */
import styled from 'styled-components'

Baseline Measurements

Current baseline (as of measurement):

json
{
  "timestamp": "2026-02-22T00:00:00.000Z",
  "packages": [
    {
      "name": "@manningworks/projex",
      "target": "< 10 KB gzipped",
      "gzipped": 2805,
      "passes": true
    }
  ]
}

Significant size increases should be investigated and documented.