2011-10-23 20 views
9

Tôi có kịch bản khởi tạo chính mà yêu cầu() và một trong các phụ thuộc là khung tiện ích, nhưng một số mô-đun khác mà tôi chỉ định thông qua yêu cầu () Bản thân họ cũng đã định nghĩa khuôn khổ này như một sự phụ thuộc.Làm thế nào để AMD (đặc biệt là RequireJs) xử lý các phụ thuộc trên nhiều mô-đun

Ví dụ (init.js):

require(['module-a', 'module-b', 'module-c'], function(a, b, c){ 
    // where module-c is the framework 
}); 

Và rồi trong 'mô-đun-một' Tôi có:

define(['module-c'], function(c){ 
    // utilize module-c framework 
}); 

Vì vậy, làm thế nào để AMD/RequireJs xử lý tình huống này, nó tải cùng một khuôn khổ hai lần?

Bất kỳ trợ giúp nào được đánh giá cao.

Trân trọng! Đánh dấu

Trả lời

6

Nó sẽ chỉ được nạp một lần, cả hai module trên sẽ nhận được giá trị mô-đun tương tự cho 'mô-đun-c'.

+0

Rất cám ơn bạn đã xác nhận! Đó là chính xác những gì tôi đã hy vọng sẽ xảy ra bởi vì trong tâm trí của tôi xác định sự phụ thuộc trong mỗi mô-đun có ý nghĩa hơn vì nó có nghĩa là tôi có thể lấy mô-đun đó và tái sử dụng nó ở nơi khác trong một dự án hoàn toàn khác. – Integralist

+1

Bên trong, bộ tải AMD theo dõi (ví dụ: bộ đệm) tất cả các mô-đun.Khi các mô-đun được tối ưu hóa/ghép nối với nhau, điều này không thú vị. Tuy nhiên, nếu bất kỳ mô đun nào được tải đúng lúc, điều quan trọng cần lưu ý là bộ tải AMD theo dõi các _requests_ sao cho hai yêu cầu gần như đồng thời không cố gắng tải xuống cùng một mô-đun nhiều lần. – unscriptable

2

Trong trường hợp của mình có ích cho người khác - Đây là một tình huống tôi đi qua nơi một mô-đun đã được nạp hai lần:

Đối với cơ cấu dự án sau:

~/prj/js/app/fileA.js 
~/prj/js/app/util/fileB.js 
~/prj/js/ext/publisher.js 

nơi RequireJs baseurl~/prj/js/app

fileA.js đề cập đến phụ thuộc bên ngoài (ext) publisher.js là:

//fileA: 
define(['../ext/publisher'], function(){}); 

Nhưng fileB.js đề cập đến dependancy cùng với một con đường khác nhau:

//fileB: 
define(['../../ext/publisher'], function(){}); 

Nói tóm lại, đối với cả hai tác phẩm, các đường dẫn phụ thuộc là khác nhau mặc dù dependancy là trong cùng một vị trí. Trong trường hợp này, publisher.js được tải hai lần. tab

Sử dụng Firebug của Net để xem nó tải hai lần:

dependency.js being loaded twice (firebug)

này được dễ dàng cố định sử dụng paths để cấu hình đường dẫn thư mục bên ngoài (như đã giải thích trong require_js docs):

requirejs.config({ 
    paths: {ext: '../ext'} 
}); 

Sau khi đặt paths, phụ thuộc chỉ được tải một lần với fileA.jsfileB.js cả hai đều sử dụng cùng một đường dẫn phụ thuộc như sau:

//fileA: 
define(['ext/publisher'], function(){}); 

//fileB: 
define(['ext/publisher'], function(){}); 
Các vấn đề liên quan