React SDK 0.2.0 — 21 Pakete, eine Umbenennung und was sich außerhalb eines Bundlers nicht laden lässt

21 Pakete auf einer gemeinsamen Version. Dazu die Umbenennung von react-geojson-layer, die Korrektur des leeren react-for-mapkit und eine Übersicht, was sich außerhalb eines Bundlers laden lässt und was nicht.

MapConductor React SDK steht jetzt bei 0.2.0. 21 Pakete auf npm, alle unter Apache-2.0. Nur @mapconductor/react-for-openlayers trägt 0.2.1; warum, steht am Ende.

Was sich geändert hat

  • Alle Pakete haben dieselbe Version bekommen. Die internen @mapconductor/*-Abhängigkeitsbereiche sind mitgezogen, sodass keine ungewollte Mischung von Versionen entsteht.
  • @mapconductor/react-geojson-layer heißt jetzt @mapconductor/react-geojson. Geändert hat sich nur der Paketname; GeoJSONLayer, GeoJSONLayerState, GeoJSONParser und die übrige API bleiben, wie sie waren. Das alte Paket bleibt als 0.1.3 auf npm liegen, wird aber nicht mehr gepflegt.
  • Vier Pakete sind zum ersten Mal erschienen: react-for-arcgis, react-for-mappls, react-geojson und react-kml.
  • react-for-mapkit hat endlich Inhalt. In 0.1.3 lagen nur LICENSE und README bei: Das Paket fehlte in der Liste der Build-Ziele, sodass files: ["dist"] auf nichts passte. Wer 0.1.3 verwendet, sollte aktualisieren.
  • Der Lizenzbezeichner heißt jetzt korrekt Apache-2.0. Vorher stand dort Apache2, was als SPDX-Wert ungültig ist — Werkzeuge lasen das als „nicht erkennbare Lizenz“.

Die Abhängigkeiten zu den Karten-SDKs wurden auf den neuesten Stand innerhalb des deklarierten Bereichs gebracht. Bewegt haben sich dabei nur zwei: maplibre-gl (6.3.0 → 6.4.0) und @turf/turf (7.3.5 → 7.4.0); der Rest war bereits aktuell.

Die Pakete und ihre Karten-SDKs

PaketVersionKarten-SDKRepository
@mapconductor/js-sdk-core0.2.0js-sdk-core
@mapconductor/js-sdk-react0.2.0js-sdk-react
@mapconductor/react-for-arcgis0.2.0@arcgis/core ^5.1.16react-for-arcgis
@mapconductor/react-for-azuremaps0.2.0azure-maps-control ^3.7.0react-for-azuremaps
@mapconductor/react-for-cesium0.2.0cesium ^1.131.0react-for-cesium
@mapconductor/react-for-googlemaps0.2.0@googlemaps/js-api-loader ^2.1.1react-for-googlemaps
@mapconductor/react-for-here0.2.0CDN (global H)react-for-here
@mapconductor/react-for-leaflet0.2.0leaflet ^1.9.4react-for-leaflet
@mapconductor/react-for-longdo0.2.0CDN (api.longdo.com/map3)react-for-longdo
@mapconductor/react-for-mapbox0.2.0mapbox-gl ^3.15.0react-for-mapbox
@mapconductor/react-for-mapkit0.2.0CDN (cdn.apple-mapkit.com)react-for-mapkit
@mapconductor/react-for-maplibre0.2.0maplibre-gl ^6.0.0react-for-maplibre
@mapconductor/react-for-mappls0.2.0mappls-web-maps ^3.8.1react-for-mappls
@mapconductor/react-for-maptiler0.2.0maplibre-gl ^6.0.0react-for-maptiler
@mapconductor/react-for-openlayers0.2.1ol ^10.2.1react-for-openlayers
@mapconductor/react-for-tomtom0.2.0@tomtom-org/maps-sdk ^0.51.0, maplibre-gl ^5.24.0react-for-tomtom
@mapconductor/react-geojson0.2.0react-geojson
@mapconductor/react-heatmap0.2.0react-heatmap
@mapconductor/react-icons0.2.0react-icons
@mapconductor/react-kml0.2.0react-kml
@mapconductor/react-marker-clustering0.2.0react-marker-clustering

Drei Anbieter führen kein Karten-SDK als Abhängigkeit, weil ihr SDK nicht über npm verteilt wird. HERE, Apple MapKit JS und Longdo werden zur Laufzeit vom CDN des Anbieters geladen; die tatsächlich laufende Version ist also die, die der Anbieter ausliefert.

Nur react-for-tomtom bleibt bei maplibre-gl 5.x. @tomtom-org/maps-sdk hängt an maplibre-gl@^5.24.0; ein Sprung auf 6.x würde MapLibre zweimal einziehen und dem TomTom-SDK ein Map-Objekt übergeben, mit dem es nicht rechnet.

ESM, CommonJS und SSR

Diese Pakete setzen einen Bundler voraus. Unter Vite, webpack, Next.js und Metro werden sie korrekt aufgelöst; für alle Anbieter haben wir vor der Veröffentlichung das Zeichnen im echten Browser geprüft.

Anders sieht es aus, wenn Nodes eigener Resolver sie direkt lädt — nacktes node, ein SSR-Einstiegspunkt ohne Bundler, die node-Umgebung von Vitest. Der Grund liegt darin, dass die zugrunde liegenden Karten-SDKs Browser-Bibliotheken sind. Die folgende Tabelle stammt aus echten Importen der veröffentlichten Pakete in einem leeren Projekt.

Paketimportrequire()Grund
react-for-arcgisnono@arcgis/core/views/MapView importiert eine .css-Datei, die Node nicht laden kann. Jede Karte braucht MapView, also lässt sich das von unserer Seite nicht umgehen.
react-for-leafletnonoleaflet greift schon beim Auswerten des Moduls auf window zu.
react-for-azuremapsnonoazure-maps-control greift schon beim Auswerten des Moduls auf window zu.
react-for-tomtomnonoLiest maplibre-gl/package.json, was Node nur mit einem Import-Attribut lädt.
react-for-mapplsnoyesmappls-web-maps ist CommonJS; der ESM-Loader kann seine benannten Exporte nicht statisch auswerten.
react-for-maplibreyesnomaplibre-gl v6 ist reines ESM und deklariert keinen CommonJS-Einstiegspunkt.
react-for-maptileryesnoWie bei react-for-maplibre.

Die übrigen 14 Pakete lassen sich auf beiden Wegen laden. Dasselbe Ergebnis gilt schon für 0.1.3 — mit 0.2.0 ist das also nicht neu entstanden.

Zwei Punkte sind es wert, im Kopf behalten zu werden.

  • Importieren Sie den Anbieter bei SSR verzögert auf der Client-Seite. Ein statischer Import eines reinen Browser-Anbieters auf oberster Ebene zerlegt jedes Server-Rendering, das nicht durch einen Bundler läuft. Das offizielle Web-Beispiel nutzt lazy(() => import('./providers/...')), und genau deshalb geht der SSR-Build von Vite durch.
  • react-for-maplibre, react-for-maptiler und react-for-tomtom deklarieren einen CommonJS-Einstiegspunkt, der in Wirklichkeit nicht funktioniert. maplibre-gl v6 hat CommonJS aufgegeben. Nutzen Sie diese drei als ESM. Das require aus exports zu entfernen, holen wir in einer späteren Version nach.

Das eine Problem, das bei uns lag

Dass react-for-openlayers sich unter Node-ESM nicht laden ließ, hatte mit OpenLayers nichts zu tun. Unser eigener Quelltext importierte ol/proj ohne Dateiendung, und Node weist das als Verzeichnis-Import zurück. Bundler lassen es durch, deshalb ist es uns nicht aufgefallen. In 0.2.1 ist es behoben — eine einzige Zeile, und am Verhalten über einen Bundler ändert sich nichts.

Installation

bash
npm install @mapconductor/js-sdk-core @mapconductor/js-sdk-react @mapconductor/react-for-maplibre

Jedes Paket liegt in einem eigenen Repository. Siehe github.com/MapConductor.