ResourceLoader Overview
ResourceLoader is MediaWiki’s asset delivery system that:- Bundles multiple files into optimized requests
- Minifies JavaScript and CSS
- Versions resources for cache busting
- Loads dependencies automatically
- Supports conditional loading based on context
Module Configuration
All modules are defined inskin.json under the ResourceModules key.
Module Structure
Core Citizen Modules
Styles Module
Module name:skins.citizen.styles
resources/skins.citizen.styles/
Features:
- Core skin styles
- CSS custom properties (tokens)
- Layout and typography
- Component styles
Scripts Module
Module name:skins.citizen.scripts
resources/skins.citizen.scripts/
Features:
- Interactive UI components
- Sticky header functionality
- Search enhancements
- Table of contents
- Performance optimizations
Codex Styles Module
Module name:skins.citizen.codex.styles
Search Module
Module name:skins.citizen.search
- Search typeahead/autocomplete
- Multiple search backend support
- Search history
Preferences Module
Module name:skins.citizen.preferences
Vue 3-based theme and preferences interface.
Icons Module
Module name:skins.citizen.icons
Adding Custom Modules
Method 1: Via Extension
Create an extension with custom modules:Method 2: Via LocalSettings.php
Register modules dynamically:Method 3: Skin Styles
Add styles specifically for Citizen:Loading Modules
Automatic Loading
Modules specified inskin.json under the skin’s scripts and styles arrays load automatically:
Manual Loading in PHP
Load modules conditionally:Manual Loading in JavaScript
Load modules dynamically:Module Types
Style Modules
.css, .less
Script Modules
.js
Package Modules
Modern module format with ES6 support:- ES6 modules with
require()andmodule.exports - Dynamic file generation via callbacks
- Template embedding
Vue Modules
Dependencies
Common MediaWiki Dependencies
| Module | Description |
|---|---|
mediawiki.api | MW API client |
mediawiki.util | Utility functions |
mediawiki.storage | LocalStorage wrapper |
mediawiki.user | User information |
mediawiki.Uri | URL parsing |
mediawiki.template.mustache | Mustache templates |
jquery.client | Browser detection |
oojs-ui-core | OOUI framework |
vue | Vue 3 framework |
pinia | Vue state management |
Citizen Dependencies
| Module | Description |
|---|---|
skins.citizen.scripts | Core Citizen JavaScript |
skins.citizen.styles | Core Citizen styles |
skins.citizen.preferences | Theme preferences |
skins.citizen.search | Search functionality |
Declaring Dependencies
Messages
Include i18n messages in modules:Callbacks for Dynamic Content
Generate module content dynamically:Skin Styles Override
Extensions can provide skin-specific styles:+ prefix means “add to module” (merge styles).
Loading Strategies
Position
Targets
Group
LESS Variables
Import Citizen variables in your LESS:Module Best Practices
- Use dependencies - Don’t duplicate code; depend on existing modules
- Keep modules focused - Separate concerns (styles vs. scripts)
- Load conditionally - Only load what’s needed for the current page
- Minimize dependencies - Each dependency adds to load time
- Use packageFiles for modern JS - Better than legacy
scriptsarray - Version your modules - Change module name or content to bust cache
- Test module loading - Use browser DevTools to verify modules load
Debugging
Enable Debug Mode
Check Module Registration
Inspect Module Contents
Clear ResourceLoader Cache
?debug=true to URLs.
Extension Skin Styles Examples
Citizen includes styles for 100+ extensions. Example structure:skin.json:
Related
- Theming - Customize visual appearance
- CSS Variables - Available design tokens
- Templates - HTML structure customization
- MediaWiki ResourceLoader - Official documentation