| name | docusaurus-plugin-dev |
| description | Helps develop and build Docusaurus plugins using this starter template |
Docusaurus Plugin Dev
Quick Start: Automatic DOM Enhancement Plugin
export default function myPlugin(context, options): Plugin {
return {
name: 'my-plugin',
getClientModules() {
return [require.resolve('./client')]
},
}
}
import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment'
export default (function () {
if (!ExecutionEnvironment.canUseDOM) return null
return {
onRouteUpdate({ location }) {
document.querySelectorAll('.markdown img').forEach((img) => {
img.style.cursor = 'zoom-in'
img.addEventListener('click', () => console.log('Image clicked'))
})
},
}
})()
Core Principles
- Global Execution: Client modules via
getClientModules() run on every page automatically—no manual imports needed in content files
- SSR Safety: Always check
ExecutionEnvironment.canUseDOM before using browser APIs to prevent SSR errors
- Lifecycle Hooks: Use
onRouteUpdate for DOM manipulation that needs to reinitialize on every SPA navigation
- DOM Selectors: Use CSS selectors to find target elements (e.g.,
.markdown img, pre code) and enhance them
- Server vs Client: Keep Node.js code in
src/plugin.ts, browser code in src/client/ - never mix them
Common Patterns
Pattern 1: DOM Enhancement (Image Zoom, Code Copy)
Use onRouteUpdate with DOM selectors to enhance elements automatically without imports.
Pattern 2: External Library Integration
Initialize third-party libraries (medium-zoom, highlight.js) and reinitialize on route changes.
Pattern 3: Global Event Listeners
Attach keyboard shortcuts or scroll handlers once, persist across routes using initialization flags.
Pattern 4: Plugin Options
Pass configuration from plugin to client via setGlobalData or inline during build.
Reference Files
For detailed documentation:
/home/user/docusaurus-plugin-starter/docs/CLIENT_MODULES.md - Comprehensive guide
/home/user/docusaurus-plugin-starter/examples/ - Working examples for all patterns
/home/user/docusaurus-plugin-starter/README.md - Full starter documentation
Quick Reference
Plugin Hooks (src/plugin.ts):
loadContent() - Load/process data at build time
contentLoaded() - Inject global data with setGlobalData() or add routes
getClientModules() - Return array of client module paths (runs in browser)
Client Lifecycle (src/client/index.ts):
onRouteUpdate() - During navigation (use for DOM manipulation)
onRouteDidUpdate() - After navigation completes (use for analytics)
Critical Guardrails:
- ❌ Never import Node modules (
fs, path) in src/client/*
- ✅ Always wrap client code with
ExecutionEnvironment.canUseDOM check
- ✅ Use
setTimeout(() => {}, 0) if DOM elements not immediately available
- ✅ Clean up previous instances before reinitializing libraries