Charger des scripts externes avec requirejs sans accès à la config
Je suis en train de charger les tables de données de la bibliothèque javascript dans un plugin que je suis en train d'écrire. Le problème est que je reçois un conflit, lorsque je charge la ressource externe, parce que les tables de données est en conflit avec quelque chose quand je l'appelle l'exigent.
<!-- DataTables -->
<script type="text/javascript" charset="utf8" src="//cdnjs.cloudflare.com/ajax/libs/datatables/1.9.4/jquery.dataTables.min.js"></script>
...
<script type="text/javascript">
require(['forum/admin/footer']); <-- crashes here, line 281
</script>
Voici le message d'erreur:
Uncaught Error: Mismatched anonymous define() module: function (h){var j=function(e){function o(a,b){var c=j.defaults.columns,d=a.aoColumns.length,c=h.extend({},j.models.oColumn,c,{sSortingClass:a.oClasses.sSortable,sSortingClassJUI:a.oClasses.sSor...<omitted>...ch require.js:8
B require.js:8
M require.js:15
d require.js:26
requirejs require.js:31
(anonymous function) (index):281
Puisque c'est un plugin, j'ai restrictions je suis en train de contourner, comme de ne pas être en mesure d'appeler l'exigent.config() au début de spécifier les chemins d'accès pour les ressources. J'ai vu quelqu'un utiliser le define
appel comme
define('resource', ['http://cdn.ajax.blah']);
dans ce blog
mais il ne regarde pas comme il peut être utilisé de cette façon, puisque chaque autre exemple a une fonction comme un 2ème paramètre.
OriginalL'auteur BrDaHa | 2014-02-07
Vous devez vous connecter pour publier un commentaire.
La méthode utilisée dans la question ne fonctionne pas parce que les tables de données est AMD. S'il détecte qu'il y a un AMD style loader (qui RequireJS de l'est), alors il définit lui-même comme un module. Cependant, il est invalide pour AMD modules à charger avec
<script>
, d'où le message d'erreur.Le module dans
forum/admin/footer
devraient être définies de manière à exiger que les tables de données:(Il n'y a pas besoin d'un paramètre correspondant pour les tables de données du module car il est un plugin jQuery.)
Quelques remarques supplémentaires concernant la question plus large de l'intégration de ce plugin sur un site qui a déjà configuré RequireJS:
require.config
pourrait être appelée plusieurs fois pour ajouter une configuration. Cependant, cela peut être considéré comme inacceptable si aucune coordination est prévue entre le plugin et le code principal.RequireJS a une notion de contexte. La documentation en parle pour le chargement de plusieurs versions, mais peut-être il peut être fructueusement adaptée pour permettre à un plugin de configuration spécifiques.
JQuery est chargé plus d'une fois? Le type d'installation dont vous parlez est celui dans lequel le risque que cela se produise est élevé. Par exemple, si le code principal de charges jQuery et le rend accessible que l'
"jquery"
module et votre plugin aussi charges de jQuery, mais les charges à partir d'un CDN puis les tables de données du plugin installer lui-même sur le jQuery, module chargé par le code principal, et non pas celui chargé par le plugin.Je vais creuser pour voir pourquoi ceux-ci sont tous chargés. J'ai effectivement joué un peu avec elle de plus en plus et il a obtenu de travailler, mais seriez-vous capable de me dire pourquoi cela fonctionne: jsfiddle.net/zMqZ3/7 et ce n'est pas le cas: jsfiddle.net/zMqZ3/5
Celui qui fonctionne fonctionne assez bien dû à la chance. RequireJS est chargé, jQuery est chargé et il détecte que RequireJS est déjà là, donc il appelle
define
, etc. Le second ne fonctionne pas parce que les gens de chez DataTables a décidé que la version 1.10-dev appeldefine("datatables", ...)
. Ma réponse a été rédigée selon la dernière version, qui ne fait pas cela. Le résultat est que, à partir de 1.10, vous devez demander DataTables par le nom"datatables"
et définir un chemin d'accès pour trouver le fichier. Les versions précédentes n'ont pas besoin de cela.OriginalL'auteur Louis
Avez-vous seulement essayé un simple:
Il fonctionne pour les fichiers locaux sans l'ombre d'un doute.
OriginalL'auteur PeteAUK