54 votes

Explication de la définition de la bibliothèque RequireJS

J'ai commencé à lire plusieurs tutoriels à propos de RequireJS. Dans aucun d'entre eux le "définir" mot-clé a été expliqué satisfaisante pour moi. Quelqu'un pourrait-il m'aider avec la ligne suivante:

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 est-ce autre chose? Quelqu'un peut-il me donner plus d'informations à propos de ce genre de définitions?

Ajout: Merci nnnnnn et pradeek pour vos réponses. Ici en Europe, il était de 2:30 dans la nuit, quand j'ai été poster la question. Peut-être que je n'ai donc pas reconnaître que c'était un simple appel de fonction.

63voto

Drew Points 2534

define n'est pas spécifique à RequireJS, c'est une partie de l' AMD spécification. Burke va noter que RequireJS ne pas mettre en œuvre exactement comment AMD précise, puisque AMD n'a pas vraiment de garder les navigateurs à l'esprit.

define n'ont pas une fonction anonyme en elle. define est une méthode disponible pour AMD fichiers JavaScript pour le chargement de leurs données. Les bibliothèques comme RequireJS de les rendre disponibles pour vous. La mise en œuvre spécifique n'est probablement pas utiles pour vous. Je vais donc aller au-delà de celle que vous avez fournie que c'est la façon la plus commune pour déclarer un module.

define( [array], object );

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

L'objet est le module de définition. Cela peut être n'importe quoi, une structure ou une fonction qui renvoie une structure. 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 listés comme des dépendances dans la première définir argument. Il est également important de noter que lorsque vous passez d'une fonction comme object, il ne fonctionnera qu'une seule fois. Les méthodes et les propriétés créé sur cette instanciation peut être consulté à tout moment, cependant, peuvent être consultés par les autres modules de la liste de ce module comme une dépendance.

Bonne chance, je vous recommande de jouer avec cela, et en lisant les docs quand les choses ne faites pas de sens. RequireJS docs sont grands comme un démarrage rapide sur la façon AMD modules de travail.

5voto

BlueMonkMN Points 10838

J'ai trouvé define défini au bas de require.js (je me demandais aussi quel genre de chose ce mot define était, et voici la réponse que je cherchais):

 /**
 * 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]);
};
 

1voto

vine'th Points 2279

J'ai trouvé cette page Pourquoi AMD? très utile. Pour résumer à partir de cette page, ADM spécification est utile à surmonter "écrire un tas de balises de script avec dépendances implicites que vous avez manuellement la commande" problème. Il est utile dans le chargement des dépendances avant d'exécuter les fonctions requises, semblable à de la import dans d'autres langages de programmation comme python. Aussi le module empêche l'espace de noms global problème de la pollution. Vérifiez "It is an improvement over the web's current "globals and script tags" because" section.

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