143 votes

Module define() anonyme mal adapté

J'obtiens cette erreur lorsque je navigue dans mon webapp pour la première fois (généralement dans un navigateur dont le cache est désactivé).

Erreur : Module define() anonyme mal adapté : function (require) {

HTML :

<html>
   .
   .
   .
   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
   <script> var require = { urlArgs: "v=0.4.1.32" }; </script>
   <script data-main="assets/js/main" src="assets/js/libs/require.js"></script>
   <script src="assets/js/ace/ace.js?v=0.4.1.32"></script>
   </body>
</html>

JS :

$(function () {
    define(function (require) {
        // do something
    });
});

Quelqu'un sait-il exactement ce que signifie cette erreur et pourquoi elle se produit ?

fichier source , a courte discussion sur la page des problèmes de github

150voto

B T Points 4868

Comme AlienWebguy l'a dit, selon les docs, require.js peut exploser si

  • Vous avez une définition anonyme (" modules qui appellent define() sans chaîne d'identification ") dans sa propre balise script (je suppose qu'en fait ils veulent dire n'importe où dans la portée globale)
  • Vous avez des modules qui ont des noms contradictoires
  • Vous utilisez des plugins de chargement ou des modules anonymes mais n'utilisez pas l'optimiseur de require.js pour les regrouper.

J'ai eu ce problème en incluant des paquets construits avec browserify à côté de modules require.js. La solution était soit de :

A. charger les paquets autonomes non-require.js dans les balises script. avant require.js est chargé, ou

B. les charger en utilisant require.js (au lieu d'une balise script)

17voto

P.Brian.Mackey Points 12892

En commençant à utiliser require.js, je me suis heurté à ce problème et, en tant que débutant, j'ai trouvé que la méthode docs pourrait aussi bien être écrit en grec.

Le problème que j'ai rencontré est que la plupart des exemples pour débutants utilisent des "définitions anonymes" alors qu'il faudrait utiliser un "id de chaîne".

l'anonyme définit

define(function() {
        return { helloWorld: function() { console.log('hello world!') } };
 })

define(function() {
        return { helloWorld2: function() { console.log('hello world again!') } };
 })

définir avec la chaîne id

define('moduleOne',function() {
    return { helloWorld: function() { console.log('hello world!') } };
})

 define('moduleTwo', function() {
      return { helloWorld2: function() { console.log('hello world again!') } };
})

Lorsque vous utilisez définir avec une chaîne de caractères id alors vous éviterez cette erreur lorsque vous essayerez d'utiliser les modules comme ceci :

require([ "moduleOne", "moduleTwo" ], function(moduleOne, moduleTwo) {
    moduleOne.helloWorld();
    moduleTwo.helloWorld2();
});

15voto

eloone Points 754

J'ai eu cette erreur parce que j'ai inclus le fichier requirejs avec d'autres librairies incluses directement dans une balise script. Ces librairies (comme lodash) utilisaient une fonction define qui entrait en conflit avec la define de require. Le fichier requirejs se chargeait de manière asynchrone donc je soupçonne que la define de require a été définie après la define des autres librairies, d'où le conflit.

Pour vous débarrasser de cette erreur, incluez tous vos autres fichiers js en utilisant requirejs.

12voto

AlienWebguy Points 42370

Par le docs :

Si vous codez manuellement une balise script dans le HTML pour charger un script avec un appel anonyme define(), cette erreur peut se produire.

On le voit aussi si on code manuellement une balise script en HTML pour charger un script qui a quelques modules nommés, mais ensuite vous essayez de charger un module anonyme qui finit par avoir le même nom que l'un des modules nommés dans le script chargé par la balise script codée manuellement.

Enfin, si vous utilisez le chargeur ou des modules anonymes (modules qui appellent define() sans ID de chaîne) mais que vous n'utilisez pas l'optimiseur RequireJS pour combiner les fichiers. sans ID de chaîne) mais n'utilisez pas l'optimiseur RequireJS pour combiner les fichiers ensemble, cette erreur peut se produire. L'optimiseur sait comment nommer correctement les modules anonymes correctement afin qu'ils puissent être combinés avec d'autres modules dans un fichier optimisé. modules dans un fichier optimisé.

Pour éviter l'erreur :

  • Veillez à charger tous les scripts qui appellent define() via l'API RequireJS. Ne codez pas manuellement les balises scripts en HTML pour charger les scripts qui contiennent des appels define(). des appels define().

  • Si vous codez manuellement un tag HTML script, soyez s'assurer qu'elle n'inclut que des modules nommés, et qu'un module anonyme qui aura le même nom que l'un des modules de ce fichier n'est pas chargé.

  • Si le problème vient de l'utilisation de plugins de chargeur ou d'anonymes anonymes, mais que l'optimiseur RequireJS n'est pas utilisé pour le regroupement de fichiers, utiliser l'optimiseur RequireJS.

8voto

jcbdrn Points 505

Les réponses existantes expliquent bien le problème, mais si l'inclusion de vos fichiers script en utilisant ou avant requireJS n'est pas une option facile en raison de l'héritage du code, une solution de contournement légèrement hacky est de supprimer require de la portée de la fenêtre avant votre balise script, puis de le réintégrer après. Dans notre projet, ceci est enveloppé derrière un appel de fonction côté serveur mais effectivement le navigateur voit ce qui suit :

    <script>
        window.__define = window.define;
        window.__require = window.require;
        window.define = undefined;
        window.require = undefined;
    </script>
    <script src="your-script-file.js"></script>        
    <script>
        window.define = window.__define;
        window.require = window.__require;
        window.__define = undefined;
        window.__require = undefined;
    </script>

Ce n'est pas ce qu'il y a de plus beau, mais cela semble fonctionner et cela a permis d'éviter de nombreuses réfractions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X