Die docmd 0.8.0 Version stellt ein monumentales Architektur-Upgrade dar - sie führt einen nativen Multi-Threaded Worker-Pool ein, der Seiten parallel verarbeitet, wodurch die Build-Zeiten für große Dokumentations-Websites drastisch verkürzt werden, zusammen mit einer leistungsstarken neuen Plugin-Worker-API.
✨ Highlights
⚡ Multi-Threaded Build-Architektur
docmd baut Ihre Dokumentation jetzt parallel auf, indem ein hochoptimierter WorkerPool verwendet wird. Indem der schwerste Teil der Pipeline - das Parsing des Markdown-AST und die Prozessor-Hooks - in isolierte Hintergrund-Threads verlagert wird, kann docmd nun alle verfügbaren CPU-Kerne vollständig ausnutzen.
Für große Workspaces (z.B. mehr als 1000 Seiten) führt dies zu massiven Leistungsschüben, wodurch Kaltstart-Build-Zeiten drastisch verkürzt und die Entwicklererfahrung beim Hot-Reload flüssiger wird. Der Thread-Pool wird intelligent begrenzt (os.cpus().length - 1), um sicherzustellen, dass Ihr Hauptsystem bei schweren Builds reaktionsfähig bleibt.
🔌 Plugin Worker API
Wir haben docmd nicht nur multi-threaded gemacht, wir haben das Multi-Threading auch für das gesamte Ökosystem zugänglich gemacht.
Plugins können nun ihre eigenen rechenintensiven oder synchronen Aufgaben an den docmd-Worker-Pool auslagern, ohne die Thread-Erstellung selbst verwalten zu müssen. Eine neue runWorkerTask-API wird in ActionContext, PageContext und PostBuildContext injiziert.
export default {
plugin: { name: 'my-plugin', version: '1.0.0', capabilities: ['post-build'] },
async onPostBuild(ctx) {
// Senden Sie schwere Vorgänge (wie das Parsen des Git-Verlaufs) an einen Hintergrund-Thread
const result = await ctx.runWorkerTask(
'/absolute/path/to/my-worker-script.js',
'parseGitHistory',
[ctx.outputDir]
);
}
}
🧩 Gemeinsamer modularer Kern
Wir haben formell ein neues Paket extrahiert: @docmd/utils, eine abhängigkeitsfreie Bibliothek für gemeinsam genutzte Dienstprogramme. Dieses Paket zentralisiert Dateisystem-Wrapper, Pfad-Normalisierung, Hashing-Mechanismen und den eigentlichen WorkerPool, verhindert zirkuläre Abhängigkeiten und ermöglicht es Plugins, robuste Hilfsmittel direkt aus dem docmd-Ökosystem zu importieren.
📝 Vollständiges Änderungsprotokoll
🚀 Engine & Architektur
- Worker-Parser-Pipeline: Der Markdown-Kernprozessor wird nun dynamisch in Hintergrund-Threads rehydriert. Dateien werden gleichzeitig gelesen und chargenweise an die Worker verteilt.
- AST Caching Engine: Eine MD5-basierte Caching-Ebene fängt unveränderte Dateien ab. Wenn sich der rohe Inhalts-Hash einer Datei seit dem letzten Durchlauf nicht geändert hat, wird das AST-Parsing komplett übersprungen.
- Persistente Dev-Worker: Während
docmd devbleibt der Worker-Pool über Dateispeicherungen hinweg persistent. Dies eliminiert die typische Node.js-Thread-Startlatenz von 200-500 ms und führt zu nahezu sofortigen inkrementellen Rebuilds. - Worker CPU Throttling: Der Thread-Pool berechnet die exakte Anzahl der Threads basierend auf der Systemarchitektur und reserviert einen CPU-Kern, um I/O-Aushungerung und Betriebssystem-Sperren zu verhindern.
🔌 Plugin System
runWorkerTaskAPI: Wird direkt in den Plugin-Kontexten (onBeforeRender,onPostBuild,actions,events) für die generische Skriptausführung im Hintergrund offengelegt.- Git Plugin Persistenter Cache: Das Git-Plugin nutzt nun einen robusten persistenten Festplatten-Cache (
.docmd/cache/git-history.json), der über die Datei-Änderungszeit (mtimeMs) invalidiert wird. Dadurch werden redundantegit logShell-Subprozesse bei Folge-Builds vollständig eliminiert, was die Build-Zeit großer Repositories (800+ Seiten) von ~18 Sekunden auf nur noch ~3,5 Sekunden senkt. - Entkoppelte API-Importe: Plugins können nun
fsUtils,WorkerPoolundgetGitRootdirekt von@docmd/utilsimportieren.
⚙️ Infrastruktur & Tools
- Zentralisierter Git-Kontext: Die interne Git-Zweig-Erkennung und das Parsen des Repository-Stammverzeichnisses (
getGitRoot) wurden in einen sicheren Hilfsbereich extrahiert. - JSON-serialisierbare Konfigurationen: Kontinuierlicher Übergang zur Zero-Config-Architektur durch Sicherstellung, dass das aufgelöste Konfigurationsobjekt vollständig JSON-serialisierbar ist, sodass es sicher in die Worker-Threads übertragen werden kann.
⚠️ Wichtige (Breaking) Änderungen
- Kern-Modul-Importe: Wenn sich Ihre benutzerdefinierten Plugins auf tiefe relative Importe von
@docmd/core/src/utils/fs-utilsverlassen haben, müssen Sie diese Importe auf@docmd/utilsaktualisieren. - Worker-Ausführungskontext: Plugins, die sich in das
markdownSetupeinklinken, müssen sicherstellen, dass ihre Erweiterungen vollständig serialisierbar sind, da Markdown-it-Prozessoren jetzt über Thread-Grenzen hinweg instanziiert werden.
Upgrade-Anleitung
Führen Sie ein Upgrade durch, indem Sie npm install docmd@latest ausführen. Dann:
- Testen Sie Ihre benutzerdefinierten Plugins: Wenn Sie ein benutzerdefiniertes docmd-Plugin pflegen, das AST manipuliert oder viel CPU-Zeit benötigt, prüfen Sie, ob Sie die neue
runWorkerTasknutzen können, um die Build-Schleife schnell zu halten. - Entfernen Sie manuelle Kern-Importe: Ersetzen Sie
import { fsUtils } from '@docmd/core/dist/utils/fs-utils'durchimport { fsUtils } from '@docmd/utils'.
Eine vollständige Anleitung finden Sie unter Erste Schritte - Installation.