Skip to content

chore: Reduce node_modules size and optimize dependency tree #175

@kitelev

Description

@kitelev

Current Status

Total Size: 367 MB node_modules

  • Root: 317 MB
  • packages/core: 25 MB
  • packages/cli: 25 MB

Issue: Large dependency footprint impacts:

  • ⏱️ Installation time
  • 💾 Disk space usage
  • 🔄 CI/CD performance
  • 📦 Repository size (via .gitignore patterns)

Analysis Required

1. Dependency Audit

# Find largest packages
npx npkgs --sort=size --limit=20

# Check for duplicates
npm ls --all | grep -E "deduped|ERR"

# Identify unused dependencies
npx depcheck

2. Workspace Optimization

Current structure may have redundancy:

node_modules/           (317 MB)
packages/core/node_modules/    (25 MB)
packages/cli/node_modules/     (25 MB)

Potential issues:

  • Dependencies duplicated across workspaces
  • TypeScript installed 3 times (root + 2 packages)
  • @types/* packages duplicated

Optimization Strategies

1. Migrate to pnpm (Est. savings: 40-50%)

pnpm uses hard links and content-addressable storage:

# Before (npm)
367 MB total

# After (pnpm) - estimated
~180-220 MB (40-50% reduction)

Benefits:

  • Deduplicated storage across projects
  • Faster installs (parallel + cache)
  • Stricter dependency resolution
  • Disk space savings

Migration:

npm install -g pnpm
rm -rf node_modules packages/*/node_modules
pnpm install

Effort: 1-2 hours (test compatibility)


2. Deduplicate Dependencies (Est. savings: 10-15%)

# Find duplicates
npm dedupe

# Or manually in package.json
npm ls typescript
# If multiple versions → lock to one

# After deduplication
npm install

Effort: 30 minutes


3. Remove Unused Dependencies (Est. savings: 5-10%)

# Audit for unused packages
npx depcheck

# Remove unused devDependencies
npm uninstall <unused-package>

Common candidates:

  • Unused testing utilities
  • Deprecated packages
  • Redundant type definitions
  • Development tools no longer needed

Effort: 1 hour


4. Optimize Workspace Dependencies (Est. savings: 5-10%)

Current inefficiency:

// Root package.json
"devDependencies": {
  "typescript": "4.8.4",
  "@types/node": "^18.19.129"
}

// packages/core/package.json
"devDependencies": {
  "typescript": "5.9.3",      // ← Different version!
  "@types/node": "^20.19.23"  // ← Different version!
}

Solution: Hoist common devDependencies to root:

// Root only
"devDependencies": {
  "typescript": "5.9.3",
  "@types/node": "^20.19.23",
  "jest": "^30.0.5",
  "eslint": "^9.38.0"
}

// Packages: remove duplicates

Effort: 1-2 hours


5. Use Lighter Alternatives (Est. savings: variable)

Consider swapping heavy packages:

Current Size Alternative Size Savings
moment.js 15 MB date-fns 4 MB -73%
lodash 4 MB lodash-es 1 MB -75%

Check current heavyweights:

npx npkgs --sort=size | head -20

Effort: 2-3 hours (per swap)


Implementation Plan

Phase 1: Analysis (1 hour)

  • Run npx npkgs --sort=size
  • Run npm ls --all | grep -E "deduped"
  • Run npx depcheck
  • Document findings

Phase 2: Quick Wins (1-2 hours)

  • Run npm dedupe
  • Remove unused dependencies
  • Hoist common devDependencies

Phase 3: pnpm Migration (2-3 hours)

  • Install pnpm globally
  • Test pnpm install
  • Update CI/CD workflows
  • Update documentation
  • Verify all scripts work

Phase 4: Validation

  • npm install (or pnpm install) succeeds
  • npm run test:all passes (100%)
  • npm run build succeeds
  • Plugin works in Obsidian
  • CI/CD pipelines work

Success Metrics

Metric Before Target Improvement
Total size 367 MB < 200 MB -45%
Install time Baseline -30% Faster
CI time Baseline -20% Faster
Duplicates TBD 0 Cleaner

pnpm Migration Benefits

Performance

  • ⚡ 2-3x faster installs
  • 🚀 Better monorepo support
  • 💾 40-50% disk space savings
  • 🔄 Shared cache across projects

Strictness

  • ✅ Prevents phantom dependencies
  • ✅ Stricter module resolution
  • ✅ Better workspace isolation

Compatibility

  • ✅ npm-compatible commands
  • ✅ Works with npm scripts
  • ✅ GitHub Actions support

Risks & Mitigation

Risk: pnpm compatibility issues

Mitigation: Test thoroughly, keep npm as fallback

Risk: CI/CD breaks

Mitigation: Update workflows incrementally, test in branch

Risk: Different lockfile format

Mitigation: Commit pnpm-lock.yaml, document in README

Acceptance Criteria

  • node_modules < 200 MB total
  • No duplicate dependencies (npm ls clean)
  • No unused dependencies (depcheck clean)
  • Install time reduced by 20%+
  • All tests pass
  • CI/CD works correctly
  • Documentation updated

Priority

🟢 LOW-MEDIUM - Nice to have, improves developer experience but not critical.

Estimated Effort

  • Quick wins (dedupe + cleanup): 2-3 hours
  • pnpm migration: 3-4 hours
  • Total: 5-7 hours

Next Steps

  1. Run analysis commands (Phase 1)
  2. Report findings in this issue
  3. Decide on pnpm migration (discuss with team)
  4. Implement in order of priority

Related Issues

Labels

dependencies, tech-debt, performance, enhancement

Metadata

Metadata

Assignees

No one assigned

    Labels

    dependenciesDependency updatesenhancementNew feature or requestperformancePerformance improvementstech-debtTechnical debt cleanup

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions