web-dev-qa-db-fra.com

A quoi sert 'define' en JavaScript (en dehors de l'évidence)?

J'ai cherché haut et bas pour la documentation à ce sujet, mais je ne peux rien trouver nulle part.

J'utilise Aloha et je souhaite utiliser leur prototype de barre latérale pour créer une nouvelle barre latérale attachée à une autre fonctionnalité de plug-in.

Leur sidebar.js commence par ceci, mais je ne peux pas pour toute la vie me trouver une documentation qui explique ce que cela signifie.

define( [
    'aloha/core',
    'aloha/jquery',
    'aloha/selection'
], function (Aloha, jQuery, Selection, Plugin) {

Il continue ensuite dans cet emballage pour définir un tas de fonctions, donc vars et quelques proptotypes- que je peux à peu près comprendre….

Qu'est-ce que cela dit ou où puis-je trouver une explication?

157
David O'Sullivan

Je ne peux pas dire avec certitude sans avoir vu le script en entier, mais il s'agira probablement de la fonction define de RequireJS , en particulier du " définir avec dépendances "forme de cette fonction. Il est utilisé pour définir un "module":

Un module est différent d’un fichier de script traditionnel en ce qu’il définit un objet bien dimensionné qui évite de polluer l’espace de nom global. Il peut explicitement lister ses dépendances et obtenir un descripteur de ces dépendances sans avoir besoin de faire référence à des objets globaux, mais recevoir les dépendances en tant qu'arguments de la fonction qui définit le module.

Et la forme "définir avec dépendances" de define est décrite comme suit:

Si le module a des dépendances, le premier argument doit être un tableau de noms de dépendances et le second argument doit ê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 retourner un objet qui définit le module.

170
James Allardice

Il s’agit du modèle AMD pour l’écriture de modules. AMD signifie Asynchronous Module Definition (Définition de module asynchrone) lorsque vous avez besoin d’importer des modules async.

define(['module1', 'module2'], function(module1, module2) {
  console.log(module1.sayHi());
});

Définir prend un tableau de dépendances et une fois que toutes celles-ci sont chargées en arrière-plan (asynchrone) de manière non bloquante, define appelle le rappel qui accepte à son tour des arguments (dans ce cas les dépendances).

Une autre chose à noter est que chacun de ces modules doit également être défini avec le mot-clé "define". Ainsi, par exemple, module1 serait défini comme ci-dessous:

define([], function() {

  return {
    sayHi: function() {
      console.log('Hi Hi');
    },
  };
});

Cette façon d'écrire des modules (AMD) vous permet d'écrire avec la compatibilité de navigateur (pas de require () comme dans nodeJS) et vous pouvez également définir de nombreux formats, y compris des objets, JSON, etc.

N'oubliez pas qu'AMD a ses propres inconvénients. J'espère que ça aide quelqu'un.

2
TheeBen