web-dev-qa-db-fra.com

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

Je m'amuse avec requirejs depuis quelques jours. J'essaie de comprendre les différences entre définir et exiger.

Définir semble permettre la séparation des modules et le respect de l'ordre des dépendances. Mais il télécharge tous les fichiers nécessaires. Tandis que n'exigent que des charges ce dont vous avez besoin quand vous en avez besoin.

Ces deux éléments peuvent-ils être utilisés ensemble et à quelles fins chacun d’entre eux devrait-il être utilisé?

309
skinnybrit51

Avec define, vous enregistrez un module dans require.js sur lequel vous pouvez ensuite compter dans d'autres définitions de module ou instructions require. Avec require vous ne faites que "charger"/utiliser un module ou un fichier javascript qui peut être chargé par require.js. Pour des exemples, jetez un œil à la documentation

Ma règle de base:

  • Définir: Si vous souhaitez déclarer un module, d'autres éléments de votre application dépendront.

  • Exigez: si vous voulez juste charger et utiliser des choses.

324
wischan

A partir du 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.
 */

La fonction define() accepte deux paramètres facultatifs (une chaîne représentant un ID de module et un tableau de modules requis) et un paramètre requis (une méthode de fabrication).

Le retour de la méthode factory MUST renvoie l'implémentation de votre module (de la même manière que le Module Pattern ).

La fonction require() n'a pas à renvoyer l'implémentation d'un nouveau module.

En utilisant define() vous demandez quelque chose comme "lancez la fonction que je suis en train de passer en tant que paramètre et affectez tout retour à l'ID que je suis en train de passer mais vérifiez avant les dépendances sont chargées ".

En utilisant 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 les exécuter" .

La fonction require() vous permet d'utiliser vos modules définis afin de vous assurer qu'ils sont bien définis, mais vous ne définissez pas de nouveaux modules à cet endroit.

327
Robert

Méthode "define" pour faciliter la définition de module et méthode "require" pour gérer le chargement de dépendance

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

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

require, en revanche, est généralement utilisé pour charger du code dans un fichier JavaScript de niveau supérieur ou dans un module si vous souhaitez extraire dynamiquement des dépendances

Reportez-vous à https://addyosmani.com/writing-modular-js/ pour plus d'informations.

2
refactor

require () et define () sont tous deux utilisés pour charger des dépendances. Il existe une différence majeure entre ces deux méthodes.

C'est très simple

Require (): Method est utilisé pour exécuter des fonctionnalités immédiates. define (): La méthode permet de définir des modules à utiliser dans plusieurs emplacements (réutilisation).

1
Baalu

Règles générales:

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

  2. Vous utilisez besoin de simplement charger 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 aide.

0
Humayoun_Kabir