Khi nào tôi nên sử dụng Yêu cầu () và khi nào nên sử dụng xác định ()?


316

Tôi đã chơi xung quanh với requestjs 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.

Xác định dường như cho phép tách mô-đun và cho phép tuân thủ thứ tự phụ thuộc. Nhưng nó tải xuống tất cả các tập tin 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 nó.

Hai cái này có thể được sử dụng cùng nhau không và chúng được sử dụng cho mục đích gì?

Câu trả lời:


331

Với việc definebạn đăng ký một mô-đun trong request.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 các câu lệnh. Với requirebạn "chỉ" tải / sử dụng một mô-đun hoặc tệp javascript có thể được tải bởi request.js. Ví dụ, hãy xem tài liệu

Quy tắc của tôi:

  • Xác định: Nếu bạn muốn khai báo một mô-đun, các phần khác trong ứ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 công cụ.


331

Từ mã nguồn allow.js (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.
 */

Các define()chức năng 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ố cần thiết (một phương pháp nhà máy).

Sự trở lại của phương thức xuất xưởng PHẢI trả lại việc triển khai cho mô-đun của bạn (giống như cách Mô-đun thực hiện).

Các require()chức năng không cần phải quay trở lại thi hành một mô-đun mới.

Sử dụng define()bạn đang hỏi một cái gì đó như "chạy hàm mà tôi đang truyền dưới dạng tham số và gán bất cứ thứ gì trả về ID mà tôi đang truyền nhưng trước đó, hãy kiểm tra xem các phụ thuộc này đã được tải chưa" .

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

Các require()chức năng là nơi bạn sử dụng các module xác định của bạn, để chắc chắn rằng các module được xác định, nhưng bạn không được xác định module mới có.


2
Có sự khác biệt nào về việc liệu yêu cầu được sử dụng trong mô-đun xác định hay 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ỉ đặt các yêu cầu trong định nghĩa mô-đun thay vì sử dụng yêu cầu?
Petri

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

2
@Petri, có vẻ như bạn đang thấy hành vi tải các mô-đun 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 xuất xưởng của mô-đun (chức năng được chuyển đến define()), cho đến khi có một require([])cuộc gọi đã yêu cầu hoặc điều gì đó phụ thuộc vào nó." github.com/jrburke/requirejs/wiki/ từ
alxndr

2

Phương thức "xác định" để tạo thuận lợi cho định nghĩa mô-đun và phương thức "yêu cầu" để xử lý tải phụ thuộc

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

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

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

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


2

Quy tắc chung:

  1. Bạn sử dụng xác định khi bạn muốn xác định một mô-đun sẽ được sử dụng lại

  2. Bạn sử dụng yêu cầu chỉ cần tải một phụ thuộc

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

Hy vọng điều này sẽ giúp bạn.


1

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

Nó rất đơn giản

Require (): Phương thức được sử dụng để chạy các chức năng ngay lập tức. xác định (): 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).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.