Skip to content

Framework-Vergleich

v-map ist ein Web-Component-Library und funktioniert grundsätzlich in jedem Framework. Die Integration ist aber nicht überall gleich aufwändig. Diese Seite vergleicht alle 10 Framework-Demos aus dem examples/- Verzeichnis des v-map-Repos.

Vergleichstabelle

Architektur

FrameworkTypServer-RuntimeBuild-ToolDemo-JS (kB)
AstroStatic-Site-GeneratorneinAstro/Vite~3 (inline)
SolidSPA (Client-only)neinVite16
LitSPA (Client-only)neinVite29
Vue 3SPA (Client-only)neinVite67
SvelteKitFull-Stack (SSR/SSG)Node/EdgeVite86
SolidStartFull-Stack (SSR/SSG)Node/EdgeVinxi109
AngularSPA (Client-only)neinesbuild155
Nuxt 4Full-Stack (SSR/SSG)Node/NitroVite188
ReactSPA (Client-only)neinVite196
Next.jsFull-Stack (SSR/SSG)Node/EdgeWebpack/Turbo790

Demo-JS = nur der Framework-Overhead

Die Größen oben enthalten nicht v-map selbst (das wird per jsDelivr-CDN geladen), sondern nur das Framework-Runtime + die Showcase-App-Logik. Astro ist quasi 0, weil es keinen Framework- Runtime ins Bundle schreibt — der Showcase ist reines Inline-JS.

v-map Integration

FrameworkCustom-Element-SupportSSR-WorkaroundEvent-BindingConfig-Aufwand
Astronativkeiner nötigaddEventListener0 Zeilen
Solidnativkeiner (kein SSR)on:event-name0 Zeilen
Litnativ (WC selbst)keiner (kein SSR)@event-name0 Zeilen
SvelteKitnativssr = falseonevent-name1 Zeile
SolidStartnativclientOnly()on:event-name3 Zeilen
Vue 3isCustomElement Configkeiner (kein SSR)@event-name3 Zeilen
Nuxt 4isCustomElement Configoptional*@event-name3 Zeilen
ReactJSX IntrinsicElementskeiner (kein SSR)addEventListener via ref5+ Zeilen
AngularCUSTOM_ELEMENTS_SCHEMAkeiner (kein SSR)(event-name)2 Zeilen
Next.jsJSX IntrinsicElements'use client'addEventListener via ref6+ Zeilen

* Nuxt prerendert die v-map-Markup als statisches HTML — das ist harmlos, weil <v-map> zur SSR-Zeit nur ein unbekannter Tag ist. Erst im Browser upgradet der Stencil-Loader das Element.

Zoom-Slider Bidirektional (ab v0.5.0)

FrameworkSlider → MapMap → Slider (vmap-view-change)
AstrosetAttribute('zoom', z)addEventListener('vmap-view-change', ...)
SvelteKit{zoom} (Shorthand-Bind)onvmap-view-change={handler}
Reactzoom={zoom} + refaddEventListener in useEffect
Vue 3:zoom="zoom"@vmap-view-change="handler"
Angular[attr.zoom]="zoom()" (Signal)(vmap-view-change)="handler($event)"
Next.jszoom={zoom} + refaddEventListener in useEffect
Nuxt 4:zoom="zoom"@vmap-view-change="handler"
Litzoom=${this.zoom}@vmap-view-change=${this.handler}
Solidzoom={zoom()} (Signal-Getter)on:vmap-view-change={handler}
SolidStartzoom={zoom()}on:vmap-view-change={handler}

Empfehlungen

Wann welches Framework?

"Ich brauche nur eine Karte auf einer statischen Seite"

Astro oder CDN

Kein Framework-Overhead, kein Build nötig (CDN), oder minimaler Build (Astro). Siehe CDN ohne Bundler oder Astro-Guide.

"Ich habe ein bestehendes React/Vue/Svelte/Angular-Projekt"

Das Framework, das du schon nutzt

v-map ist ein Web Component — es funktioniert in jedem Framework. Nimm das, was dein Team kennt. Der Integrationsaufwand unterscheidet sich um maximal 5 Zeilen Config.

"Ich brauche SSR / SEO / Server-Side Data Loading"

SvelteKit, Nuxt 4 oder Next.js

Alle drei unterstützen v-map mit einem einzigen SSR-Opt-out pro Route. SvelteKit hat den kleinsten Bundle, Next.js das größte Ökosystem, Nuxt die engste Vue-Integration.

"Ich will maximale Performance bei minimaler Bundle-Größe"

Solid oder Lit

Solid (16 kB) hat fine-grained Reactivity ohne Virtual DOM. Lit (29 kB) ist Web Components pur — ideal als WC-zu-WC-Interop. Beide brauchen null Custom-Element-Config.

"Ich will zwei Web-Component-Libraries zusammen verwenden"

Lit

Lit und v-map sind beide Custom-Element-basiert. <vmap-showcase> hostet <v-map> in seinem Shadow Root, ohne Wrapper oder Brücke. Stencil-Events mit composed: true steigen über die Shadow-Boundary.

Gemeinsame Muster

Unabhängig vom Framework gelten für alle v-map-Integrationen dieselben Grundregeln:

  1. v-map per CDN laden, nicht bundlen. Stencil's Lazy-Loader nutzt import.meta.url zur Chunk-Auflösung. Wenn ein Bundler den Loader ingestet, brechen die URLs. Siehe CDN-Guide.

  2. v-map { display: block; width: 100%; height: ... } setzen. Custom Elements sind inline by default. Ohne Block-Display ist die Karte 0px hoch.

  3. Zoom/Center als Props binden, nicht per map.setView(). Die @Watch-Handler in v-map (ab v0.4.0) propagieren Prop-Änderungen automatisch an den aktiven Provider.

  4. vmap-view-change für den Rückkanal nutzen. Wenn der User direkt in der Karte zoomt/pant (Mausrad, Pinch), feuert dieses Event mit dem neuen { center, zoom }. Den Slider damit syncen (ab v0.5.0).

  5. <v-map-error> für deklaratives Error-Handling. Einfach als Kind von <v-map> einfügen — keine JavaScript-Listener nötig für die Toast-Anzeige.

Siehe auch