Quando dovrei usare request () e quando usare define ()?


316

Sono stato a giocare con requisjs negli ultimi giorni. Sto cercando di capire le differenze tra definisci e richiedi.

Definire sembra consentire la separazione dei moduli e consentire l'ordinamento delle dipendenze per aderire. Ma scarica tutti i file necessari per iniziare. Mentre richiede solo carichi ciò di cui hai bisogno quando ne hai bisogno.

Questi due possono essere usati insieme e per quali scopi ciascuno di essi dovrebbe essere usato?

Risposte:


331

Con la defineregistrazione di un modulo in request.js da cui è possibile dipendere in altre definizioni di modulo o richiedere istruzioni. Con requirete "basta" caricare / utilizzare un modulo o un file javascript che può essere caricato da require.js. Ad esempio, dai un'occhiata alla documentazione

La mia regola empirica:

  • Definire: se si desidera dichiarare un modulo, altre parti dell'applicazione dipenderanno.

  • Richiesto: se si desidera solo caricare e utilizzare materiale.


331

Dal codice sorgente request.js (riga 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 define()funzione accetta due parametri opzionali (una stringa che rappresenta un ID modulo e una matrice di moduli richiesti) e un parametro richiesto (un metodo di fabbrica).

Il ritorno del metodo di fabbrica DEVE restituire l'implementazione per il tuo modulo (allo stesso modo del Pattern Module ).

La require()funzione non deve restituire l'implementazione di un nuovo modulo.

Usando define()si chiede qualcosa del tipo "esegui la funzione che sto passando come parametro e assegna qualsiasi cosa ritorni all'ID che sto passando ma, prima, controlla che queste dipendenze siano caricate" .

Usando require()te stai dicendo qualcosa del tipo "la funzione che passo ha le seguenti dipendenze, controlla che queste dipendenze siano caricate prima di eseguirla" .

La require()funzione è dove usi i tuoi moduli definiti, per essere sicuro che i moduli siano definiti, ma non stai definendo nuovi moduli lì.


2
C'è qualche differenza nel fatto che si richieda che venga utilizzato all'interno di un modulo definito o al di fuori di esso? Se viene utilizzato all'interno di un modulo, perché non impostare semplicemente i requisiti nella definizione del modulo anziché utilizzarli?
Petri,

Perché questa risposta è così diversa da quella che ho letto qui richiedejs.org/docs/api.html#deffunc ??
James Lin,

2
@Petri, sembra che tu stia vedendo il comportamento della versione 2 di RequireJS nel caricare i moduli in modo asincrono. "RequireJS 2.0 non eseguirà la funzione di fabbrica del modulo (la funzione è passata a define()), fino a quando non c'è stata una require([])chiamata che lo ha richiesto o qualcosa che dipende da esso." github.com/jrburke/requirejs/wiki/…
alxndr

2

Metodo "define" per facilitare la definizione del modulo e metodo "request" per gestire il caricamento delle dipendenze

define è usato per definire moduli con o senza nome in base alla proposta usando la seguente firma:

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

richiedi d'altra parte è in genere utilizzato per caricare il codice in un file JavaScript di livello superiore o all'interno di un modulo se desideri recuperare le dipendenze in modo dinamico

Fare riferimento a https://addyosmani.com/writing-modular-js/ per ulteriori informazioni.


2

Regole generali:

  1. Utilizzare Definisci quando si desidera definire un modulo che verrà riutilizzato

  2. È necessario semplicemente caricare una dipendenza

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

Spero che questo ti aiuti.


1

richiedono () e define () entrambi usati per caricare le dipendenze. C'è una grande differenza tra questi due metodi.

È ragazzi molto semplici

Require (): il metodo viene utilizzato per eseguire funzionalità immediate. define (): il metodo viene utilizzato per definire i moduli da utilizzare in più posizioni (riutilizzo).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.