2012-07-09 28 views
8

tôi đã xác định một cấu hình RequireJs trong đó xác định đường dẫn và shims:RequireJs: Sử dụng tự động load-DEPS với shim

require.config({ 
    // define application bootstrap 
    deps: ["main"], 

    // define library shortcuts 
    paths: { 
     app: "app" 
     , jquery: "lib/jquery" 
     , underscore: "lib/underscore" 
     , backbone: "lib/backbone" 
     , bootstrap: "lib/bootstrap" 
    }, 

    // define library dependencies 
    shim: { 
     jquery: { 
      exports: "$" 
     }, 
     underscore: { 
      exports: "_" 
     }, 
     backbone: { 
      deps: ["underscore", "jquery"], 
      exports: "Backbone" 
     }, 
     bootstrap: { 
      deps: ['jquery'], 
      exports: "bootstrap" 
     }, 

     // main application 
     app: { 
      deps: ["backbone"], 
      exports: "App" 
     } 
    } 
}); 

Như bạn thấy người cuối cùng "shim" khai nên làm cho nó có thể truy cập xương sống (và nó DEPS) khi tôi tải Ứng dụng chính (tên miền).

Trên thực tế điều này không làm việc:

require(["app"], function($, _, Backbone, App){ 
    app.router = new Backbone.Router.extend({ 
     // routing and route actions 
    }); 
}); 

Điều gì làm cho tôi tự hỏi là trong "xương sống-boilderplate" -project, Backbone (và DEPS của nó) có sẵn theo cách này: https://github.com/tbranyen/backbone-boilerplate/blob/master/app/main.js

Thậm chí không phải xác định điều này trong hàm.

Vì vậy, tôi đang làm gì sai?

+2

cố gắng loại bỏ '$, _, Backbone' khỏi hàm' require', nơi bạn mở rộng bộ định tuyến. Tôi nghĩ rằng các shims làm việc để họ chỉ xuất khẩu các giá trị toàn cầu mà bạn không cần phải thêm vào bất kỳ cuộc gọi – jakee

+0

Hey, mà hoạt động tuyệt vời :) Tôi thậm chí có thể thả từ khóa "xương sống" trong deps-array của hàm xác định mặc dù điều này không hoạt động trong mọi mô-đun ... Bạn có tạo câu trả lời để tôi có thể đóng câu hỏi không? –

+0

Xong, vui vì tôi có thể giúp! – jakee

Trả lời

5

Xóa $, _, Backbone các đường kính từ require -chức năng mà bạn mở rộng Bộ định tuyến. Các shims xuất khẩu giá trị toàn cầu, do đó, không cần phải tham chiếu đến chúng trong các cuộc gọi require hoặc define giống như bạn thực hiện cho các phụ thuộc thông thường.

Chuyển chúng dưới dạng tham số gây rối với các biến toàn cục và rất có thể kết quả là chúng không được xác định.

+1

Độ chính xác: chuyển Backbone như một tham số ẩn định nghĩa toàn cầu, bạn có thể sử dụng 'window.Backbone' trực tiếp – nikoshr

11

Từ những gì tôi đã đọc, requirejs đi lập luận dựa trên những gì bạn chỉ định trong mảng ... Như vậy cuộc gọi của bạn sẽ trông như thế này:

require(["app"], function (App) { // less arguments 
}); 

Hoặc như thế này:

require(
    ["jquery", "underscore", "backbone", "app"], // more deps 
    function ($, _, Backbone, App) { 
    } 
); 
+0

Tôi đã bỏ phiếu cho bạn. Tôi không đồng ý với jakee về cái này. – Constantine

+0

Tôi đồng ý. phụ thuộc đóng gói là toàn bộ điểm của AMD. Bạn nên làm theo cách này –

+0

trong khi ở đây bạn có các biến được đóng gói, bạn không tuân thủ nguyên tắc khô. Giả sử tất cả 'ứng dụng' đột ngột có nhiều phụ thuộc hơn so với những gì bạn liệt kê ở đó. – Toskan

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