2012-02-29 52 views
294

Tôi đang chơi đùa với requirejs trong vài ngày qua. Tôi đang cố gắng để hiểu sự khác biệt giữa xác định và yêu cầu.Khi nào tôi nên sử dụng require() và khi nào nên sử dụng define()?

Xác định dường như cho phép tách mô-đun và cho phép tuân thủ yêu cầu phụ thuộc. Nhưng nó tải xuống tất cả các tệp cần thiết để bắt đầu. Trong khi yêu cầu chỉ tải những gì bạn cần khi bạn cần.

Hai thứ này có thể được sử dụng cùng nhau và cho mục đích sử dụng của từng mục đích?

Trả lời

314

Với define bạn đăng ký một mô-đun trong require.js mà sau đó bạn có thể phụ thuộc vào các định nghĩa mô-đun khác hoặc yêu cầu báo cáo. Với require bạn "chỉ" tải/sử dụng mô-đun hoặc tệp javascript có thể được tải bởi require.js. Đối với ví dụ có một cái nhìn tại documentation

Quy tắc của ngón tay cái:

  • Xác định: Nếu bạn muốn khai báo một mô-đun bộ phận khác của ứng dụng của bạn sẽ phụ thuộc vào.

  • Yêu cầu: Nếu bạn chỉ muốn tải và sử dụng nội dung.

319

Từ require.js source code (dòng 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. 
*/ 

Chức năng define() chấp nhận hai thông số tùy chọn (một chuỗi đại diện cho một ID mô-đun và một loạt các module bắt buộc) và một tham số bắt buộc (phương thức factory).

Trả lại phương thức nhà máy PHẢI trả về việc triển khai cho mô-đun của bạn (theo cùng cách mà Module Pattern thực hiện).

Chức năng require() không phải trả lại việc triển khai mô-đun mới.

Sử dụng define() bạn đang yêu cầu cái gì đó như "chạy chức năng mà tôi đang đi qua như một tham số và gán bất cứ điều gì trở lại ID mà tôi đang đi qua nhưng, trước đó, kiểm tra xem những phụ thuộc được nạp".

Sử dụng require() bạn đang nói cái gì đó như "chức năng mà tôi vượt qua có sự phụ thuộc sau, kiểm tra xem những phụ thuộc được nạp trước khi chạy nó".

Chức năng require() là nơi bạn sử dụng các mô-đun xác định, để đảm bảo rằng các mô-đun được xác định, nhưng bạn không xác định mô-đun mới tại đó.

+1

Có sự khác biệt nào về việc liệu yêu cầu có được sử dụng trong mô-đun xác định hoặc bên ngoài mô-đun không? Nếu nó được sử dụng bên trong một mô-đun, tại sao không chỉ thiết lập các yêu cầu trong định nghĩa mô-đun hơn là sử dụng yêu cầu? – Petri

+0

Tại sao câu trả lời này lại khác với những gì tôi đọc ở đây http://requirejs.org/docs/api.html#deffunc ?? –

+1

@Petri, có vẻ như bạn đang thấy hành vi tải phiên bản 2 của RequireJS không đồng bộ. "RequireJS 2.0 sẽ không thực thi chức năng nhà máy của mô-đun (hàm được chuyển đến' define() '), cho đến khi có một cuộc gọi' require ([]) 'đã yêu cầu nó, hoặc cái gì đó phụ thuộc vào nó." https://github.com/jrburke/requirejs/wiki/Upgrading-to-RequireJS-2.0#delayed – alxndr

1

"xác định" phương pháp để tạo điều kiện định nghĩa module và "đòi hỏi" phương pháp để xử lý phụ thuộc tải

xác định được sử dụng để xác định tên hoặc mô-đun giấu tên dựa trên đề nghị sử dụng chữ ký sau đây:

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

yêu cầu mặt khác thường được sử dụng để tải mã trong tệp JavaScript cấp cao nhất hoặc trong mô-đun nếu bạn muốn tìm nạp động các phụ thuộc

Tham khảo https://addyosmani.com/writing-modular-js/ để biết thêm thông tin.

1

yêu cầu() và define() đều được sử dụng để tải phụ thuộc. Có sự khác biệt lớn giữa hai phương pháp này.

nó Guys rất đơn giản

Yêu cầu(): Phương pháp được sử dụng để chạy các chức năng ngay lập tức. define(): Phương thức được sử dụng để xác định các mô-đun để sử dụng ở nhiều vị trí (tái sử dụng).

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