2013-06-28 29 views
49

Đối với các mô-đun, tôi không trả lại một đối tượng mà tôi đã sử dụng yêu cầu thay vì xác định. Ví dụ nói rằng tôi có jQuery Plugin sau (jquery.my-plugin.js):RequireJs - Xác định vs Yêu cầu

require(['jquery'], function($) { 
    $.fn.myPlugin = function(options) { 
     ... 
    }; 
}); 

Bây giờ nếu tôi nói như sau trong mô-đun khác:

require(['jquery', 'jquery.my-plugin'], function($) { 
    $('#element').myPlugin(); 
}); 

tôi đã tìm thấy này doesn' t làm việc vì myPlugin chưa được đăng ký. Tuy nhiên nếu tôi thay đổi yêu cầu để xác định trong mô-đun jquery.my-plugin của tôi thì nó hoạt động tốt.

Tôi đánh giá cao nếu ai đó có thể giải thích lý do tại sao tôi phải làm điều này. Tôi thích hiểu điều gì đó đầy đủ trước khi tôi tiếp tục và sử dụng nó. Cảm ơn

+2

thể trùng lặp của [khi sử dụng đòi hỏi và khi nào sử dụng xác định] (http://stackoverflow.com/questions/9507606/when-to-use-require-and-when-to-use-define) – Armand

Trả lời

90

Về cơ bản, khi bạn sử dụng require, bạn đang nói "tôi muốn điều này, nhưng tôi cũng muốn tất cả các phụ thuộc của nó". Vì vậy, trong ví dụ dưới đây, chúng tôi đang yêu cầu A, nhưng yêu cầu sẽ tìm kiếm tất cả các phụ thuộc và đảm bảo chúng được tải trước khi tiếp tục.

require(['a'], function(a) { 
    // b, c, d, e will be loaded 
}); 

// File A 
define(['b','c','d','e'], function() { 
    return this; 
}); 

Nguyên tắc chung của ngón tay cái là bạn sử dụng define khi bạn muốn xác định một mô-đun sẽ được tái sử dụng bởi ứng dụng của bạn và bạn sử dụng require chỉ đơn giản là tải một phụ thuộc.

+2

Tốt hơn nhiều so với tôi :) Sẽ loại bỏ mỏ. – oooyaya

+0

Cảm ơn nhưng tại sao tôi không thể sử dụng yêu cầu thay vì xác định cho Tệp A? Về cơ bản nó sẽ được làm cùng một câu nói File A yêu cầu b, c, d và e trước khi nó có thể thực thi. – nfplee

+51

Quy tắc chung của ngón tay cái là bạn sử dụng 'define' khi bạn muốn xác định một mô-đun sẽ được ứng dụng của bạn sử dụng lại và bạn sử dụng' require' để tải một phụ thuộc. –

2

Dưới đây là đoạn code mà nên bên jquery.my-plugin.jsđịnh nghĩa một module gọi là 'jquery.my-plugin' có thể được sử dụng như một phụ thuộc ở nơi khác.

define(['jquery'], function($) { //jquery is a dependency to the jquery.my-plugin module 
    $.fn.myPlugin = function(options) { //adds a function to the *global* jQuery object, $ (global since jQuery does not follow AMD) 
     ... 
    }; 
}); 

Dưới đây là một phần của mã nơi bạn muốn đính kèm chức năng plugin của bạn đến đối tượng jQuery toàn cầu và sau đó sử dụng nó ...

require(['jquery.my-plugin'], function() { // jquery.my-plugin is loaded which attaches the plugin to the global JQuery object as shown above, then this function fires 

    //the only reason $ is visible here is because it's global. If it was a module, you would need to include it as a dependency in the above require statement 
    $('#element').myPlugin(); //the $ refers to the global object that has the plugin attached 
}); 
+1

Tất cả đều tốt với tôi. Yeah đối tượng $ được định nghĩa trên toàn cầu vì vậy tôi đoán nó là tùy chọn có hay không bao gồm nó trong câu lệnh require.Bằng cách đó, bạn tránh các vấn đề tiềm ẩn với các thư viện xung đột và nó phù hợp với tuyên bố xác định ở trên. – nfplee

Các vấn đề liên quan