Question

J'ai commencé à lire plusieurs tutoriels sur RequireJS. En aucun d'entre eux était le mot-clé « définir » a expliqué de façon satisfaisante pour moi. Pourrait aider quelqu'un me avec ce qui suit:

define(
  ["Models/Person", "Utils/random", "jquery"], 
  function (Person, randomUtility, $) {..}
)  

Qu'est-ce que "définir"? Est de définir une fonction avec un tableau et une fonction anonyme à l'intérieur de celui-ci? Ou s'agit-il d'autre chose? Quelqu'un peut-il me donner plus d'informations sur ce genre de définitions?

Addition: Merci nnnnnn et pradeek pour vos réponses. Ici, en Europe, il était 2h30 dans la nuit quand je postais la question. Peut-être donc je ne reconnaissais pas qu'il était un simple appel de fonction.

Était-ce utile?

La solution

define est pas spécifique à RequireJS, il fait partie du AMD spécification . Burke constatera que RequireJS n'implémente pas exactement comment AMD précise, puisque AMD ne tient pas vraiment à l'esprit les navigateurs.

define ne possède pas une fonction anonyme en elle. define est une méthode disponible pour les fichiers JavaScript basés AMD pour charger leurs données. Les bibliothèques comme RequireJS font à votre disposition. La mise en œuvre spécifique est probablement pas utile pour vous. Je vais donc sur celui que vous avez fourni car il est la façon la plus commune de déclarer un module.

define( [array], object );

array est une liste de modules que ce module dépend. Il y a une relation 1 à 1 entre les modules et les fichiers. Vous ne pouvez pas avoir plusieurs modules dans un fichier, ni plusieurs fichiers pour un module.

Object est le module que vous définissez. Cela peut être quelque chose, une struct ou une fonction qui renvoie une struct. Lisez la documentation sur RequireJS pour plus de détails.

Si l'objet est une fonction, les arguments passés à la fonction sont les modules répertoriés comme dépendances dans le premier définir argument. Il est également important de noter que lorsque vous passez une fonction object, il n'exécuté qu'une seule fois. Les méthodes et les propriétés créées sur celui-ci instanciation peut être consulté à tout moment, cependant, peut ensuite être consulté par d'autres modules qui liste ce module en tant que dépendance.

Bonne chance, je vous conseille de jouer avec cela et lire les documents quand les choses ne font pas de sens. RequireJS docs sont grands comme un démarrage rapide sur la façon dont le travail modules AMD.

Autres conseils

J'ai trouvé define défini près du fond de require.js (moi aussi je me demandais quel genre de chose que ce mot est define, et ceci est la réponse I recherchait):

/**
 * The function that handles definitions of modules. Differs from
 * require() in that a string for the module should be the first argument,
 * and the function to execute after dependencies are loaded should
 * return a value to define the module corresponding to the first argument's
 * name.
 */
define = function (name, deps, callback) {
    var node, context;

    //Allow for anonymous modules
    if (typeof name !== 'string') {
        //Adjust args appropriately
        callback = deps;
        deps = name;
        name = null;
    }

    //This module may not have dependencies
    if (!isArray(deps)) {
        callback = deps;
        deps = null;
    }

    //If no name, and callback is a function, then figure out if it a
    //CommonJS thing with dependencies.
    if (!deps && isFunction(callback)) {
        deps = [];
        //Remove comments from the callback string,
        //look for require calls, and pull them into the dependencies,
        //but only if there are function args.
        if (callback.length) {
            callback
                .toString()
                .replace(commentRegExp, '')
                .replace(cjsRequireRegExp, function (match, dep) {
                    deps.push(dep);
                });

            //May be a CommonJS thing even without require calls, but still
            //could use exports, and module. Avoid doing exports and module
            //work though if it just needs require.
            //REQUIRES the function to expect the CommonJS variables in the
            //order listed below.
            deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps);
        }
    }

    //If in IE 6-8 and hit an anonymous define() call, do the interactive
    //work.
    if (useInteractive) {
        node = currentlyAddingScript || getInteractiveScript();
        if (node) {
            if (!name) {
                name = node.getAttribute('data-requiremodule');
            }
            context = contexts[node.getAttribute('data-requirecontext')];
        }
    }

    //Always save off evaluating the def call until the script onload handler.
    //This allows multiple modules to be in a file without prematurely
    //tracing dependencies, and allows for anonymous module support,
    //where the module name is not known until the script onload event
    //occurs. If no context, use the global queue, and get it processed
    //in the onscript load callback.
    (context ? context.defQueue : globalDefQueue).push([name, deps, callback]);
};

Je trouve cette page Pourquoi AMD? très utile. Pour résumer cette page, la spécification AMD est utile pour surmonter problème « écrire un tas de balises de script avec dépendances implicites que vous avez à l'ordre manuellement ». Il est utile pour le chargement des dépendances avant d'exécuter les fonctions requises, similaires à import dans d'autres langages de programmation comme python. AMD empêche également le problème mondial de la pollution de l'espace de noms. Consultez la section "It is an improvement over the web's current "globals and script tags" because".

Je pense que les sommes RequireJs API spécification il assez bien:

Si le module a des dépendances, le premier argument doit être un tableau de noms de dépendance, et le second argument doit être une fonction de définition. La fonction sera appelée à définir le module une fois toutes les dépendances ont chargé. La fonction doit renvoyer un objet qui définit le module.

Ils énumèrent des exemples de toutes les différentes formes syntaxiques des defines.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top