{"id":56132,"date":"2025-06-18T10:56:18","date_gmt":"2025-06-18T08:56:18","guid":{"rendered":"https:\/\/www.d-velop.de\/blog\/?p=56132"},"modified":"2025-06-18T10:56:22","modified_gmt":"2025-06-18T08:56:22","slug":"vite-plugins","status":"publish","type":"post","link":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/","title":{"rendered":"Was man mit Vite-Plugins so alles machen kann"},"content":{"rendered":"\n<p data-beyondwords-marker=\"6eca08e6-c84a-46c1-915f-fa3386d1a834\">Wer in der Welt von JavaScript unterwegs ist, wird fr\u00fcher oder sp\u00e4ter mit einem Build-Tool in Ber\u00fchrung kommen. <a href=\"https:\/\/vite.dev\/\" target=\"_blank\" rel=\"noreferrer noopener\">Vite<\/a> spielt dabei seit mehreren Jahren eine immer gr\u00f6\u00dfere Rolle. Neben der Performance und dem komfortablen Dev-Server ist das Plugin-System ein wichtiger Faktor. Viele beliebte Frameworks wie <a href=\"https:\/\/vuejs.org\/guide\/quick-start#creating-a-vue-application\" target=\"_blank\" rel=\"noreferrer noopener\">Vue<\/a>, <a href=\"https:\/\/svelte.dev\/docs\/svelte\/getting-started\" target=\"_blank\" rel=\"noreferrer noopener\">SvelteKit<\/a> oder <a href=\"https:\/\/nuxt.com\/docs\/migration\/bundling\" target=\"_blank\" rel=\"noreferrer noopener\">Nuxt<\/a> setzen auf Vite-Plugins, um sich zu integrieren.<\/p>\n\n\n\n<p data-beyondwords-marker=\"30629a62-7702-45e8-945b-1708606de29e\">Wie diese Plugins funktionieren, was sie alles k\u00f6nnen und wie du selbst ein Plugin schreiben kannst, das erf\u00e4hrst du in diesem Blog-Post.<\/p>\n\n\n\n<h2 data-beyondwords-marker=\"939fd84e-1487-4e0f-b4a5-1e4349337a2f\" class=\"wp-block-heading\" id=\"h-wie-funktionieren-vite-plugins\"><span class=\"ez-toc-section\" id=\"wie-funktionieren-vite-plugins\"><\/span>Wie funktionieren Vite-Plugins?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p data-beyondwords-marker=\"793dee5d-f45b-4816-91f8-f275c2f17475\"><a href=\"https:\/\/de.vitejs.dev\/guide\/api-plugin\" target=\"_blank\" rel=\"noreferrer noopener\">Vite-Plugins<\/a> sind eine Erweiterung von <a href=\"https:\/\/rollupjs.org\/plugin-development\/#plugins-overview\" target=\"_blank\" rel=\"noreferrer noopener\">Rollup-Plugins<\/a>. Im Grunde sind es blo\u00df Objekte mit einer Reihe von Methoden, den sogenannten Hooks. Diese werden automatisch w\u00e4hrend des Build-Prozesses und im Dev-Server aufgerufen. Die genaue Reihenfolge h\u00e4ngt von der Build-Config und auch von den verwendeten Plugins selbst ab. Aber grob l\u00e4sst sich der Lebenszyklus folgenderma\u00dfen abbilden:<\/p>\n\n\n\n<figure data-beyondwords-marker=\"0b1f5d1b-d668-4eb5-b6a3-856b26565ca5\" class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"714\" height=\"1090\" src=\"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/vite-plugin-lebenszyklus-714x1090.png\" alt=\"Bild zeigt den Vite Plugin Lebenszyklus\" class=\"wp-image-56134\" srcset=\"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/vite-plugin-lebenszyklus-714x1090.png 714w, https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/vite-plugin-lebenszyklus-393x600.png 393w, https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/vite-plugin-lebenszyklus-768x1172.png 768w, https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/vite-plugin-lebenszyklus-1007x1536.png 1007w, https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/vite-plugin-lebenszyklus-1342x2048.png 1342w, https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/vite-plugin-lebenszyklus-1920x2929.png 1920w\" sizes=\"auto, (max-width: 714px) 100vw, 714px\" \/><\/figure>\n\n\n\n<p data-beyondwords-marker=\"3797a646-8781-46ef-82cb-6aeea8468122\"><\/p>\n\n\n\n<p data-beyondwords-marker=\"fba5a441-0cb1-44bd-9d24-a7059b2f5e82\">Falls mehrere Plugins vorhanden sind, die denselben Hook implementieren, werden sie in der Reihenfolge aufgerufen, in der sie in der vite.config.js registriert wurden. Ein Plugin kann sich allerdings auch \u00fcber die Attribute enforce am Plugin und order am Hook \u201cvordr\u00e4ngeln\u201d.<\/p>\n\n\n\n<h2 data-beyondwords-marker=\"e081bca3-bbae-490d-9986-547199e0b027\" class=\"wp-block-heading\" id=\"h-was-konnen-vite-plugins\"><span class=\"ez-toc-section\" id=\"was-koennen-vite-plugins\"><\/span>Was k\u00f6nnen Vite-Plugins?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p data-beyondwords-marker=\"a3597421-d47a-460d-a99d-9e371c539862\">Insgesamt gibt es 32 Hooks, in diesen Hooks stehen 15 Utility-Functions zur Verf\u00fcgung. Die M\u00f6glichkeiten, damit in den Build-Prozess einzugreifen, sind schier unendlich. Deshalb m\u00f6chte ich an dieser Stelle nur kurz auf die einzelnen M\u00f6glichkeiten eingehen. F\u00fcr eine genauere Dokumentation, schau in die <a href=\"https:\/\/rollupjs.org\/plugin-development\/\" target=\"_blank\" rel=\"noreferrer noopener\">Rollup-<\/a> bzw. <a href=\"https:\/\/de.vitejs.dev\/guide\/api-plugin\" target=\"_blank\" rel=\"noreferrer noopener\">Vite-Dokumentationen<\/a>. Die Beschreibungen dort sind allerdings auch etwas oberfl\u00e4chlich. Letztlich habe ich es mir dadurch erschlossen, dass ich einfach mal in einem Test-Projekt ausprobiert habe, was die einzelnen Hooks\/Functions machen.<\/p>\n\n\n\n<h3 data-beyondwords-marker=\"ec02c0de-d302-4c69-a408-c9c1bb5299a7\" class=\"wp-block-heading\" id=\"h-configuration-hooks\">Configuration-Hooks<\/h3>\n\n\n\n<p data-beyondwords-marker=\"c85ababf-c6b5-4af8-a1d7-daab32f7084e\">Es gibt drei Hooks, die man der Konfiguration zuordnen kann: config, configResolved und options. Sie k\u00f6nnen verwendet werden, um die in der vite.config.js angegebene und die von Vite\/Rollup generierte Konfiguration auszulesen und zu manipulieren.<\/p>\n\n\n\n<p data-beyondwords-marker=\"761d9099-8989-407f-9f44-aadc9c55403a\"><strong>config<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"cba6975d-f25c-4024-8c2e-aefe51c42b56\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"daa80b93-0229-4d99-8ea5-40140db5176d\">Ver\u00e4ndern von Werten in der Konfiguration<\/li>\n\n\n\n<li data-beyondwords-marker=\"9fb936fe-a056-4f02-9f82-a3693b14630f\">Auslesen von mode (\u201cproduction\u201d oder \u201cdevelopment\u201d) und command (\u201cbuild\u201d oder \u201cserve\u201d)<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"1effa85c-810c-42d0-bfbf-53788b56fed8\"><strong>configResolved<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"1859e56b-87ad-4851-8844-ce594054ad25\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"d294af68-01b0-4da9-ac9b-7e598d13b77c\">Auslesen der finalen Vite-Konfiguration<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"55db2cc0-7d43-4ee3-b66c-5ef552199c01\"><strong>options<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"034d7b0b-1a06-42bf-b86d-df607fa93c59\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"b2732158-264e-4178-a85c-600d9b256325\">Auslesen und Ver\u00e4ndern von Werten im Options-Objektes (Config-Objekt von Rollup)<\/li>\n\n\n\n<li data-beyondwords-marker=\"dddebb44-f65a-4f9b-a06b-9f9e18d87210\">Ob die Manipulation in der options- oder der config-Hook geschehen sollte, kommt darauf an, was man ver\u00e4ndern will<\/li>\n<\/ul>\n\n\n\n<h3 data-beyondwords-marker=\"60849ece-1305-4343-939f-be95962e696f\" class=\"wp-block-heading\" id=\"h-build-hooks\">Build-Hooks<\/h3>\n\n\n\n<p data-beyondwords-marker=\"7204e899-ad5a-4dcd-a463-4e13acf3d96e\">Build-Hooks sind dazu gedacht, in den Build-Prozess einzugreifen. Sie k\u00f6nnen Informationen abgreifen sowie den Input und den Output ver\u00e4ndern.<\/p>\n\n\n\n<p data-beyondwords-marker=\"c285ba23-c7ee-4078-93ea-1eeff92cfd54\"><strong>buildStart<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"7041aaff-17f8-4883-a7a2-fe8adf36dadd\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"4b3817ef-f8a2-447a-be08-a6ce4347d94a\">Auslesen der finalen Rollup-Options<\/li>\n\n\n\n<li data-beyondwords-marker=\"0c5fbd56-e32b-44ca-ada7-3a5c76a92ade\">Hintergrundprozesse starten<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"c5a29ca5-1954-4fc8-92f1-d1ed042e8abb\"><strong>resolveId<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"652fcd11-04a7-472f-8fda-075c3beaef6f\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"3ee61cf4-8d4b-4246-b953-610a52243984\">Die Inputs auf andere Pfade mappen\n<ul data-beyondwords-marker=\"4156f31c-b0f2-4643-8883-8a217257cf8c\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"a41fc5c5-1bf8-4a08-bafc-17fb9eff739f\">HTML-Referenzen: &lt; script src=\u201c\/my-script.js\u201c&gt; =&gt; \u201c.\/src\/scripts\/foobar.js&#8220;<\/li>\n\n\n\n<li data-beyondwords-marker=\"a41fc5c5-1bf8-4a08-bafc-17fb9eff739f\">JS-Imports: import \u201cfoobar\u201d =&gt; \u201c.\/src\/scripts\/foobar.js\u201c<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li data-beyondwords-marker=\"a41fc5c5-1bf8-4a08-bafc-17fb9eff739f\">Externe Abh\u00e4ngigkeiten aufl\u00f6sen<\/li>\n\n\n\n<li data-beyondwords-marker=\"2bf2c1e4-ac19-411f-9892-eefb01c835d1\">Wird f\u00fcr jeden Entry-Point sowie f\u00fcr jede von dort aus referenzierte Datei\/URL aufgerufen<\/li>\n\n\n\n<li data-beyondwords-marker=\"4fa3aac1-ec25-473d-a6ea-846338aaa8a3\">Per Default wird versucht, den Pfad vom konfigurierten Project-Root aus aufzul\u00f6sen<\/li>\n\n\n\n<li data-beyondwords-marker=\"b6c27f8f-224e-4941-809e-5d7e5af48229\">Falls dieser Pfad nicht gefunden wird, kommt es zu einem Fehler<\/li>\n\n\n\n<li data-beyondwords-marker=\"9d120a94-de36-4e9f-9f4c-e592833b6171\">Wenn man eine ID\/einen Datei-Pfad returned, welcher nicht auf im Dateisystem existiert, wird dennoch kein Fehler geschmissen<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"9b6589cb-316b-494c-a5dc-e6bb831f5319\"><strong>load<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"14ae5c19-65b3-48b6-b25e-feb58238d857\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"ac840485-df6d-463c-9bab-fc73ae2b2eda\">Dateien von einer anderen Location lesen als im Quellcode angegeben\n<ul data-beyondwords-marker=\"46fd4830-addb-4b83-ad4e-d2811e1aafd3\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"ac840485-df6d-463c-9bab-fc73ae2b2eda\">\u201c.\/src\/foobar.js&#8220; =&gt; fs.readFileSync(\u201c.\/tmp\/src\/foobar.js\u201c, \u2026)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li data-beyondwords-marker=\"ac840485-df6d-463c-9bab-fc73ae2b2eda\">Imports ins leere laufen lassen, indem man einfach eine leere Datei zur\u00fcck gibt\n<ul data-beyondwords-marker=\"18684c40-5817-4e90-8d9b-391a42bdfa3e\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"ac840485-df6d-463c-9bab-fc73ae2b2eda\">\u201cdummy-module\u201d =&gt; return \u201c\u201c<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li data-beyondwords-marker=\"ac840485-df6d-463c-9bab-fc73ae2b2eda\">W\u00e4hrend resolveId im default nur schaut, ob die Datei existiert, wird sie hier tats\u00e4chlich gelesen<\/li>\n\n\n\n<li data-beyondwords-marker=\"ebfd1b85-fe26-423d-9969-4802c1f1fa58\">Man kann auch selbst den gew\u00fcnschten Datei-Inhalt zur\u00fcckgeben<\/li>\n\n\n\n<li data-beyondwords-marker=\"852d63f1-6e56-4bcf-aa39-10c0a08754a1\">Sobald ein Plugin hier nicht null zur\u00fcckgibt, werden die load-Hooks der anderen Plugins \u00fcbersprungen<\/li>\n\n\n\n<li data-beyondwords-marker=\"28bc9778-4a15-4ef7-a59f-0826581adc9c\">Wird im Dev-Mode 1x beim ersten Aufrufen der jeweiligen Ressource getriggert (au\u00dfer die Id wird in resolveId ver\u00e4ndert, dann immer wieder)<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"3d4931b8-01ba-4ca7-80bf-1bdb9418c17d\"><strong>transform<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"73c72569-147a-4d3d-86e8-44808a92f61c\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"f7c3228b-ff80-463a-9458-247ec145bd15\">Ver\u00e4ndern des Quellcodes, bevor der n\u00e4chste Hook aufgerufen wird<\/li>\n\n\n\n<li data-beyondwords-marker=\"19799399-883c-4391-8450-1da19cbd44ea\">Platzhalter ersetzen, Code hinzuf\u00fcgen\/entfernen, Links ver\u00e4ndern, \u2026<\/li>\n\n\n\n<li data-beyondwords-marker=\"7f51c86c-9f72-4dc3-aa64-49237cff99b2\">Wird im Dev-Mode 1x beim ersten Aufrufen der jeweiligen Ressource und nach \u00c4nderungen an der Datei getriggert<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"0a0e85c3-b25b-46bc-94ac-270c36b8c67a\"><strong>moduleParsed<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"81b539fc-99a0-4d8f-955e-f4e31dab20e9\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"2bcbb141-799f-4518-8a9e-15a74d02676c\">Informationen zu den Imports einer Datei einsehen<\/li>\n\n\n\n<li data-beyondwords-marker=\"7de48e00-c9d1-4d0a-b47d-82bae3e24d75\">Aufruf, nachdem eine Datei vollst\u00e4ndig von Rollup analysiert wurde<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"4bc607cc-743d-4e7a-9505-0ff90437570e\"><strong>resolveDynamicImport<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"47234359-fa74-4a16-b673-82cfdab6e8d3\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"e7e60809-2c6d-4eda-b530-77323c3ca1b6\">Aufl\u00f6sen von dynamic imports (return {id: \u201c\u2026\u201d})<\/li>\n\n\n\n<li data-beyondwords-marker=\"8385aed0-8ec1-4e90-b31c-645ce1f1cbee\">Ignorieren von dynamic imports (return false)\n<ul data-beyondwords-marker=\"e22a0d71-24f4-4ed0-8464-a83f6e3aa422\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"f688a53c-4268-4444-983f-e06cc045bb94\">der import(\u201c\u2026\u201d) Befehl im Source Code wird nicht ver\u00e4ndert<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"110ad6a6-b8f3-4895-92c3-a02fb3bf2745\"><strong>buildEnd<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"ebb42cd4-1116-458b-94e6-650a433a6b5a\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"23daad2f-f56f-41c0-8126-ccbc5b1f3cf3\">Fehler auslesen und ggf. aussagekr\u00e4ftigere Log-Meldung geben<\/li>\n\n\n\n<li data-beyondwords-marker=\"df116595-9520-4c3f-9833-162c80869a44\">Wird am Ende des Build-Prozesses aufgerufen<\/li>\n\n\n\n<li data-beyondwords-marker=\"6ceb9509-3027-4a4d-a9e6-4b3e784119e5\">Falls ein Fehler aufgetreten ist, wird dieser \u00fcbergeben<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"08ea657d-1af4-4e18-b4dd-8b3d76810891\"><strong>tranformIndexHTML<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"a78660c4-4ca9-4917-8ee4-28ef823a468f\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"59b62f8e-ad29-49c7-9155-270c8f7b99c4\">Anpassungen an HTML-Files nachdem der Build abgeschlossen ist<\/li>\n\n\n\n<li data-beyondwords-marker=\"2690a45a-4a1b-450e-b08a-18551dfa47d8\">Injecten von HTML-Tags in den oder<\/li>\n\n\n\n<li data-beyondwords-marker=\"8b396a40-ea86-4b09-b9fb-d3e8f39649a8\">Anpassungen an Routen im Vite-Dev-Server\n<ul data-beyondwords-marker=\"de353bbd-7734-4b05-8b55-61ca3afd4275\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"00ec2f3f-f9d8-4656-8a8e-4998f32ca677\">\u201c\/scripts\/index.ts&#8220;=&gt;\u201d\/src\/scripts\/index.ts\u201d\u201d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li data-beyondwords-marker=\"6f0f25fc-3c7c-4b3a-a3d4-91efeb4d3ba0\">\u00c4hnlich zu transform<\/li>\n\n\n\n<li data-beyondwords-marker=\"cd979d12-6e7e-49cf-9748-4d4715c4bfb0\">Im Dev-Mode, wenn IDs in resolveID angepasst werden, m\u00fcssen HTML-Dateien hier\u00fcber transformed werden, da der transform-Hook dann nicht aufgerufen wird<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"006dec13-0e81-4648-9f30-c3c1626813d9\"><strong>onLog<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"5f964e95-a885-4e07-8845-5381b3f1a482\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"0894461c-acd8-4d64-8737-6e60e8513208\">Filtern der Log-Meldungen von Vite und Vite-Plugins<\/li>\n\n\n\n<li data-beyondwords-marker=\"2995457c-bb4f-4249-8950-4f64093308e1\">Log-Level \u00e4ndern<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"fb15235d-c78c-4ac9-b96f-b404d9709d74\">Als ich das alles ausprobiert habe, fand ich es echt gruselig, wie so ein Plugin meine App verdrehen kann. Hier passt das Adjektiv \u201chacky\u201d wirklich sehr gut. Angenommen, ich habe eine Javascript-File \u201c.\/scripts\/someStuff.js&#8220; referenziert. Dann k\u00f6nnte so ein Plugin hingehen und die Href auf \u201c<a href=\"https:\/\/dvelop.atlassian.net\/wiki\/spaces\/BLOG\/blog\/2025\/04\/08\/246450284\">http:\/\/boese-dinge-tun.com\/passwoerter-abgreifen.js\u201c<\/a> \u00e4ndern. Oder es kann unseren Frontend-Quell-Code an einen externen Server senden. Oder es kann b\u00f6swilligen Code injecten. Diese Probleme hat man zwar bei jeder Third-Party-Abh\u00e4ngigkeit, aber da das direkt am Build-Prozess beteiligt ist, fand ich das etwas erschreckend.<\/p>\n\n\n\n<p data-beyondwords-marker=\"1693689e-0a45-4447-aaf5-2b2c5a366b2e\">Allerdings ist es auch notwendig, dass Plugins so m\u00e4chtig sind. Denn um von Vue-Komponenten zu nativem JavaScript zu kommen, muss nat\u00fcrlich einiges ver\u00e4ndert werden.<\/p>\n\n\n\n<h3 data-beyondwords-marker=\"c649b7d4-1b27-4e3f-bee3-0ea0bf505d5d\" class=\"wp-block-heading\" id=\"h-output-generation-hooks\">Output-Generation-Hooks<\/h3>\n\n\n\n<p data-beyondwords-marker=\"c48f240e-98c6-4c9c-a682-451aa3dba1c0\">Nach dem Abschluss des Builds kann ich auch noch einiges mit dem Output machen. Diese Hooks werden im Dev-Mode nicht aufgerufen, da dort kein Output generiert wird, sondern die Compilation In-Memory stattfindet.<\/p>\n\n\n\n<p data-beyondwords-marker=\"6399a2c8-8cfa-4d9a-89e6-d29184d69da8\"><strong>outputOptions<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"94b223a4-451b-4e40-a189-dac9a9a29f3d\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"766dcdd0-5a91-4948-a4d5-4ee3b7a7bb41\">Ersetzen oder Ver\u00e4ndern der Output-Konfiguration<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"2fd0577c-0840-4397-865f-0a2006acc629\"><strong>renderStart<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"7a74ee02-4b5c-4a49-b677-1f1abe532fac\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"6466448d-8814-441c-ad2d-a95ac57433a0\">Auslesen der finalen Output-Config<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"5d110b58-615d-49b7-9774-96bb6c4d33a3\"><strong>renderDynamicImport<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"713c3096-009a-4c63-ade0-93debf79ae09\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"65c11bbb-1633-4199-9c15-ef86f85312d7\">Mit dynamischen Imports umgehen<\/li>\n\n\n\n<li data-beyondwords-marker=\"7109a84b-8414-44e5-82dc-d899cbdeb829\">Man kann dynamische Imports durch Funktionsaufrufe ersetzen\n<ul data-beyondwords-marker=\"90e63210-3c36-42af-93a6-eda7edddc68b\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"15e92c8d-7a35-4617-a3a0-011c9291fff0\">import(\u201cfoobar\u201d) =&gt; doFoobarStuff(\u2026)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"b8be4142-8017-431c-912c-04f8f8d8a0d5\"><strong>resolveImportMeta<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"0c4501ac-4fa2-4e0b-a215-c88790c2c84a\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"a6c83e3d-0972-4799-aa3e-087edadbf6a2\">Injecten von Variablen<\/li>\n\n\n\n<li data-beyondwords-marker=\"79466ac3-8397-42b7-9182-4cf1f5b4b091\">Ersetzt \u201cimport.meta.\u201c durch den zur\u00fcckgegebenen Wert<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"b309d88b-6113-4127-8229-f3f54bf06ec8\"><strong>resolveFileURL<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"90fd115a-a8b1-4639-a68c-57ed8c925622\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"7fc5f2e8-2ab5-45df-83ea-ed879c06f88a\">Die URL von selbst generierten Dateien \u00e4ndern<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"6286c33f-f837-4a4c-8b12-4e38be4848b1\"><strong>intro\/outro\/banner\/ footer<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"b527da10-c1bf-46ce-9cfb-a714317b3c98\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"00610d05-4911-42cd-9e6b-0876c5edaf11\">Kommentare oder Javascript-Calls am Anfang oder Ende der Assets-Dateien erg\u00e4nzen<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"27ec92ca-a1b4-49e2-86c2-12aed8a2aa20\"><strong>augmentChunkHash<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"0862b5cf-8346-4efe-98db-059d3c7074cd\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"0f728289-9883-44ba-b1b7-b44b643de2b6\">Den Hash festsetzen, um Caching zu verbessern<\/li>\n\n\n\n<li data-beyondwords-marker=\"442bfc62-045c-4220-8597-c73879110870\">Den Cache anhand von externen Werten ver\u00e4ndern<\/li>\n\n\n\n<li data-beyondwords-marker=\"877fa565-6d80-463b-94b8-d54845a3ea41\">Der return-Value ver\u00e4ndert den Wert, \u00fcber welchen des Hash f\u00fcr die Datei gebildet wird<\/li>\n\n\n\n<li data-beyondwords-marker=\"45759142-2c5d-4e1e-bee8-654d2e1946f5\">Per Default wird der Hash \u00fcber den Datei-Inhalt gebildet<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"fe48c699-b75b-4bc5-9aaf-48450fc95dba\"><strong>generateBundle<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"f724585f-c654-45e5-825e-2b1da63f0ba4\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"1f66b350-bee2-41c9-a298-a1a2820afce7\">Dateien aus dem Output entfernen<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"12a012c4-48e1-4d2b-9ddb-ae0f9525d02c\"><strong>writeBundle<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"a1e49134-f4de-4348-929f-ea009ed7eb63\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"fbc86644-05e1-4894-ab23-4a70c44563d8\">Auslesen der Output-Options\n<ul data-beyondwords-marker=\"84a05f46-92d6-4483-a0ba-39a012d8e955\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"47c45d2c-ff19-4839-bc9c-ccb2a8e20aac\">dist-Directory<\/li>\n\n\n\n<li data-beyondwords-marker=\"2510b8f6-1d5a-45a8-9d42-1a68e1556c61\">File-Hash-Schema<\/li>\n\n\n\n<li data-beyondwords-marker=\"a95ad9a0-aa51-4d4d-97a9-51e970fcc71d\">format<\/li>\n\n\n\n<li data-beyondwords-marker=\"68bcce5f-38eb-4760-8b5b-f778690026dd\">\u2026<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li data-beyondwords-marker=\"88c34742-9cd1-4c43-831c-588a8a602be8\">Dateien werden ins dist-Verzeichnis geschrieben<\/li>\n\n\n\n<li data-beyondwords-marker=\"1217eaa7-f7c6-473b-be53-60a84fd7ffe1\">per Default passiert nichts weiter<\/li>\n\n\n\n<li data-beyondwords-marker=\"42b058d8-8762-43bc-b65e-bfd95da69015\">Man kann zus\u00e4tzliche Dateien schreiben<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"c2be9143-d0ea-47d4-8c27-fd6e361ff5cd\"><strong>renderError<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"edaa01aa-6caa-4de0-af17-6e94a125095a\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"05584506-9423-44ce-9852-6743ab619e91\">Fehler in generateBundle und writeBundle abfangen<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"b20b2618-a1f6-4b51-a981-7504a5928fd7\"><strong>closeBundle<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"8ba74348-e220-41e0-a239-ef834266cf4c\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"f168b22e-b1cf-4023-a826-282d316b1f23\">Hintergrundprozesse beenden<\/li>\n\n\n\n<li data-beyondwords-marker=\"e74b5420-beea-4d69-af3f-8f6c811910c4\">Error beim Schreiben des dist-Verzeichnisses besser ausgeben<\/li>\n<\/ul>\n\n\n\n<h3 data-beyondwords-marker=\"252a6a7f-f7e2-4b17-a7b1-c95e9afef32f\" class=\"wp-block-heading\" id=\"h-dev-server-hooks\">Dev-Server-Hooks<\/h3>\n\n\n\n<p data-beyondwords-marker=\"9c391645-b9cf-4d06-82d8-9a7764113062\">Diese Hooks sind nur im Dev-Mode verf\u00fcgbar.<\/p>\n\n\n\n<p data-beyondwords-marker=\"03c1c764-3066-4e15-85ab-8f82cb6292e0\"><strong>configureServer<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"1d8384d5-7705-4ae0-ac23-fc47ca7948a9\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"18c89551-1488-460f-bbcb-75650bb68520\">Middleware-Handler hinzuf\u00fcgen\n<ul data-beyondwords-marker=\"f3abb18d-8279-4b49-8b9d-96852e88a3b8\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"18c89551-1488-460f-bbcb-75650bb68520\">URL auf anderen Pfad mappen<\/li>\n\n\n\n<li data-beyondwords-marker=\"18c89551-1488-460f-bbcb-75650bb68520\">Content direkt an den Client senden<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li data-beyondwords-marker=\"2ef0d6d3-2931-4690-ad4d-e85f4b9e63d8\">Events an den Browser schicken<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"16b15f02-6ce8-4749-8b4d-a0fa4ecd7763\"><strong>configurePreviewServer<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"8ca4a025-900b-4ab0-9e33-335715021215\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"2b560ad4-5fc5-4ae6-9963-e6ee7d4081e5\">configureServer f\u00fcr den Preview-Mode<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"f118b1e7-08f0-4d4d-ac49-af4fbe5ea113\"><strong>closeWatcher<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"1019b43d-e2b9-4113-8d70-48bd67cb7f52\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"2d5b9392-780d-446f-b9db-d1ec7447b317\">Wird aufgerufen, wenn der Dev-Server beendet wird<\/li>\n\n\n\n<li data-beyondwords-marker=\"610723cf-da07-4563-a8e2-36eb3eb5182f\">Hintergrundprozesse beenden<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"b5c67e4c-f530-4bb3-ad18-2604adfdaa51\"><strong>shouldTransformCachedModule<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"d1e6a42c-563c-4fe5-9385-64b1ed0075da\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"81b2a9cb-109b-408a-a653-5665c7ad7958\">Vite zwingen, ein Module immer neu zu bauen anstatt es zu cachen<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"6ef89d8c-824e-4698-9472-63451e9d77b5\"><strong>watchChange<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"153d6fd4-065e-43c1-b107-9c92c834529f\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"64fcb78f-dd9c-4331-b167-3d59e997d109\">Wird bei \u00c4nderungen an Dateien aufgerufen<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"9e340402-31b5-4970-bdf6-871ce505ff88\"><strong>handleHotUpdate<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"1a8f264b-d5f0-44f0-8123-49330dd993db\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"6850026f-6666-4d8c-80e2-e87a2e30e183\"><a href=\"https:\/\/vite.dev\/guide\/api-hmr\">Hot Module Replacement<\/a> individuell anpassen<\/li>\n<\/ul>\n\n\n\n<h3 data-beyondwords-marker=\"930bb933-a6b5-4317-b8c7-1ec931b45487\" class=\"wp-block-heading\" id=\"h-utility-functions\">Utility-Functions<\/h3>\n\n\n\n<p data-beyondwords-marker=\"668f1a07-3fff-4bb7-9464-fd58b43d294b\">In den Hooks k\u00f6nnen verschiedene Functions aufgerufen werden, welche den Build anpassen. Manche Context-Funktions k\u00f6nnen \u00fcberall aufgerufen werden, manche nur in bestimmten Hooks.<\/p>\n\n\n\n<p data-beyondwords-marker=\"d4a53c98-f3ba-4811-9460-d17f4becacf0\"><strong>Function<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"4832725a-c7cb-492b-bfc8-a5d052127af9\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"a9c6cb70-c5e7-44a4-9070-d6e51920859e\">Zus\u00e4tzliche Informationen im Build-Kontext loggen<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"4f33bb12-6007-455e-9a10-9941d7b7e64e\"><strong>addWatchFile<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"e3fcfaef-20e5-4172-9cc1-b64f3fce7a73\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"c6d980f7-7073-4079-9eee-df5952b82a39\">\u00c4nderungen an Dateien, die nicht direkt referenziert sind, k\u00f6nnen so einen Rebuild triggern<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"9a3d8925-6db1-4a53-8aa5-52e4e96c4350\"><strong>emitFile<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"44a034ec-1e39-49df-9c4a-7f996c185490\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"79db1f18-74b0-44f7-b628-7cca9288fb42\">Selbst eine Datei generieren und ins dist-Verzeichnis legen<\/li>\n\n\n\n<li data-beyondwords-marker=\"682abbcd-3e99-4e56-8a5a-aa6606002f15\">Eine Asset-Datei nicht im assets-Ordner ausliefern, sondern gleichberechtigt zu dem HTML-Dateien<\/li>\n\n\n\n<li data-beyondwords-marker=\"c0dfa146-73bd-4d3c-9091-2a9dbcd3da7e\">Der angegebene fileName ist relativ zum dist-Verzeichnis<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"f25333b4-c59b-4831-a15e-66c1755e7018\"><strong>getFileName<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"c1b461ef-e54c-422f-8e50-0dc6126ab055\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"82810072-619d-49c3-98e3-f9b430cf2589\">Dateinamen von Assets bestimmen, die \u00fcber this.emitFile erzeugt wurden<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"53f7bf04-39d7-44d8-9581-ff4a7669e1cb\"><strong>getCombinedSourceMaps<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"373815cb-56f5-4de0-8a1b-11d36e0f82b1\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"2c49ad43-f270-49ad-baf6-5eb7e48a9fe6\">Source-Maps von Dateien abfragen<\/li>\n\n\n\n<li data-beyondwords-marker=\"5d777ffa-7ed4-446d-a7a3-9ac16ccaf60e\">Nur in transform nutzbar<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"60daf244-cb4c-45a4-ae8b-63b06096c3c7\"><strong>getModuleIds<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"effe3f3d-6c18-47df-8ba9-a8fc62436101\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"6342b7fa-acaf-44f7-be60-a2dde7e60035\">Ausloggen aller Module (= Source-Dateien)<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"e1ccc7da-a081-4f3e-8739-9ded0ba3a716\"><strong>getModuleInfo<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"61f91b5d-5138-41e7-b175-76964c2cab65\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"0b8608db-13f9-4478-aa7d-69b84e8822a2\">Informationen zum aktuellen Module abfragen<\/li>\n\n\n\n<li data-beyondwords-marker=\"7575b0b9-0d30-4314-9e7c-a4323b261ae7\">In Vite scheinen die meisten Werte null zu sein<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"5029edcd-bcaa-452c-aabd-d51c74683474\"><strong>getWatchFiles<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"349e6e09-5f3b-4cfd-8947-50c5b6d203ee\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"246e398a-5070-473b-95c3-42bd88ad8e0e\">Gibt eine Liste aller Dateien, die einen Rebuild triggern<\/li>\n\n\n\n<li data-beyondwords-marker=\"d8d1ce35-8ec1-481a-bedb-580c37037d6a\">N\u00fctzlich, falls man wissen muss, welche Dateien gewatched werden<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"cd98d2bb-7ee6-45b4-94fe-68bd12276228\"><strong>load<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"c8220599-5da5-4841-a8c6-7a7c901bf150\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"49d53fc7-a12f-4b1c-abb1-1449c06376cd\">Triggern des load-Hooks mit der \u00fcbergebenen ID<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"911369ff-90d6-4c58-b785-d236fb2fdac7\"><strong>meta<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"30a8de1a-6a48-40b0-a91e-cd3d115439f2\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"bb4a4e15-3b9c-4d72-870f-868475ea88a0\">Version von Rollup abfragen<\/li>\n\n\n\n<li data-beyondwords-marker=\"01ea718a-1a7f-4a04-ab3c-4690c0a2b178\">WatchMode abfragen<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"d117b44b-ad72-4f23-a58a-c02c1d9a674f\"><strong>resolve<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"a0c9386c-fb5b-410a-b177-9ed736125c75\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"394c9250-3476-4c90-895c-13643f04c86e\">Triggern des resolveId-Hooks<\/li>\n<\/ul>\n\n\n\n<p data-beyondwords-marker=\"8cfd8cda-5777-4ac3-b651-4a32c947c166\"><strong>parse<\/strong><\/p>\n\n\n\n<ul data-beyondwords-marker=\"60837ab0-dc5f-48d3-990e-be71b8d2f15a\" class=\"wp-block-list\">\n<li data-beyondwords-marker=\"461b8541-3d25-4f89-9e28-177a95e0d74d\">Code in einen <a href=\"https:\/\/astexplorer.net\/\">AST<\/a> umwandeln<\/li>\n<\/ul>\n\n\n\n<h2 data-beyondwords-marker=\"553832f4-6d10-4de4-ba59-de650523f285\" class=\"wp-block-heading\" id=\"h-wie-kann-ich-selber-so-ein-plugin-schreiben\"><span class=\"ez-toc-section\" id=\"wie-kann-ich-selber-so-ein-plugin-schreiben\"><\/span>Wie kann ich selber so ein Plugin schreiben?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p data-beyondwords-marker=\"e12783e0-4445-4af7-af21-2610fcf24c20\">Bei dem Ganzen hast du jetzt vermutlich keinen Durchblick behalten. Mir ging es \u00e4hnlich. Die M\u00f6glichkeiten sind schier unendlich. Au\u00dferdem sind die Dokumentationen von Rollup und Vite relativ oberfl\u00e4chlich und helfen nicht unbedingt dabei, reale Anwendungsf\u00e4lle zu identifizieren. Deshalb schauen wir uns das mal an einem Beispiel an.<\/p>\n\n\n\n<p data-beyondwords-marker=\"74593541-d37f-4798-a293-dfcb84113350\">Wir wollen ein Plugin schreiben, welches die Datei-Struktur im dist-Verzeichnis anpassen kann. Die URL im Dev-Server soll auch anpassbar sein:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a04f3380c216&quot;}\" data-wp-interactive=\"core\/image\" data-beyondwords-marker=\"0d875c19-aeff-4077-9f3e-51c3adb22beb\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2000\" height=\"500\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/tabelle-configresolved-hook.png\" alt=\"Grafik zeigt eine Tabelle\" class=\"wp-image-56147\" srcset=\"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/tabelle-configresolved-hook.png 2000w, https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/tabelle-configresolved-hook-600x150.png 600w, https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/tabelle-configresolved-hook-1090x273.png 1090w, https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/tabelle-configresolved-hook-768x192.png 768w, https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/tabelle-configresolved-hook-1536x384.png 1536w, https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/tabelle-configresolved-hook-1920x480.png 1920w\" sizes=\"auto, (max-width: 2000px) 100vw, 2000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Bild vergr\u00f6\u00dfern: Grafik zeigt eine Tabelle\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p data-beyondwords-marker=\"82551879-8c9d-497c-b7b1-a466c6498948\">Um das Plugin m\u00f6glichst generisch zu halten, \u00fcbergeben wir die gew\u00fcnschten Mappings als Parameter in die Factory-Function. Da wir den Mode und den Base-Pfad sp\u00e4ter ben\u00f6tigen, merken wir sie uns im <em>configResolved<\/em>-Hook:<\/p>\n\n\n\t<div data-beyondwords-marker=\"79636aa9-e43e-45e6-8eee-cf9d1c18934e\" class=\"dv-embed-gist\">\n\t\t<div class=\"dv-embed-gist__wrapper\">\n\t\t\t\t\t\t<script src=\"https:\/\/gist.github.com\/dvelop-blog\/f70fc8d4721803f50b3bebdf3366b367.js?file=vite-01\"><\/script>\n\t\t<\/div>\n\t<\/div>\n\t\n\n\n<p data-beyondwords-marker=\"6d6b6d62-a350-4367-ab57-1416a47fc84c\">Um die Input-Pfade zu Mappen nutzen wir die resolveID- und load-Hooks:<\/p>\n\n\n\t<div data-beyondwords-marker=\"291a8f4d-a12b-4a46-b2dc-052b4d070939\" class=\"dv-embed-gist\">\n\t\t<div class=\"dv-embed-gist__wrapper\">\n\t\t\t\t\t\t<script src=\"https:\/\/gist.github.com\/dvelop-blog\/f70fc8d4721803f50b3bebdf3366b367.js?file=vite-02\"><\/script>\n\t\t<\/div>\n\t<\/div>\n\t\n\n\n<p data-beyondwords-marker=\"18c72a8a-d432-4d03-a24c-9b3e437abea7\">Der Build w\u00fcrde per Default bereits bei resolveId fehlschlagen, deswegen geben wir hier explizit die gew\u00fcnschte ID zur\u00fcck. Analog lesen wir f\u00fcr gemappte InputIDs die Datei unter dem im PluginOptions-Objekt angegebenen Pfad aus.<\/p>\n\n\n\n<p data-beyondwords-marker=\"f36d26ad-1276-42e9-89cd-cd5def860362\">Damit ist&#8217;s aber noch nicht getan. Denn in den Input-HTML-Dateien stehen ja Referenzen auf andere Dateien. Diese sind allerdings relativ vom urspr\u00fcnglichen Pfad der HTML-Datei aus. In src\/pages\/additional\/bar.html wird auf ..\/scripts\/foobar.ts verwiesen. Vom gemappten Pfad \/page2.html wird unter ..\/scripts\/foobar.ts nat\u00fcrlich nichts gefunden. Es m\u00fcsste .\/src\/scripts\/foobar.ts sein. Um die Referenzen im HTML zu fixen, kann der transform-Hook genutzt werden:<\/p>\n\n\n\t<div data-beyondwords-marker=\"0981e49d-f68e-46bb-aa7b-886fe84bf0fb\" class=\"dv-embed-gist\">\n\t\t<div class=\"dv-embed-gist__wrapper\">\n\t\t\t\t\t\t<script src=\"https:\/\/gist.github.com\/dvelop-blog\/f70fc8d4721803f50b3bebdf3366b367.js?file=vite-03\"><\/script>\n\t\t<\/div>\n\t<\/div>\n\t\n\n\n<p data-beyondwords-marker=\"c826b425-4e6c-415c-ae71-d34272386cd8\">Die <code>fixLinksInMappedFile<\/code>-Funktion ersetzt im Datei-String alle Referenzen durch den korrekten relativen Pfad.<\/p>\n\n\n\n<p data-beyondwords-marker=\"9315317e-2145-4480-acfb-b393259d33a1\">F\u00fcr den Build haben wir es damit schon. F\u00fcr den Dev-Mode muss eine Middleware registriert werden. Dabei wird wieder das <em>PluginOptions<\/em>-Objekt verwendet:<\/p>\n\n\n\t<div data-beyondwords-marker=\"6353b615-0e0c-41a5-aad9-4fa632539401\" class=\"dv-embed-gist\">\n\t\t<div class=\"dv-embed-gist__wrapper\">\n\t\t\t\t\t\t<script src=\"https:\/\/gist.github.com\/dvelop-blog\/f70fc8d4721803f50b3bebdf3366b367.js?file=vite-04\"><\/script>\n\t\t<\/div>\n\t<\/div>\n\t\n\n\n<p data-beyondwords-marker=\"24013735-13a9-4d06-a66f-2ea385f8c744\">Das Ersetzen des Referenzen muss hier im <em>transformIndexHTML<\/em>-Hook geschehen:<\/p>\n\n\n\t<div data-beyondwords-marker=\"1e7fa566-e634-4275-a1f1-2db5e796f826\" class=\"dv-embed-gist\">\n\t\t<div class=\"dv-embed-gist__wrapper\">\n\t\t\t\t\t\t<script src=\"https:\/\/gist.github.com\/dvelop-blog\/f70fc8d4721803f50b3bebdf3366b367.js?file=vite-05\"><\/script>\n\t\t<\/div>\n\t<\/div>\n\t\n\n\n<p data-beyondwords-marker=\"a8fc7055-a6be-4a10-867b-4fe8b63ec59d\">Und fertig ist unser Plugin! Die Registrierung sieht wie folgt aus:<\/p>\n\n\n\t<div data-beyondwords-marker=\"98260b8e-e737-40b5-bb79-6fd6658e4646\" class=\"dv-embed-gist\">\n\t\t<div class=\"dv-embed-gist__wrapper\">\n\t\t\t\t\t\t<script src=\"https:\/\/gist.github.com\/dvelop-blog\/f70fc8d4721803f50b3bebdf3366b367.js?file=vite-06\"><\/script>\n\t\t<\/div>\n\t<\/div>\n\t\n\n\n<h2 data-beyondwords-marker=\"1cee27fc-42bc-45c8-861c-c2cfa8f140b1\" class=\"wp-block-heading\" id=\"h-fazit\"><span class=\"ez-toc-section\" id=\"fazit\"><\/span>Fazit<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p data-beyondwords-marker=\"35d10577-1e3e-4634-a90a-4a731a587173\">Vite-Plugins sind ein sehr m\u00e4chtiges Werkzeug und k\u00f6nnen in den verschiedensten Szenarien zum Einsatz kommen. Durch die vielen M\u00f6glichkeiten schaffen sie eine gro\u00dfe Flexibilit\u00e4t darin, wie man eine Anwendung schreibt und im Source-Code strukturiert. Denn was am Ende dabei raus kommt, kann man ja vielf\u00e4ltig anpassen. In den Entwicklungs-Teams der <a href=\"https:\/\/www.d-velop.de\/\" target=\"_blank\" rel=\"noreferrer noopener\">d.velop AG<\/a> nutzen wir Vite-Plugins bereits an einigen Stellen, z.B. zur Integration von <a href=\"https:\/\/github.com\/mde\/ejs\">EJS<\/a> oder zur Generierung von HTML-Files auf Basis von Markdown.<\/p>\n\n\n\n<p data-beyondwords-marker=\"2ff715d0-4b0f-44dc-9e33-5be71f28bb33\">Was genau man mit den Hooks machen sollte und wie, das h\u00e4ngt vom Anwendungsfall ab. Wenn du selber ein Plugin schreiben willst, wirst du nicht ums Ausprobieren drumherum kommen. Aber es lohnt sich definitiv, sich damit zu besch\u00e4ftigen. Denn man kann sehr viel sehr cooles Zeug damit machen, soviel steht fest.<\/p>\n\n\n\n<div data-beyondwords-marker=\"e7aebb50-e79a-4a5a-9fcb-06a2e5170c2d\" class=\"wp-block-group is-style-cta\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 data-beyondwords-marker=\"db513db2-170c-45ad-9bd6-1ee86aadea89\" class=\"wp-block-heading\" id=\"h-dein-job-bei-der-d-velop-wartet-auf-dich\"><span class=\"ez-toc-section\" id=\"dein-job-bei-der-dvelop-wartet-auf-dich\"><\/span>Dein Job bei der d.velop wartet auf Dich!<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p data-beyondwords-marker=\"58c1e287-2eca-43f3-b89a-f09c3f67b600\">Du m\u00f6chtest Teil des Teams werden? Wir freuen uns immer \u00fcber Talente, die mit uns gemeinsam daran arbeiten, die Gesch\u00e4ftsprozesse in Unternehmen digital zu gestalten.<\/p>\n\n\n\n\t<div data-beyondwords-marker=\"d8db475a-8a11-492b-8fba-c435af7b7f82\" class=\"wp-block-buttons\">\n\t\t<div class=\"wp-block-button is-style-outline\">\n\t\t\t<a class=\"wp-block-button__link\" href=\"https:\/\/karriere.d-velop.de\/stellenanzeigen\/?utm_campaign=Sonstiges+-+d.velop+BLOG+-+01%2F2018&#038;utm_source=intern-blog-ger&#038;utm_medium=blogpost-vite-plugins&#038;utm_content=button\" target=\"_blank\">Zu den Stellenangeboten<\/a>\t\t<\/div>\n\t<\/div>\n\n\t<\/div><\/div>\n\n\n\n<p data-beyondwords-marker=\"db8df74d-74a9-4937-8a15-a83b9e69343d\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer in der Welt von JavaScript unterwegs ist, wird fr\u00fcher oder sp\u00e4ter mit einem Build-Tool in Ber\u00fchrung kommen. Vite spielt [&hellip;]<\/p>\n","protected":false},"author":298,"featured_media":56154,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","beyondwords_generate_audio":"1","beyondwords_project_id":"23937","beyondwords_content_id":"9b8c0b3f-ddc0-48a2-bf0f-5f3d3593b8da","beyondwords_preview_token":"da30d3cb-2304-4ac6-8243-a0f94d02f8e8","beyondwords_player_content":"","beyondwords_player_style":"","beyondwords_language_id":"","beyondwords_title_voice_id":"","beyondwords_body_voice_id":"","beyondwords_summary_voice_id":"","beyondwords_error_message":"","beyondwords_disabled":"1","beyondwords_delete_content":"","beyondwords_podcast_id":"","beyondwords_hash":"","publish_post_to_speechkit":"","speechkit_hash":"","speechkit_generate_audio":"","speechkit_project_id":"","speechkit_podcast_id":"","speechkit_error_message":"","speechkit_disabled":"","speechkit_access_key":"","speechkit_error":"","speechkit_info":"","speechkit_response":"","speechkit_retries":"","speechkit_status":"","speechkit_updated_at":"","_speechkit_link":"","_speechkit_text":""},"categories":[7],"tags":[6573],"class_list":["post-56132","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering","tag-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v25.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Was man mit Vite-Plugins so alles machen kann<\/title>\n<meta name=\"description\" content=\"Vite Plugins bieten erweiterte Funktionen f\u00fcr deine Entwicklungsumgebung. Finde heraus, wie sie deine Projekte verbessern k\u00f6nnen.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Was man mit Vite-Plugins so alles machen kann\" \/>\n<meta property=\"og:description\" content=\"Vite Plugins bieten erweiterte Funktionen f\u00fcr deine Entwicklungsumgebung. Finde heraus, wie sie deine Projekte verbessern k\u00f6nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/\" \/>\n<meta property=\"og:site_name\" content=\"d.velop blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/d.velop.ag\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-18T08:56:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-18T08:56:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/social-sharing-vite-plugin.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Timo Stovermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@d_velop\" \/>\n<meta name=\"twitter:site\" content=\"@d_velop\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Timo Stovermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"10\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/\"},\"author\":{\"name\":\"Timo Stovermann\",\"@id\":\"https:\/\/www.d-velop.de\/blog\/#\/schema\/person\/0d39b5fca394132e3aad15d36c204a56\"},\"headline\":\"Was man mit Vite-Plugins so alles machen kann\",\"datePublished\":\"2025-06-18T08:56:18+00:00\",\"dateModified\":\"2025-06-18T08:56:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/\"},\"wordCount\":1758,\"publisher\":{\"@id\":\"https:\/\/www.d-velop.de\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/beitragsbild-vite-plugins.png\",\"keywords\":[\"Engineering\"],\"articleSection\":[\"Engineering\"],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/\",\"url\":\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/\",\"name\":\"Was man mit Vite-Plugins so alles machen kann\",\"isPartOf\":{\"@id\":\"https:\/\/www.d-velop.de\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/beitragsbild-vite-plugins.png\",\"datePublished\":\"2025-06-18T08:56:18+00:00\",\"dateModified\":\"2025-06-18T08:56:22+00:00\",\"description\":\"Vite Plugins bieten erweiterte Funktionen f\u00fcr deine Entwicklungsumgebung. Finde heraus, wie sie deine Projekte verbessern k\u00f6nnen.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#primaryimage\",\"url\":\"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/beitragsbild-vite-plugins.png\",\"contentUrl\":\"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/beitragsbild-vite-plugins.png\",\"width\":2000,\"height\":666,\"caption\":\"Beitragsbild Vite Plugins\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/www.d-velop.de\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Was man mit Vite-Plugins so alles machen kann\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.d-velop.de\/blog\/#website\",\"url\":\"https:\/\/www.d-velop.de\/blog\/\",\"name\":\"d.velop blog\",\"description\":\"Digitalisierung, Dokumentenmanagement und rund um d.velop\",\"publisher\":{\"@id\":\"https:\/\/www.d-velop.de\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.d-velop.de\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.d-velop.de\/blog\/#organization\",\"name\":\"d.velop Gruppe\",\"url\":\"https:\/\/www.d-velop.de\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.d-velop.de\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2018\/12\/dvelop-blog-logo-invers.jpg\",\"contentUrl\":\"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2018\/12\/dvelop-blog-logo-invers.jpg\",\"width\":350,\"height\":350,\"caption\":\"d.velop Gruppe\"},\"image\":{\"@id\":\"https:\/\/www.d-velop.de\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/d.velop.ag\/\",\"https:\/\/x.com\/d_velop\",\"https:\/\/de.linkedin.com\/company\/d-velop\",\"https:\/\/www.xing.com\/pages\/d-velopag\",\"https:\/\/www.instagram.com\/d.velop_group\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.d-velop.de\/blog\/#\/schema\/person\/0d39b5fca394132e3aad15d36c204a56\",\"name\":\"Timo Stovermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.d-velop.de\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/03\/timo-stovermann-210x210.png\",\"contentUrl\":\"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/03\/timo-stovermann-210x210.png\",\"caption\":\"Timo Stovermann\"},\"description\":\"Software Development Engineer\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/timo-stovermann-982ab2242\/\"],\"url\":\"https:\/\/www.d-velop.de\/blog\/author\/timo-stovermann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Was man mit Vite-Plugins so alles machen kann","description":"Vite Plugins bieten erweiterte Funktionen f\u00fcr deine Entwicklungsumgebung. Finde heraus, wie sie deine Projekte verbessern k\u00f6nnen.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/","og_locale":"de_DE","og_type":"article","og_title":"Was man mit Vite-Plugins so alles machen kann","og_description":"Vite Plugins bieten erweiterte Funktionen f\u00fcr deine Entwicklungsumgebung. Finde heraus, wie sie deine Projekte verbessern k\u00f6nnen.","og_url":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/","og_site_name":"d.velop blog","article_publisher":"https:\/\/www.facebook.com\/d.velop.ag\/","article_published_time":"2025-06-18T08:56:18+00:00","article_modified_time":"2025-06-18T08:56:22+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/social-sharing-vite-plugin.png","type":"image\/png"}],"author":"Timo Stovermann","twitter_card":"summary_large_image","twitter_creator":"@d_velop","twitter_site":"@d_velop","twitter_misc":{"Verfasst von":"Timo Stovermann","Gesch\u00e4tzte Lesezeit":"10\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#article","isPartOf":{"@id":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/"},"author":{"name":"Timo Stovermann","@id":"https:\/\/www.d-velop.de\/blog\/#\/schema\/person\/0d39b5fca394132e3aad15d36c204a56"},"headline":"Was man mit Vite-Plugins so alles machen kann","datePublished":"2025-06-18T08:56:18+00:00","dateModified":"2025-06-18T08:56:22+00:00","mainEntityOfPage":{"@id":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/"},"wordCount":1758,"publisher":{"@id":"https:\/\/www.d-velop.de\/blog\/#organization"},"image":{"@id":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#primaryimage"},"thumbnailUrl":"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/beitragsbild-vite-plugins.png","keywords":["Engineering"],"articleSection":["Engineering"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/","url":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/","name":"Was man mit Vite-Plugins so alles machen kann","isPartOf":{"@id":"https:\/\/www.d-velop.de\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#primaryimage"},"image":{"@id":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#primaryimage"},"thumbnailUrl":"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/beitragsbild-vite-plugins.png","datePublished":"2025-06-18T08:56:18+00:00","dateModified":"2025-06-18T08:56:22+00:00","description":"Vite Plugins bieten erweiterte Funktionen f\u00fcr deine Entwicklungsumgebung. Finde heraus, wie sie deine Projekte verbessern k\u00f6nnen.","breadcrumb":{"@id":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#primaryimage","url":"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/beitragsbild-vite-plugins.png","contentUrl":"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/06\/beitragsbild-vite-plugins.png","width":2000,"height":666,"caption":"Beitragsbild Vite Plugins"},{"@type":"BreadcrumbList","@id":"https:\/\/www.d-velop.de\/blog\/engineering\/vite-plugins\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/www.d-velop.de\/blog\/"},{"@type":"ListItem","position":2,"name":"Was man mit Vite-Plugins so alles machen kann"}]},{"@type":"WebSite","@id":"https:\/\/www.d-velop.de\/blog\/#website","url":"https:\/\/www.d-velop.de\/blog\/","name":"d.velop blog","description":"Digitalisierung, Dokumentenmanagement und rund um d.velop","publisher":{"@id":"https:\/\/www.d-velop.de\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.d-velop.de\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.d-velop.de\/blog\/#organization","name":"d.velop Gruppe","url":"https:\/\/www.d-velop.de\/blog\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.d-velop.de\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2018\/12\/dvelop-blog-logo-invers.jpg","contentUrl":"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2018\/12\/dvelop-blog-logo-invers.jpg","width":350,"height":350,"caption":"d.velop Gruppe"},"image":{"@id":"https:\/\/www.d-velop.de\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/d.velop.ag\/","https:\/\/x.com\/d_velop","https:\/\/de.linkedin.com\/company\/d-velop","https:\/\/www.xing.com\/pages\/d-velopag","https:\/\/www.instagram.com\/d.velop_group\/"]},{"@type":"Person","@id":"https:\/\/www.d-velop.de\/blog\/#\/schema\/person\/0d39b5fca394132e3aad15d36c204a56","name":"Timo Stovermann","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.d-velop.de\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/03\/timo-stovermann-210x210.png","contentUrl":"https:\/\/www.d-velop.de\/blog\/wp-content\/uploads\/2025\/03\/timo-stovermann-210x210.png","caption":"Timo Stovermann"},"description":"Software Development Engineer","sameAs":["https:\/\/www.linkedin.com\/in\/timo-stovermann-982ab2242\/"],"url":"https:\/\/www.d-velop.de\/blog\/author\/timo-stovermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.d-velop.de\/blog\/wp-json\/wp\/v2\/posts\/56132","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.d-velop.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.d-velop.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.d-velop.de\/blog\/wp-json\/wp\/v2\/users\/298"}],"replies":[{"embeddable":true,"href":"https:\/\/www.d-velop.de\/blog\/wp-json\/wp\/v2\/comments?post=56132"}],"version-history":[{"count":3,"href":"https:\/\/www.d-velop.de\/blog\/wp-json\/wp\/v2\/posts\/56132\/revisions"}],"predecessor-version":[{"id":57042,"href":"https:\/\/www.d-velop.de\/blog\/wp-json\/wp\/v2\/posts\/56132\/revisions\/57042"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.d-velop.de\/blog\/wp-json\/wp\/v2\/media\/56154"}],"wp:attachment":[{"href":"https:\/\/www.d-velop.de\/blog\/wp-json\/wp\/v2\/media?parent=56132"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.d-velop.de\/blog\/wp-json\/wp\/v2\/categories?post=56132"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.d-velop.de\/blog\/wp-json\/wp\/v2\/tags?post=56132"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}