317 votes

Quand dois-je utiliser require() et quand utiliser define() ?

J'ai joué avec requirejs ces derniers jours. J'essaie de comprendre les différences entre define et require.

Define semble permettre la séparation des modules et l'adhésion à l'ordre des dépendances. Mais il télécharge tous les fichiers dont il a besoin pour commencer. Alors que require ne charge que ce dont vous avez besoin quand vous en avez besoin.

Peuvent-ils être utilisés ensemble et à quelles fins chacun d'eux doit-il être utilisé ?

333voto

wischan Points 1778

Con define vous enregistrez un module dans require.js dont vous pouvez ensuite dépendre dans d'autres définitions de modules ou déclarations require. Avec require vous chargez/utilisez "simplement" un module ou un fichier javascript qui peut être chargé par require.js. Pour des exemples, jetez un coup d'œil à la documentation

Ma règle d'or :

  • Définir : Si vous voulez déclarer un module dont d'autres parties de votre application dépendront.

  • Exigez : Si vous voulez juste charger et utiliser des trucs.

332voto

Robert Points 4974

Depuis le fichier require.js code source (ligne 1902) :

/**
 * 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.
 */

El define() accepte deux paramètres facultatifs (une chaîne de caractères représentant un ID de module et un tableau de modules requis) et un paramètre obligatoire (une méthode d'usine).

Le retour de la méthode de l'usine MUST renvoient l'implémentation de votre module (de la même manière que la fonction Modèle de module fait).

El require() ne doit pas retourner l'implémentation d'un nouveau module.

Utilisation de define() vous demandez quelque chose comme "exécuter la fonction que je passe en paramètre et assigner ce qui revient à l'ID que je passe mais, avant, vérifier que ces dépendances sont chargées" .

Utilisation de require() vous dites quelque chose comme "la fonction que je passe a les dépendances suivantes, vérifiez que ces dépendances sont chargées avant de l'exécuter" .

El require() est l'endroit où vous utilisez vos modules définis, afin d'être sûr que les modules sont définis, mais vous ne définissez pas de nouveaux modules à cet endroit.

2 votes

Y a-t-il une différence selon que require est utilisé à l'intérieur ou à l'extérieur d'un module défini ? S'il est utilisé à l'intérieur d'un module, pourquoi ne pas simplement définir les exigences dans la définition du module plutôt que d'utiliser require ?

0 votes

Pourquoi cette réponse est-elle si différente de ce que j'ai lu ici ? requirejs.org/docs/api.html#deffunc ? ?

2 votes

@Petri, il semble que vous voyez le comportement de la version 2 de RequireJS de charger les modules de manière asynchrone. "RequireJS 2.0 n'exécutera pas la fonction d'usine du module (la fonction passée à define() ), jusqu'à ce qu'il y ait un require([]) un appel qui l'a demandé, ou quelque chose qui en dépend." github.com/jrburke/requirejs/wiki/

4voto

staeppvargen Points 21

Une exception aux règles mentionnées - les tests avec karma / requirejs :

Je m'attendais à ce que les spécifications de test soient des sortes de documents de haut niveau exigeant des choses, donc j'ai utilisé "require" au lieu de "define". NE LE FAITES PAS ! :-)

Je ne sais pas combien d'heures j'ai passé à comprendre pourquoi require exécute d'abord les tests et ensuite - après - lit les spécifications, ce qui donne toujours "0 de 0 ERREUR"...

J'ai changé tous les "requires" en "define" et le monde est un endroit en morceaux avec tout ce qui va bien... grrr.

3voto

Humayoun_Kabir Points 537

Règles générales :

  1. Vous utilisez define lorsque vous voulez définir un module qui sera réutilisé.

  2. Vous utilisez require pour charger simplement une dépendance

    //sample1.js file : module definition 
    define(function() {
          var sample1 = {};
          //do your stuff
         return sample1;
     });
    
    //sample2.js file : module definition and also has a dependency on jQuery and sample1.js
    define(['jquery', 'sample1'], function($,sample1) {
        var sample2 = {
            getSample1:sample1.getSomeData();
        };
        var selectSomeElement = $('#someElementId');
        //do your stuff....
        return sample2;
    });
    
    //calling in any file (mainly in entry file)
    require(['sample2'], function(sample2) {
        // sample1 will be loaded also
    });

J'espère que cela vous aidera.

2voto

refactor Points 2473

Méthode "define" pour faciliter la définition de modules et la méthode "require" pour gérer le chargement des dépendances

define est utilisé pour définir des modules nommés ou non nommés basés sur la proposition en utilisant la signature suivante :

define(
module_id /*optional*/, 
[dependencies] /*optional*/, 
definition function /*function for instantiating the module or object*/
);

require, quant à lui, est généralement utilisé pour charger du code dans un fichier JavaScript de premier niveau ou dans un module si vous souhaitez récupérer dynamiquement les dépendances.

Se référer à https://addyosmani.com/writing-modular-js/ pour plus d'informations.

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