Quando devo usar o require () e quando usar define ()?

316

Eu tenho brincado com requirejs nos últimos dias. Estou tentando entender as diferenças entre definir e exigir.

Definir parece permitir a separação do módulo e permitir que as ordens de dependência sejam aderidas. Mas ele baixa todos os arquivos necessários para começar. Embora exija apenas carrega o que você precisa quando precisa.

Esses dois podem ser usados ​​juntos e com que finalidades cada um deles deve ser usado?

skinnybrit51
fonte

Respostas:

331

Com defineo registro de um módulo no require.js, você pode confiar em outras definições de módulo ou exigir instruções. Com requirevocê "apenas" carregue / use um módulo ou arquivo javascript que pode ser carregado pelo require.js. Para exemplos, consulte a documentação

Minha regra de ouro:

  • Definir: Se você deseja declarar um módulo, outras partes do seu aplicativo dependerão.

  • Exigir: Se você deseja apenas carregar e usar coisas.

wischan
fonte
331

No código-fonte require.js (linha 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.
 */

A define()função aceita dois parâmetros opcionais (uma sequência que representa um ID do módulo e uma matriz de módulos necessários) e um parâmetro necessário (um método de fábrica).

O retorno do método de fábrica DEVE retornar a implementação do seu módulo (da mesma maneira que o Padrão do Módulo ).

A require()função não precisa retornar a implementação de um novo módulo.

Usando define()você está perguntando algo como "execute a função que eu estou passando como parâmetro e atribua os retornos ao ID que estou passando, mas antes verifique se essas dependências estão carregadas" .

Usando require()você está dizendo algo como "a função que eu passo tem as seguintes dependências, verifique se essas dependências foram carregadas antes de executá-la" .

A require()função é onde você usa seus módulos definidos, para garantir que os módulos estejam definidos, mas você não está definindo novos módulos lá.

Robert
fonte
2
Existe alguma diferença quanto à necessidade de o uso ser usado dentro de um módulo definido ou fora dele? Se for usado dentro de um módulo, por que não apenas definir os requisitos na definição do módulo, em vez de usar o exigir?
Petri
Por que essa resposta é tão diferente da que eu li aqui requirejs.org/docs/api.html#deffunc ??
James Lin
2
@Petri, parece que você está vendo o comportamento da versão 2 do RequireJS de carregar módulos de forma assíncrona. "O RequireJS 2.0 não executará a função de fábrica do módulo (a função passada para define()), até que haja uma require([])chamada que a solicite ou algo que dependa dela." github.com/jrburke/requirejs/wiki/…
alxndr
2

método "define" para facilitar a definição do módulo e método "requer" para lidar com o carregamento de dependência

define é usado para definir módulos nomeados ou não nomeados com base na proposta usando a seguinte assinatura:

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

O exigir, por outro lado, é normalmente usado para carregar o código em um arquivo JavaScript de nível superior ou dentro de um módulo, caso você deseje buscar dinamicamente dependências

Consulte https://addyosmani.com/writing-modular-js/ para obter mais informações.

refatorar
fonte
2

Regras gerais:

  1. Você usa define quando deseja definir um módulo que será reutilizado

  2. Você usa o exigir para simplesmente carregar uma dependência

    //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 isso ajude você.

Humayoun_Kabir
fonte
1

require () e define (), ambos usados ​​para carregar dependências. Há uma grande diferença entre esses dois métodos.

É muito simples

Require (): O método é usado para executar funcionalidades imediatas. define (): o método é usado para definir módulos para uso em vários locais (reutilização).

Baalu
fonte