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

J'ai commencé à lire plusieurs tutoriels sur RequireJS. Dans aucun d'eux, le mot-clé "définir" m'a expliqué de manière satisfaisante. Quelqu'un pourrait-il m'aider avec ce qui suit:

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

Qu'est-ce que "définir"? Est-ce que 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 où je posais la question. Peut-être que je ne reconnaissais pas qu'il s'agissait d'un simple appel de fonction.

Define n'est pas spécifique à RequireJS, il fait partie de la spécification AMD . Burke notera que RequireJS ne met pas en œuvre exactement comment AMD le spécifie, car AMD n'a pas vraiment gardé les navigateurs à l'esprit.

define n'a pas de fonction anonyme. define est une méthode mise à la disposition des fichiers JavaScript basés sur AMD pour le chargement de leurs données. Les bibliothèques comme RequireJS le mettent à votre disposition. L'implémentation spécifique n'est probablement pas précieuse pour vous. Je vais donc passer en revue celui que vous avez fourni car c'est le moyen le plus courant de déclarer un module.

define( [array] , object );

Array est une liste de modules dont dépend ce module. Il existe une relation de 1 à 1 entre les modules et les fichiers. Vous ne pouvez pas avoir plusieurs modules dans un fichier ni plusieurs fichiers pour un module.

Objet est le module que vous définissez. Cela peut être n'importe quoi, une structure ou une fonction qui renvoie une structure. Lisez les documents 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 argument de définition. Il est également important de noter que lorsque vous passez une fonction en tant object , elle ne fonctionnera qu'une seule fois. Les méthodes ou les propriétés créées sur cette instanciation peuvent être accessibles à tout moment, mais peuvent être consultés par d'autres modules qui répertorient ce module en tant que dépendance.

Bonne chance, je recommande de jouer avec ça et de lire les documents quand les choses n'ont aucun sens. Les documents RequireJS sont géniaux comme un démarrage rapide de la façon dont les modules AMD fonctionnent.

J'ai trouvé la define définie au bas de require.js (moi aussi je me demandais quel genre de chose ce mot est define , et c'est 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]); }; 

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

Je pense que la spécification de l'API RequireJs le résume assez bien:

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

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