Module System
FitFileViewer uses a modular architecture with 50+ utility modules organized by functionality.
Module Organizationβ
utils/
βββ formatting/ # Data formatting
β βββ formatDistance.js
β βββ formatDuration.js
β βββ formatSpeed.js
β βββ ...
βββ maps/ # Map functionality
β βββ renderMap.js
β βββ mapBaseLayers.js
β βββ mapDrawLaps.js
β βββ ...
βββ charts/ # Chart functionality
β βββ chartSpec.js
β βββ renderChartJS.js
β βββ ...
βββ state/ # State management
β βββ core/
β βββ managers/
βββ files/ # File operations
β βββ handleOpenFile.js
β βββ recentFiles.js
β βββ ...
βββ ui/ # UI components
β βββ tabManager.js
β βββ fullscreen.js
β βββ ...
βββ ... # More modules
Module Categoriesβ
Formatting Modulesβ
Handle data display formatting:
| Module | Purpose |
|---|---|
formatDistance.js | Distance values |
formatDuration.js | Time durations |
formatSpeed.js | Speed/pace |
formatUtils.js | General utilities |
Map Modulesβ
Geographic visualization:
| Module | Purpose |
|---|---|
renderMap.js | Main map rendering |
mapBaseLayers.js | Tile layer providers |
mapDrawLaps.js | Lap marker drawing |
mapFullscreenControl.js | Fullscreen mode |
mapMeasureTool.js | Distance measurement |
Chart Modulesβ
Data visualization:
| Module | Purpose |
|---|---|
chartSpec.js | Chart configuration |
renderChartJS.js | Chart.js rendering |
vegaLiteUtils.js | Vega-Lite charts |
State Modulesβ
Application state:
| Module | Purpose |
|---|---|
stateManager.js | Central state |
themeManager.js | Theme state |
fileStateManager.js | File state |
UI Modulesβ
User interface:
| Module | Purpose |
|---|---|
tabManager.js | Tab navigation |
fullscreen.js | Fullscreen handling |
setupWindow.js | Window setup |
Import Patternsβ
Direct Importβ
import { formatDistance } from './utils/formatting/formatDistance.js';
Barrel Exportβ
// utils/formatting/index.js
export { formatDistance } from './formatDistance.js';
export { formatDuration } from './formatDuration.js';
// Usage
import { formatDistance, formatDuration } from './utils/formatting/index.js';
Dynamic Importβ
// Lazy loading for performance
const { renderMap } = await import('./utils/maps/renderMap.js');
Module Standardsβ
Single Responsibilityβ
Each module has one clear purpose:
// Good: Single responsibility
// formatDistance.js
export function formatDistance(meters, unit = 'km') {
// Only handles distance formatting
}
// Bad: Multiple responsibilities
// formatters.js
export function formatDistance() { }
export function formatDuration() { }
export function renderChart() { } // Unrelated
Clear Exportsβ
// Named exports preferred
export function formatDistance(meters) { }
export function convertToMiles(meters) { }
// Default export for main functionality
export default function formatDistance(meters) { }
Documentationβ
/**
* Formats a distance value for display.
*
* @param {number} meters - Distance in meters
* @param {string} unit - Target unit ('km' or 'mi')
* @returns {string} Formatted distance string
*
* @example
* formatDistance(5000); // "5.00 km"
* formatDistance(5000, 'mi'); // "3.11 mi"
*/
export function formatDistance(meters, unit = 'km') {
// Implementation
}
Module Dependenciesβ
Dependency Graphβ
Dependency Rulesβ
- No circular dependencies
- Lower modules don't import higher
- Formatting is a base layer
Next: Data Flow β