Choisir un chargeur asynchrone JavaScript [fermé]

9

J'ai étudié divers chargeurs de ressources asynchrones et je ne sais pas encore lequel utiliser. Là où je travaille, nous avons des efforts de groupe disparates dont les modules de classe peuvent utiliser différentes versions de jQuery (etc.). En tant que tel, les dépendances imbriquées peuvent également différer. Je n'ai aucun contrôle sur cela, donc cela signifie que je dois charger dynamiquement des ressources qui peuvent utiliser des versions alternatives de la même bibliothèque.

À ce titre, voici mes exigences:

  1. Chargez les fichiers de ressources JavaScript et CSS de manière asynchrone.
  2. Gérez l'ordre des dépendances et les dépendances imbriquées entre les versions.
  3. Détectez si une ressource est déjà chargée.
  4. Doit permettre le chargement entre domaines (CDN)
  5. (facultatif) Permettez-nous de décharger une ressource.

J'ai regardé:

Je pourrais peut-être simuler ces exigences moi-même en chargeant des versions dans des variables correctement nommées et en utilisant un tableau pour suivre ce qui est déjà chargé ... mais (espérons-le) quelqu'un a déjà inventé cela.

Mes questions sont donc:

  • Lesquels utilisez-vous? Et pourquoi?
  • Y en a-t-il d'autres qui satisfont pleinement à mes exigences?
  • Avec quoi trouvez-vous le plus éloquent et le plus facile à utiliser? Et pourquoi?

MISE À JOUR:
Pour ceux qui sont intéressés, j'ai essayé toutes les bibliothèques AMD ci-dessus (et plus). Au final, je suis parti avec RequireJS . C'est juste plus propre et plus facile dans l'ensemble ... et je suis heureux de l'utiliser.

Prisonnier ZERO
la source
Pour JavaScript, je ne pense pas que # 5 soit même possible. Cela pourrait théoriquement être possible pour CSS, mais je ne suis pas sûr si des navigateurs le prennent en charge.
Mike Baranczak
@Mike Merci d'avoir commenté! Si le chargeur asynchrone a suivi et rempli les ressources à l'aide de variables d'objet ... c'est tout à fait possible.
Prisonnier ZERO
D'accord, mais le NOUVEAU constructeur dupliquera l'objet, donc si vous créez un nouveau de quelque chose que vous avez appelé, il existera toujours là. Pourquoi voudriez-vous le décharger de toute façon?
Incognito
@ user1525 Merci d'avoir commenté! Le déchargement des ressources économise de la mémoire. Je vais modifier ma question ci-dessus avec quelques réflexions sur votre commentaire (dans quelques minutes). Merci encore!
Prisonnier ZERO
jQuery a déjà une getScriptfonction pour l'injection de script.
zzzzBov

Réponses:

7

J'ai utilisé RequireJS sur des projets sérieux, et j'adore ça, mais ce n'est pas vraiment destiné à être un chargeur asynchrone. Il s'agit vraiment d'un système de modules. Le chargement asynchrone est fourni en service dans ce but. Il peut être poussé pour répondre à toutes vos exigences, mais ses services de chargement sont conçus pour charger des modules, pas des fichiers arbitraires.

Charger les fichiers de ressources JavaScript et CSS de manière asynchrone : Requirejs charge tous les modules dont vous avez besoin à l'aide de l'injection de balises de script, donc de manière asynchrone.

Gérer l'ordre des dépendances et les dépendances imbriquées entre les versions : c'est là que RequireJS brille. Les modules peuvent déclarer des dépendances sur d'autres modules, et l'ordre de chargement sera extrapolé à partir de cette déclaration de dépendance. Il existe également un plugin de commande, qui peut forcer la commande sur les dépendances.

Détecter si une ressource est déjà chargée : Requirejs ne chargera un module qu'une seule fois.

Doit permettre le chargement entre domaines (CDN) : c'est possible, mais nécessite une configuration; Vous pouvez définir une URL spécifique pour n'importe quel module, et cela remplacera l'emplacement par défaut, vous pouvez donc le définir sur un CDN.

RequireJS servira mieux si vous écrivez des modules en utilisant son format, et sera moins efficace si vous l'utilisez pour charger du javascript brut.

Il fournit également un processus de construction qui fusionnera vos modules en un seul fichier pour la production.

Sean McMillan
la source
3

En théorie, vous pouvez simplement conserver une liste de scripts déjà chargés et créer une fonction qui charge des scripts qui n'ont pas encore été chargés.

http://jsfiddle.net/BDG/Dhdu7/2/

Incognito
la source
2
Ou utilisez Curl / RequireJS, ils ont cela et plus de fonctionnalités. Et vous n'avez pas à l'entretenir vous-même;)
Raynos
Vous avez oublié de mentionner une structure claire et des inclusions non relatives.
Incognito
2

Si vous regardez RequireJS et que vous souhaitez dépendre des fichiers CSS, vous pouvez consulter le plugin CSSP RequireJS :

CSS avec remplissage. Ce projet implémente un plugin pour le projet RequireJS qui permet aux modules de lister les fichiers CSS en tant que dépendances. Cela permet à RequireJS d'attendre que des règles de style spécifiques soient connues pour être en vigueur avant de publier le module JavaScript à évaluer. Cela serait utile si, par exemple, si votre module JavaScript nécessitait que certaines règles CSS, définies dans un fichier séparé, soient appliquées au DOM avant de pouvoir être initialisées.

Pete O
la source