Files
FlexLove/docs/MODULE_DEPENDENCIES.md
2025-11-25 15:58:57 -05:00

252 lines
6.6 KiB
Markdown

# FlexLöve Module Dependencies
This document provides a comprehensive overview of module dependencies in FlexLöve, helping you understand which modules are required and which are optional.
## Dependency Graph
### Core Required Modules
These modules are **always required** and cannot be excluded:
```
FlexLove.lua
├── ErrorHandler (error logging & handling)
├── ModuleLoader (safe module loading)
├── BuildProfile (profile management)
├── utils (utility functions & enums)
├── Units (unit parsing & resolution)
│ └── requires: Context, ErrorHandler
├── Context (global state & viewport)
├── StateManager (immediate mode state persistence)
├── Color (color utilities)
│ └── requires: ErrorHandler
├── InputEvent (input event abstraction)
├── TextEditor (text input handling)
├── LayoutEngine (flexbox layout calculations)
│ └── requires: ErrorHandler, Performance (optional)
├── Renderer (canvas rendering)
├── EventHandler (event routing & callbacks)
│ └── requires: ErrorHandler, Performance (optional), InputEvent, utils
├── ScrollManager (scroll behavior)
├── Element (UI element primitives)
│ └── requires: ALL core modules + optional modules
├── RoundedRect (rounded rectangle rendering)
└── Grid (grid layout utilities)
```
### Optional Modules
These modules can be excluded to reduce bundle size:
#### Animation Module
```
Animation
├── requires: ErrorHandler, Color
├── used by: Element (for animations)
└── size impact: ~15% of total
```
**What you lose:**
- `element.animation` property
- `FlexLove.Animation` API
- Transition effects
- Keyframe animations
#### Image Modules
```
ImageRenderer
├── requires: ErrorHandler, utils
└── used by: Element (for image rendering)
ImageScaler
├── requires: ErrorHandler
└── used by: ImageRenderer
ImageCache
└── used by: Element (for image caching)
NinePatch
├── requires: ErrorHandler
└── used by: Element (for 9-patch rendering)
```
**What you lose:**
- `element.image` property
- `element.imageFit` property
- `element.imageRepeat` property
- 9-patch image support
- Image caching
#### Theme Module
```
Theme
├── requires: ErrorHandler, Color, utils
└── used by: Element (for theming)
```
**What you lose:**
- `FlexLove.Theme` API
- `element.theme` property
- `element.themeComponent` property
- Preset theme styles
- Theme-based component styling
#### Blur Module
```
Blur
└── used by: Element (for backdrop blur effects)
```
**What you lose:**
- `element.backdropBlur` property
- Glassmorphic effects
#### Performance Module
```
Performance
├── requires: ErrorHandler
└── used by: LayoutEngine, EventHandler, FlexLove
```
**What you lose:**
- `FlexLove._Performance` API
- Performance HUD (F3 toggle)
- Performance monitoring
- Frame timing metrics
- Memory profiling
#### GestureRecognizer Module
```
GestureRecognizer
└── used by: Element (for gesture detection)
```
**What you lose:**
- Touch gesture recognition
- Swipe detection
- Pinch/zoom gestures
- Multi-touch support
## Module Loading Order
FlexLöve loads modules in this order:
1. **ErrorHandler** - Must be loaded first for error reporting
2. **ModuleLoader** - Loads modules safely with null-object fallbacks
3. **BuildProfile** - Registers and manages build profiles
4. **Core modules** - Required for basic functionality
5. **Optional modules** - Loaded with `ModuleLoader.safeRequire()`
## Profile-Specific Dependencies
### Minimal Profile (~70%)
Only includes core required modules. No optional dependencies.
### Slim Profile (~80%)
Adds image, animation, gesture support:
- Animation
- ImageRenderer
- ImageScaler
- ImageCache
- GestureRecognizer
### Default Profile (~95%)
Adds theme and visual effects:
- All Slim modules
- Theme
- NinePatch
- Blur
### Full Profile (100%)
Includes all modules:
- All Default modules
- Performance
## Checking Module Availability
You can check if a module is loaded at runtime:
```lua
local ModuleLoader = require("modules.ModuleLoader")
-- Check if Animation is available
if ModuleLoader.isModuleLoaded("modules.Animation") then
-- Use Animation module
local anim = FlexLove.Animation.new({ ... })
else
-- Animation not available, use fallback
print("Animation module not loaded")
end
```
## Dependency Injection Pattern
FlexLöve uses dependency injection to handle optional modules:
```lua
-- In Element.lua
function Element.init(deps)
-- Core dependencies (required)
Element._utils = deps.utils
Element._ErrorHandler = deps.ErrorHandler
-- Optional dependencies (may be null objects)
Element._Animation = deps.Animation -- May be a no-op stub
Element._Theme = deps.Theme -- May be a no-op stub
end
```
If a module is missing, `ModuleLoader` returns a **null object** that:
- Has the same method names as the real module
- Returns safe default values
- Prevents crashes from missing dependencies
## Custom Build Profiles
You can create custom profiles with specific module combinations:
```lua
local BuildProfile = require("modules.BuildProfile")
-- Register a custom profile
BuildProfile.register({
name = "my-game",
description = "Custom profile for my game",
size = 75,
modules = {
-- Core modules (required)
"utils", "Units", "Context", "StateManager",
"ErrorHandler", "Color", "InputEvent", "TextEditor",
"LayoutEngine", "Renderer", "EventHandler",
"ScrollManager", "Element", "RoundedRect", "Grid",
-- Optional: Add Animation but not Theme
"Animation",
"ImageRenderer",
"ImageScaler",
"ImageCache",
}
})
-- Set active profile
BuildProfile.setActive("my-game")
```
## Best Practices
1. **Start with Default Profile** - Use the default profile unless you have specific bundle size requirements
2. **Profile Before Optimizing** - Measure your actual bundle size before excluding modules
3. **Test Without Optional Modules** - If excluding modules, test thoroughly to ensure no features break
4. **Use ModuleLoader Checks** - Always check if optional modules are loaded before using them
5. **Document Your Profile** - If creating a custom profile, document which features are disabled
## See Also
- [BUILD_PROFILES.md](./BUILD_PROFILES.md) - Detailed profile information
- [README.md](../README.md) - Getting started guide
- [ModuleLoader.lua](../modules/ModuleLoader.lua) - Source code for module loading