¿Cuándo debo usar require () y cuándo usar define ()?

316

He estado jugando con requirejs durante los últimos días. Estoy tratando de entender las diferencias entre definir y exigir.

Definir parece permitir la separación del módulo y permitir que se adhiera el orden de dependencia. Pero para empezar, descarga todos los archivos que necesita. Si bien requiere solo cargas de lo que necesita cuando lo necesita.

¿Se pueden usar estos dos juntos y para qué fines se debe usar cada uno de ellos?

skinnybrit51
fuente

Respuestas:

331

Con defineusted, registre un módulo en require.js del que luego puede depender en otras definiciones de módulos o requerir declaraciones. Con requireusted "simplemente" cargue / use un módulo o archivo javascript que se pueda cargar mediante require.js. Para ejemplos echa un vistazo a la documentación

Mi regla de oro:

  • Definir: si desea declarar un módulo, otras partes de su aplicación dependerán.

  • Requerir: si solo quieres cargar y usar cosas.

Wischan
fuente
331

Del código fuente require.js (línea 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()función acepta dos parámetros opcionales (una cadena que representa una ID de módulo y una matriz de módulos requeridos) y un parámetro requerido (un método de fábrica).

El retorno del método de fábrica DEBE devolver la implementación para su módulo (de la misma manera que lo hace el Patrón de Módulo ).

La require()función no tiene que devolver la implementación de un nuevo módulo.

Al define()usarlo, está preguntando algo como "ejecutar la función que estoy pasando como parámetro y asignar lo que sea que regrese a la ID que estoy pasando pero, antes, verifique que estas dependencias estén cargadas" .

Usando require()usted está diciendo algo como "la función que paso tiene las siguientes dependencias, verifique que estas dependencias estén cargadas antes de ejecutarlo" .

La require()función es donde utiliza sus módulos definidos, para asegurarse de que los módulos están definidos, pero no está definiendo nuevos módulos allí.

Robert
fuente
2
¿Hay alguna diferencia en cuanto a si require se usa dentro de un módulo definido o fuera de él? Si se usa dentro de un módulo, ¿por qué no solo establece los requisitos en la definición del módulo en lugar de usar require?
Petri
¿Por qué esta respuesta es tan diferente de lo que leo aquí requirejs.org/docs/api.html#deffunc ??
James Lin
2
@Petri, parece que estás viendo el comportamiento de RequireJS versión 2 de cargar módulos de forma asincrónica. "RequireJS 2.0 no ejecutará la función de fábrica del módulo (la función pasó a define()), hasta que haya habido una require([])llamada que lo haya solicitado o algo que dependa de él". github.com/jrburke/requirejs/wiki/…
alxndr
2

método "definir" para facilitar la definición del módulo y el método "requerir" para manejar la carga de dependencias

define se utiliza para definir módulos con o sin nombre en función de la propuesta utilizando la siguiente firma:

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

require, por otro lado, generalmente se usa para cargar código en un archivo JavaScript de nivel superior o dentro de un módulo si desea recuperar dependencias dinámicamente

Consulte https://addyosmani.com/writing-modular-js/ para obtener más información.

refactor
fuente
2

Reglas generales:

  1. Utilice definir cuando desee definir un módulo que se reutilizará

  2. Utiliza require para simplemente cargar una dependencia

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

Espero que esto te ayude.

Humayoun_Kabir
fuente
1

require () y define () ambos utilizados para cargar dependencias. Hay una gran diferencia entre estos dos métodos.

Sus chicos muy simples

Requerir (): El método se utiliza para ejecutar funcionalidades inmediatas. define (): El método se utiliza para definir módulos para su uso en múltiples ubicaciones (reutilización).

Baalu
fuente