MapConductor React SDK के मॉड्यूल अपडेट कर दिए गए हैं: npm पर मौजूद 21 पैकेज में से 19 आगे बढ़े। इसका ज़्यादातर हिस्सा डिपेंडेंसी की देखरेख है, पर MapLibre के आसपास दो सुधार ऐसी गड़बड़ियों के हैं जिनकी वजह सामने आने पर पकड़ में मुश्किल से आती है।
वर्शन जान-बूझकर एक-जैसे नहीं रखे गए। react-for-maplibre और react-for-openlayers 0.2.2 पर हैं; react-icons और react-kml जहाँ थे वहीं हैं; बाकी 0.2.1 पर। 0.2.0 से अलग, अब हम हर पैकेज को एक ही अंक पर नहीं रखते: जिस पैकेज की सामग्री बदली ही नहीं, उसका अंक बढ़ाना अपडेट करने वाले को सिर्फ़ इतना बताता है कि "कुछ बदला है"।
नक्शा सिर्फ़ पृष्ठभूमि का रंग दिखाता है, और कोई त्रुटि नहीं आती
react-for-maplibre 0.2.2 इसी बारे में है।
MapLibre GL JS v6 अपना Web Worker अलग फ़ाइल के रूप में भेजता है और उसका URL अपने ही import.meta.url से बनाता है। बंडलर से गुज़रते ही यह मान बिल्ड के समय जड़ हो जाता है — Rspack पर file:// पथ, Vite पर प्री-बंडल की जगह — जबकि worker की असली फ़ाइल कहीं भी नहीं निकलती। इसलिए रिज़ॉल्यूशन विफल हो जाता है।
असुविधाजनक बात यह है कि विफलता कुछ भी नहीं फेंकती। चुपचाप new Worker("") जैसा कुछ बन जाता है और नक्शा एक भी टाइल अनुरोध भेजे बिना रुक जाता है। दिखता सिर्फ़ पृष्ठभूमि के रंग का नक्शा है। अगर नेटवर्क पैनल में .pbf के अनुरोध शून्य हैं, तो यही लक्षण है।
0.2.2 पैकेज के साथ एक आत्मनिर्भर worker भेजता है और पहला नक्शा बनते ही उसे अपने आप रजिस्टर कर देता है। कुछ भी कॉन्फ़िगर नहीं करना पड़ता। Vite पर और webpack / Rspack पर, dev में और प्रोडक्शन बिल्ड में, व्यवहार एक जैसा है।
एक अपवाद है: जब आप worker को अपने ही URL से परोसते हैं (साझा CDN, या ऐसा बिल्ड जो उसे पहले से निकालता है)। पहला नक्शा बनने से पहले setMapLibreWorkerUrl(url) बुलाइए, तो साथ भेजा गया worker छोड़ दिया जाता है — और डाउनलोड भी नहीं होता।
import { setMapLibreWorkerUrl } from '@mapconductor/react-for-maplibre';
setMapLibreWorkerUrl('https://cdn.example.com/maplibre-worker.mjs');एक बात पहले से जान लें: Vite का dev सर्वर साथ भेजे गए worker को अपनी ट्रांसफ़ॉर्म पाइपलाइन से गुज़ारता है, जिससे /@vite/client का एक import घुस जाता है और फ़ाइल फूल जाती है (लगभग 478KB → 2.8MB)। देखने में चिंताजनक है, व्यवहार में कुछ नहीं बदलता; प्रोडक्शन बिल्ड उसे सादे एसेट की तरह निकालता है।
worker को Blob URL बनाकर देना v6 में काम नहीं करता। worker बिना त्रुटि चालू तो हो जाता है, फिर भी एक भी टाइल अनुरोध नहीं भेजता। उसे असली फ़ाइल के रूप में ही परोसना पड़ता है।
onMapLoaded कभी चला ही नहीं
यह भी react-for-maplibre 0.2.2 है।
MapLibreProvider.initialize() कंट्रोलर बनाने से पहले map.once('load') का इंतज़ार करता है। यानी कंट्रोलर बनने तक लोड हो चुका होता है, इसलिए setupEventListeners जो on('load') जोड़ता है वह दोबारा कभी नहीं चल सकता।
कंस्ट्रक्टर में "पहले से आरंभ हो चुका है?" वाली जाँच इसी स्थिति के लिए थी, और काम नहीं कर रही थी: लोड के तुरंत बाद loaded() और isStyleLoaded() दोनों false लौटाते हैं। MapLibre v6 का isStyleLoaded() Style.loaded() बुलाता है, जो हर tileManager के पूरा होने तक देखता है।
0.2.2 में ठीक कर दिया गया। अगर आप onMapLoaded इस्तेमाल कर रहे थे, तो अब तक वह एक बार भी नहीं बुलाया गया था।
js-sdk-core 0.2.1 — अलग-अलग आइकन ज़्यादा होने पर Service Worker गिर जाता था
मार्कर आइकन टाइल बाँटने वाले Service Worker तक बिटमैप के रूप में जाते हैं। उन्हें एक-एक करके इकट्ठा करके अंत में एक साथ भेजा जाता था, इसलिए कैश जितने रख सकता है उससे ज़्यादा अलग-अलग आइकन होने पर, पहले इकट्ठा हुए वाले भेजने के समय तक मुक्त हो चुके होते थे। मुक्त हो चुके ImageBitmap को structured clone से गुज़ारने पर DataCloneError आता है, और वह पूरे Service Worker रजिस्ट्रेशन को साथ ले डूबता है।
रजिस्ट्रेशन न रहने पर एक भी टाइल नहीं आती, तो दिखता यही है कि नक्शा आता ही नहीं। और यह तभी दोहराया जाता है जब अलग-अलग आइकन की संख्या कैश के आकार से आगे निकले — वही किस्म की गड़बड़ी जो अपनी मशीन पर चलती है और प्रोडक्शन में रुक जाती है।
सुधार बड़ा कैश नहीं है। यह स्वामित्व का मामला है: अब भेजा जाने वाला डेटा अपनी प्रतियाँ रखता है और भेजना पूरा होते ही उन्हें मुक्त करता है। जो कैश का है उसे छुआ नहीं जाता।
TomTom अब दूसरा MapLibre नहीं ढोता
0.2.0 में react-for-tomtom अकेला मॉड्यूल था जिसे maplibre-gl 5.x पर रोका गया था, क्योंकि @tomtom-org/maps-sdk maplibre-gl@^5.24.0 पर निर्भर था। 6.x पर जाने से MapLibre की दो प्रतियाँ इंस्टॉल होतीं और TomTom SDK को ऐसा map ऑब्जेक्ट मिलता जिसकी उसे उम्मीद नहीं थी।
TomTom खुद 0.51.5 में maplibre-gl@^6.4.0 पर चला गया। react-for-tomtom 0.2.1 उसके साथ ^6.6.0 पर आ गया है। अब वह react-for-maplibre और react-for-maptiler के साथ एक ही MapLibre साझा करता है, और 0.2.0 वाली चेतावनी लागू नहीं होती।
एक उप-परिणाम: react-for-tomtom अब Node के ESM रिज़ॉल्वर के नीचे लोड हो जाता है। 0.2.0 में नहीं होता था, और वजह यह बताई गई थी कि वह "maplibre-gl/package.json पढ़ता है, जिसे Node केवल import attribute के साथ लोड करता है"। प्रकाशित पैकेजों को एक खाली प्रोजेक्ट में import करके मापा गया।
import | require() | |
|---|---|---|
react-for-tomtom 0.2.0 | no | no |
react-for-tomtom 0.2.1 | yes | no |
require() अब भी विफल होता है क्योंकि maplibre-gl v6 केवल ESM है और कोई CommonJS प्रवेश घोषित नहीं करता — वही वजह जो react-for-maplibre और react-for-maptiler की है। इन तीनों को ESM से इस्तेमाल कीजिए।
चार 0.2.1 रिलीज़ में कोड नहीं बदला
js-sdk-react, react-geojson, react-heatmap और react-marker-clustering के 0.2.1 वही JavaScript भेजते हैं जो 0.2.0 भेजता था। जो बदला वह पैकेज के भीतर साथ चलने वाला बिल्ड-विवरण है, जिसे कोई वेब बिल्ड कभी नहीं पढ़ता। इन्हें जल्दी लेने की ज़रूरत नहीं, और लेने से नुकसान भी नहीं।
नक्शा SDK के अपडेट
घोषित रेंज के भीतर सबसे नए वर्शन पर लाया गया। ये वे हैं जो आगे बढ़े।
| डिपेंडेंसी | 0.2.0 | अभी |
|---|---|---|
mapbox-gl | ^3.15.0 | ^3.29.0 |
maplibre-gl | ^6.0.0 | ^6.6.0 |
cesium | ^1.131.0 | ^1.144.0 |
ol | ^10.2.1 | ^10.10.0 |
@arcgis/core | ^5.1.16 | ^5.1.20 |
@tomtom-org/maps-sdk | ^0.51.0 | ^0.51.5 |
azure-maps-control | ^3.7.0 | ^3.7.4 |
@turf/turf | ^7.3.5 | ^7.4.0 |
तीन जहाँ के तहाँ रहे — leaflet ^1.9.4, @googlemaps/js-api-loader ^2.1.1 और mappls-web-maps ^3.8.1 — क्योंकि ऊपर की तरफ़ कुछ नहीं हिला। React की peerDependencies ^18.0.0 || ^19.0.0 ही हैं; बदला केवल विकास के समय वाला वर्शन (19.2.7 → 19.2.8)।
पैकेज और उनके नक्शा SDK
HERE, Apple MapKit JS और Longdo डिपेंडेंसी में कोई नक्शा SDK नहीं रखते, क्योंकि वे SDK npm पर वितरित ही नहीं होते। वे चलते समय वेंडर के CDN से लोड होते हैं, इसलिए असल में जो वर्शन चलता है वह वही है जो वेंडर परोस रहा है।
अपडेट कैसे करें
npm install @mapconductor/js-sdk-core@latest @mapconductor/js-sdk-react@latest \ @mapconductor/react-for-maplibre@latest
js-sdk-core भी 0.2.1 पर आ गया है। उसमें ऊपर बताया Service Worker सुधार है, इसलिए अगर आप कई अलग-अलग मार्कर आइकन इस्तेमाल करते हैं तो इसे ज़रूर लें।
ESM, CommonJS और SSR का व्यवहार 0.2.0 जैसा ही है, ऊपर बताए react-for-tomtom को छोड़कर। बंडलर के बाहर क्या लोड होता है और क्या नहीं, उसकी पूरी तालिका React SDK 0.2.0 की पोस्ट में है। हर पैकेज अपनी अलग रिपॉज़िटरी में रहता है — देखिए github.com/MapConductor।