252 lines
6.6 KiB
Markdown
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
|