Source: display/index.preLoad.js


/* Charge le display en version es5 ou module suivant le navigateur
 * ATTENTION, ce fichier doit rester en es5, car il ne passe pas par babel ni webpack
 * (même s'il est minifié par terser et copié par webpack.preRun.js à chaque compil webpack)
 */
/* eslint-env browser */

/**
 * Un "preLoader" qui chargera display en version es5 ou module es6 suivant les capacités du navigateur,
 * puis l'appellera quand il sera chargé
 * @param {Ressource}     ressource La ressource à afficher
 * @param {initOptions}   [options] Les options éventuelles (passer base si ce js est chargé sur un autre domaine)
 * @param {errorCallback} [next]    Fct appelée à la fin du chargement avec une erreur ou undefined
 */
window.stdisplay = function displayPreLoad (ressource, options, next) {
  'use strict'
  // on ne veut pas faire de require / import pour récupérer la version, qui par ailleurs n'est pas forcément incrémentée à chaque build
  // (idiot d'ajouter tout le bootstrap wepack pour ça alors que ce fichier ne fait que qq octets)
  // c'est un bout de code dans webpack.preRun.js qui viendra modifier cette ligne
  var timestamp = '' // ne pas modifier cette ligne, le timestamp sera mis à la copie dans build/, cf webpack.preRun.js
  var baseUrl = '' // ne pas modifier cette ligne
  var script = document.createElement('script')
  var src = baseUrl + 'display.'
  if ('noModule' in script) {
    // le navigateur gère les modules es6, pas sûr qu'il gère les imports dynamiques mais on en a pas
    // cf https://gist.github.com/ebidel/3201b36f59f26525eb606663f7b487d0
    // et https://stackoverflow.com/questions/60317251/how-to-feature-detect-whether-a-browser-supports-dynamic-es6-module-loading
    script.type = 'module'
    src += 'module'
  } else {
    script.type = 'application/javascript'
    src += 'es5'
  }
  src += '.js?' + timestamp

  // ça c'est dans tous les cas
  script.crossOrigin = 'anonymous'

  // apparemment c'est mieux de faire dans cet ordre pour une meilleure compatibilité avec tous les navigateurs
  document.body.appendChild(script)
  script.addEventListener('load', function onLoadIepLoadReal () {
    // la fct globale stdisplay est maintenant le vrai loader, mais on vérifie quand même
    if (window.stdisplay.isPreLoader) return next(Error('Le chargement tourne en boucle, impossible de continuer'))
    try {
      window.stdisplay(ressource, options, next)
    } catch (error) {
      console.error(error)
      next(Error('Une erreur est survenue au chargement'))
    }
  })
  script.src = src
}
// pour marquer notre préloader et vérifier qu'il a bien été écrasé par le display original
window.stdisplay.isPreLoader = true