Claude-skill-registry docusaurus-plugin-dev
Helps develop and build Docusaurus plugins using this starter template
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/docusaurus-plugin-dev" ~/.claude/skills/majiayu000-claude-skill-registry-docusaurus-plugin-dev && rm -rf "$T"
manifest:
skills/data/docusaurus-plugin-dev/SKILL.mdsource content
Docusaurus Plugin Dev
Quick Start: Automatic DOM Enhancement Plugin
// src/plugin.ts - Register client module with getClientModules() export default function myPlugin(context, options): Plugin { return { name: 'my-plugin', getClientModules() { return [require.resolve('./client')]; }, }; } // src/client/index.ts - Enhance DOM automatically on every page import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment'; export default (function () { if (!ExecutionEnvironment.canUseDOM) return null; return { onRouteUpdate({ location }) { // Runs on every route change - enhance elements automatically 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
run on every page automatically—no manual imports needed in content filesgetClientModules() - SSR Safety: Always check
before using browser APIs to prevent SSR errorsExecutionEnvironment.canUseDOM - Lifecycle Hooks: Use
for DOM manipulation that needs to reinitialize on every SPA navigationonRouteUpdate - DOM Selectors: Use CSS selectors to find target elements (e.g.,
,.markdown img
) and enhance thempre code - Server vs Client: Keep Node.js code in
, browser code insrc/plugin.ts
- never mix themsrc/client/
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:
- references/client-modules-guide.md - Comprehensive client modules guide
- README.md - Plugin documentation
- CONTRIBUTING.md - Development guide
Quick Reference
Plugin Hooks (
src/plugin.ts):
- Load/process data at build timeloadContent()
- Inject global data withcontentLoaded()
or add routessetGlobalData()
- Return array of client module paths (runs in browser)getClientModules()
Client Lifecycle (
src/client/index.ts):
- During navigation (use for DOM manipulation)onRouteUpdate()
- After navigation completes (use for analytics)onRouteDidUpdate()
Critical Guardrails:
- ❌ Never import Node modules (
,fs
) inpathsrc/client/* - ✅ Always wrap client code with
checkExecutionEnvironment.canUseDOM - ✅ Use
if DOM elements not immediately availablesetTimeout(() => {}, 0) - ✅ Clean up previous instances before reinitializing libraries