web-dev-qa-db-fra.com

Comment éviter de redéfinir les requirejs dans le plugin lorsqu'un autre plugin utilise également requirejs

Maintenant, voici un petit cornichon que j’ai encore résolu de manière satisfaisante.

J'ai créé un plugin Wordpress qui utilise requirejs pour charger des modules javascript. Tout va bien, jusqu'à ce que de temps en temps, les utilisateurs me signalent des erreurs très obscures. Il se trouve que, lorsque d’autres thèmes ou plugins ont eu l’idée brillante d’exiger requirejs, vous obtenez les fameux "modules de mappage anonymes define ()" (problème) [ http: //www.requirejs. org/docs/errors.html # mismatch] en raison de deux instances de requirejs elles-mêmes.

Y a-t-il un moyen de contourner cela?

1
kontur

Après de longues recherches, il semble y avoir un moyen.

Tout d’abord, cela implique d’utiliser l’optimiseur requirejs , c’est-à-dire la pré-compilation du module, éventuellement dans un seul fichier minifié.

Deuxièmement, dans les options de l'optimiseur , il existe une option namespace, qui préfixe essentiellement tout requiert , définir et module les appels, afin de ne plus interférer avec les autres requirejs présents sur le site.

Donc, appeler $ node r.js -o build.js avec le fichier build.js suivant:

({
    paths: {
        'modulename': 'path/to/modulefile',
        'modulename': 'path/to/modulefile',
        'modulename': 'path/to/modulefile',
        'requireLib': 'path/to/requirejs'
    },
    name: "js/main",
    out: "js/bundle.js",
    include: "requireLib",
    namespace: "mynamespace",
})

transformera le module défini dans js/main.js en js/bundle.js sous une forme minifiée et en incluant tous les modules required et tous les appels require() dans ce fichier minifié seront des appels mynamespace.require() dans le fichier de sortie.

L'option include est importante pour que l'optimiseur inclue en réalité requirejs dans le bundle. Il est également nécessaire de l'appeler autrement que "require" (c'est-à-dire "requireLib") afin que l'optimiseur ne se confonde pas en interne.

Enfin, ce fichier contient toutes les options disponibles de l’optimiseur build.js.

Il est insensé de penser que tout plugin ou auteur de thème utilisant requirejs devrait en être conscient , et en fait, je pense que la plupart des développeurs ne le sont pas avant d'avoir atteint cette incompatibilité avec un autre plugin. ou thème. C’est toutefois un moyen de s’assurer que requirejs ne posera pas de problèmes lorsqu’il est utilisé dans un projet Wordpress.

0
kontur

Vous pouvez jeter un coup d'œil aux scripts mis en file d'attente dans $ wp_scripts ($ wp_scripts-> registered), mais le nom peut être différent parfait.

En outre, votre plug-in peut être chargé avant l'autre plug-in et peut déclencher le problème sans que vous ayez le contrôle.

Peut-être rendre le chargement requirejs facultatif (mais activé) et dire aux gens qu’ils devraient essayer de désactiver le chargement s’ils rencontrent ce problème (la raison étant que les "autres" requirejs seront chargés et fonctionneront correctement). En outre, je voudrais obtenir une liste des plugins/thèmes avec lesquels vous avez ces problèmes, informer l'utilisateur de l'incompatibilité et lui demander s'il souhaite activer votre "mode de compatibilité" (c'est-à-dire ne pas charger les requirejs via votre plugin).

1
janh