Kapan saya harus menggunakan require () dan kapan harus menggunakan define ()?

316

Saya telah bermain-main dengan needsejs selama beberapa hari terakhir. Saya mencoba memahami perbedaan antara define dan butuhkan.

Tentukan tampaknya memungkinkan untuk pemisahan modul dan memungkinkan pemesanan ketergantungan untuk mematuhi. Tapi itu mengunduh semua file yang harus dimulai. Sementara hanya memerlukan banyak apa yang Anda butuhkan saat Anda membutuhkannya.

Bisakah keduanya digunakan bersama dan untuk tujuan apa masing-masing digunakan?

skinnybrit51
sumber

Jawaban:

331

Dengan defineAnda mendaftarkan sebuah modul di membutuhkan.js yang kemudian dapat Anda andalkan dalam definisi modul lain atau memerlukan pernyataan. Dengan requireAnda "hanya" memuat / menggunakan modul atau file javascript yang dapat dimuat oleh require.js. Sebagai contoh, lihat dokumentasi

Aturan praktis saya:

  • Definisikan: Jika Anda ingin mendeklarasikan modul, bagian lain dari aplikasi Anda akan bergantung.

  • Membutuhkan: Jika Anda hanya ingin memuat dan menggunakan barang-barang.

wischan
sumber
331

Dari kode sumber require.js (baris 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.
 */

The define()Fungsi menerima dua parameter opsional (string yang mewakili ID modul dan berbagai modul yang diperlukan) dan satu diperlukan parameter (metode pabrik).

Kembalinya metode pabrik HARUS mengembalikan implementasi untuk modul Anda (dengan cara yang sama seperti Pola Modul ).

The require()fungsi tidak harus kembali pelaksanaan modul baru.

Menggunakan define()Anda meminta sesuatu seperti "jalankan fungsi yang saya lewat sebagai parameter dan tetapkan apa pun yang kembali ke ID yang saya lewati tetapi, sebelumnya, periksa apakah dependensi ini dimuat" .

Menggunakan require()Anda mengatakan sesuatu seperti "fungsi yang saya lewati memiliki dependensi berikut, periksa apakah dependensi ini dimuat sebelum menjalankannya" .

The require()Fungsi adalah di mana Anda menggunakan modul Anda didefinisikan, dalam rangka untuk memastikan bahwa modul didefinisikan, tetapi Anda tidak mendefinisikan modul baru di sana.

Robert
sumber
2
Apakah ada perbedaan apakah kebutuhan digunakan dalam modul yang ditentukan, atau di luarnya? Jika digunakan di dalam modul, mengapa tidak hanya menetapkan persyaratan dalam definisi modul daripada menggunakan memerlukan?
Petri
Mengapa jawaban ini sangat berbeda dengan apa yang saya baca di sini requireejs.org/docs/api.html#deffunc ??
James Lin
2
@Petri, sepertinya Anda melihat perilaku memuat modul versi 2 dari RequireJS secara tidak sinkron. "RequireJS 2.0 tidak akan menjalankan fungsi pabrik modul (fungsi diteruskan ke define()), sampai ada require([])panggilan yang memintanya, atau sesuatu yang bergantung padanya." github.com/jrburke/requirejs/wiki/…
alxndr
2

"define" metode untuk memfasilitasi definisi modul dan "memerlukan" metode untuk menangani pemuatan ketergantungan

define digunakan untuk mendefinisikan modul yang dinamai atau tidak disebutkan namanya berdasarkan proposal menggunakan tanda tangan berikut:

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

mengharuskan di sisi lain biasanya digunakan untuk memuat kode dalam file JavaScript tingkat atas atau dalam modul jika Anda ingin secara dinamis mengambil dependensi

Lihat https://addyosmani.com/writing-modular-js/ untuk informasi lebih lanjut.

refactor
sumber
2

Aturan umum:

  1. Anda menggunakan define ketika Anda ingin mendefinisikan modul yang akan digunakan kembali

  2. Anda menggunakan hanya perlu memuat ketergantungan

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

Semoga ini bisa membantu Anda.

Humayoun_Kabir
sumber
1

membutuhkan () dan define () keduanya digunakan untuk memuat dependensi. Ada perbedaan utama antara kedua metode ini.

Guys sangat sederhana

Require (): Metode digunakan untuk menjalankan fungsi langsung. define (): Metode digunakan untuk mendefinisikan modul untuk digunakan di banyak lokasi (digunakan kembali).

Baalu
sumber