How HMR Works
CommandKit’s HMR system uses a watch-build-reload architecture:- File Watcher - Monitors your
src/directory for changes - Incremental Build - Rebuilds only changed files
- IPC Communication - Sends reload events to the running process
- Handler Reload - Dynamically reloads commands or events
packages/commandkit/src/cli/development.ts
Starting Dev Server
- File watching enabled
- Hot reload for commands and events
- Automatic rebuilds on changes
- Manual reload commands
packages/commandkit/src/cli/development.ts:55
HMR Event Types
HMREventType
packages/commandkit/src/utils/constants.ts (referenced in development.ts:12)
Event Flow
Development Commands
While the dev server is running, you can type these commands:r - Full Restart
Kills the process and performs a complete restart.packages/commandkit/src/cli/development.ts:201
rc - Reload Commands
Reloads all commands without restarting.packages/commandkit/src/cli/development.ts:207
re - Reload Events
Reloads all events without restarting.packages/commandkit/src/cli/development.ts:212
HMR Implementation
File Watching
The dev server uses Chokidar to watch files.packages/commandkit/src/cli/development.ts:62
Smart Detection
CommandKit automatically determines what to reload based on file path.packages/commandkit/src/cli/development.ts:41-49
HMR Handler
packages/commandkit/src/cli/development.ts:134
IPC Communication
packages/commandkit/src/utils/dev-hooks.ts:8
Sending HMR Events
packages/commandkit/src/cli/development.ts:95
Receiving HMR Events
Dev Hooks Registration
packages/commandkit/src/utils/dev-hooks.ts:51
Plugin HMR Support
Plugins can intercept and customize HMR behavior.CommandKitHMREvent
packages/commandkit/src/utils/dev-hooks.ts:26
Custom Plugin HMR
Reload Handlers
Command Reload
packages/commandkit/src/commandkit.ts:438
Event Reload
packages/commandkit/src/commandkit.ts:445
Debugging HMR
Enable Debug Logging
packages/commandkit/src/utils/dev-hooks.ts:60
HMR Failures
If HMR fails, CommandKit falls back to a full restart.packages/commandkit/src/cli/development.ts:184
Limitations
What Can Be Hot Reloaded
✅ Commands- Chat input handlers
- Autocomplete handlers
- Message commands
- Context menu commands
- Discord.js event handlers
- Custom event handlers
What Requires Full Restart
❌ Configuration Changescommandkit.config.tsmodifications- Plugin additions/removals
- Build settings
- Middleware modifications
- Global state changes
- Client instance changes
packages/commandkit/src/cli/development.ts:170
Performance
Debouncing
HMR uses a 700ms debounce to batch rapid file changes.packages/commandkit/src/cli/development.ts:134
Acknowledgment Timeout
HMR waits up to 3 seconds for acknowledgment before assuming failure.packages/commandkit/src/cli/development.ts:108
Best Practices
- Keep Handlers Pure: Avoid side effects in command/event handlers that might not be cleaned up during reload
- Use Local State: Store state in context or CommandKit store, not in module-level variables
- Clean Up Listeners: If you register custom event listeners, clean them up properly
- Test Full Restart: Occasionally test with a full restart to ensure everything works correctly
- Monitor Console: Watch for HMR success/failure messages during development
Example: HMR-Friendly Command
Production Builds
HMR is automatically disabled in production builds.packages/commandkit/src/utils/dev-hooks.ts:52
Production mode:
- No file watching
- No IPC overhead
- Optimized builds
- No dev hooks registered