Impossible de charger la bibliothèque tierce dans LWC (Mapbox)
J'essayais d'utiliser Mapbox dans un composant LWC, en important sa bibliothèque à l'aide de loadScript, mais je n'obtiens qu'une erreur indéfinie dans la promesse.
J'ai créé un bundle ZIP avec les fichiers CSS et JS (mapbox.css et mapbox.js), ainsi qu'un fichier JS de test pour vérifier qu'il n'y a pas de problème avec le ZIP lui-même (example.js avec un console.log
message).
Je l'ai téléchargé à l'aide de l'API de métadonnées et l'ai défini comme un application/zip
, voici le contenu du fichier XML:
<?xml version="1.0" encoding="UTF-8"?>
<StaticResource xmlns="http://soap.sforce.com/2006/04/metadata">
<cacheControl>Private</cacheControl>
<contentType>application/zip</contentType>
</StaticResource>
Voici l'exemple de code que j'essaie d'exécuter:
import { api, LightningElement } from 'lwc';
import { loadScript, loadStyle } from 'lightning/platformResourceLoader';
import MAPBOX from '@salesforce/resourceUrl/mapbox';
export default class InquiryMap extends LightningElement {
@api recordId;
mapboxInitialized = false;
renderedCallback() {
this.bootMapbox();
};
bootMapbox() {
if (this.mapboxInitialized) {
return;
}
this.mapboxInitialized = true;
loadStyle(this, MAPBOX + '/mapbox.css')
.then(() => {
console.log('Mapbox CSS is ready! =)');
})
.catch((err) => {
console.log('Error (CSS)', err);
});
loadScript(this, MAPBOX + '/example.js')
.then(() => {
console.log('Mapbox Example JS is ready! =)');
})
.catch((err) => {
console.log('Error (Example)', err);
});
loadScript(this, MAPBOX + '/mapbox.js')
.then(() => {
console.log('Mapbox JS is ready! =)');
})
.catch((err) => {
console.log('Error (JS)', err);
});
};
}
Mais voici la sortie de la console:
I am a example JS file
Mapbox Example JS is ready! =)
Mapbox CSS is ready! =)
Error (JS) undefined
La ligne avec le contenu Mapbox Example JS is ready! =)
provient du example.js
fichier.
J'ai vérifié que les fichiers sont corrects en les ouvrant dans une fenêtre de navigateur dans l'URL de Salesforce, et tout semble bien, mais comme je n'obtiens aucun détail sur l'erreur, je ne sais pas ce que je peux faire.


Le contenu de la bibliothèque JS défaillante peut être trouvé ici: Mapbox GL 2.0.1 .
Toute aide serait très appréciée!
Réponses
Lors du débogage avec la version régulière de Mapbox GL standard à l'aide de la console Salesforce Locker, le problème est dû au fait que le CSP requis pour que cela fonctionne n'est pas pris en charge par le service Salesforce Locker.
Les objets blob worker-src blob child-src ne sont pas pris en charge dans le casier.
Ensuite, j'ai découvert que Mapbox fournit une approche alternative documentée dans cette section pour les sites qui ont une stratégie CSP stricte. Ceci est documenté ici .
En utilisant cette approche, j'ai découvert qu'il y avait cette erreur qui apparaît
Erreur (JS) TypeError: a.Worker n'est pas un constructeur au nouveau gp (mapbox: 1) à xp.acquire (mapbox: 1) au nouvel Eh (mapbox: 1) au nouvel Id (mapbox: 1) à Map._updateStyle (mapbox: 1) à Map.setStyle (mapbox: 1) à new Map (mapbox: 1) à eval (mapbox.js: 67)
Cette erreur est due au fait que le service Locker empêche l'utilisation de JavaScript Worker
Voici quelques suggestions que je voudrais laisser ici
- Utilisez le hors du composant de base de la boîte en utilisant la carte-éclair composant
Si ce qui précède ne répond pas, utilisez les options ci-dessous
- Utilisez un Visualforce et iframe la page à l'intérieur du composant LWC. En utilisant cette approche, il n'y aura aucune restriction de casier.
- Contactez le support MapBox pour voir s'il a des recommandations. Existe-t-il un SDK alternatif sans utiliser le worker Javascript? Vous pouvez les diriger vers ce post.