Ne zaman request () ve ne zaman define () kullanılır?


316

Son birkaç gündür requirjs ile oynuyorum. Tanımla ve talep et arasındaki farkları anlamaya çalışıyorum.

Define, modül ayırmaya izin veriyor ve bağımlılık sıralamasına uyulmasına izin veriyor gibi görünüyor. Ancak başlaması gereken tüm dosyaları indirir. Gereksinim duyduğunuzda sadece ihtiyacınız olan yükleri gerektirir.

Bu ikisi birlikte kullanılabilir mi ve her biri hangi amaçlarla kullanılmalıdır?

Yanıtlar:


331

Sizinle birlikte definemodülün diğer modül tanımlarına bağımlı olabileceğiniz veya ifadeler gerektirebilecek bir modül kaydedin. İle require"sadece" yükü / require.js tarafından yüklenebilir bir modül veya javascript dosyasını kullanın. Örnekler için belgelere bir göz atın

Temel kuralım:

  • Tanımla: Bir modül bildirmek istiyorsanız, uygulamanızın diğer kısımları buna bağlı olacaktır.

  • Gerekli: Sadece bir şeyler yüklemek ve kullanmak istiyorsanız.


331

Requir.js kaynak kodundan (satır 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.
 */

define()İşlev iki isteğe bağlı parametreleri ve tek bir gerekli parametre (fabrika yöntemi) (bir modül kimliği ve gerekli modül dizilerini temsil eden string) kabul eder.

Fabrika yönteminin iadesi modülünüzün uygulamasını döndürmelidir ZORUNLU ( Modül Deseni ile aynı şekilde ).

require()Fonksiyon yeni bir modülün uygulanması dönmek zorunda değildir.

Kullanarak "parametre olarak geçirdiğim işlevi çalıştır ve geçirdiğim kimliğe geri dönen her şeyi atar, ancak daha önce bu bağımlılıkların yüklü olup olmadığını kontrol et"define() gibi bir şey soruyorsunuz .

Kullanımı require()gibi bir şey diyorsun "Ben geçmesi işlevi aşağıdaki bağımlılıklar vardır, bu bağımlılıklar çalıştırmadan önce yüklenmiş olup olmadığını kontrol" .

require()Eğer modüller tanımlandığından emin olmak için, tanımlı modülleri kullanmak nerede işlevidir, ama orada yeni modülleri tanımlayan değildir.


2
Gereksinim tanımlanmış bir modül içinde mi yoksa dışında mı kullanıldığına dair bir fark var mı? Bir modülün içinde kullanılıyorsa, neden sadece modül tanımında gereksinimleri kullanmak yerine gereksinimleri belirlemiyorsunuz?
Petri

Bu cevap neden burada okuduğumdan bu kadar farklı ki requirjs.org/docs/api.html#deffunc ??
James Lin

2
@Petri, RequireJS'nin modülleri eşzamansız olarak yükleme sürüm 2 davranışını gördüğünüz anlaşılıyor. "RequireJS 2.0 , istenen define()bir require([])çağrı veya ona bağlı bir şey olana kadar modülün fabrika işlevini (işlev aktarıldı ) yürütmez ." github.com/jrburke/requirejs/wiki/…
alxndr

2

modül tanımını kolaylaştırmak için "tanımla" yöntemi ve bağımlılık yüklemesi için "zorunlu" yöntemi

define, aşağıdaki imzayı kullanarak teklife göre adlandırılmış veya adlandırılmamış modülleri tanımlamak için kullanılır:

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

Diğer yandan, dinamik olarak bağımlılıkları almak istiyorsanız, genellikle üst düzey bir JavaScript dosyasına veya bir modül içine kod yüklemek için kullanılır.

Daha fazla bilgi için https://addyosmani.com/writing-modular-js/ adresine bakın .


2

Genel kurallar:

  1. Yeniden kullanılacak bir modülü tanımlamak istediğinizde define komutunu kullanırsınız

  2. Sadece bir bağımlılık yüklemek için kullanın

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

Umarım bu size yardımcı olur.


1

Bu iki yöntem arasında büyük bir fark vardır.

Çok Basit Adamlar

Require (): Yöntem, anlık işlevleri çalıştırmak için kullanılır. define (): Yöntem, birden çok konumda kullanılmak üzere modülleri tanımlamak için kullanılır (yeniden kullanım).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.