2012-01-11 23 views
5

Tôi đang nâng cấp một dự án từ Dojo 1.6.1 bằng AMD và RequireJS lên Dojo 1.7.1 bằng bộ nạp AMD mới của nó. Tôi phải đối phó với các tệp JavaScript cũ, không được viết dưới dạng mô-đun AMD và phải tải chúng theo đúng thứ tự.Plugin OrderJS yêu cầu và Dojo 1.7.1

Trước khi tôi sử dụng plugin OrderJS, nhưng nó dường như không hoạt động với Dojo AMD Loader. Tôi không thể tìm thấy bất kỳ điều gì về nó trong tài liệu trình tải hoặc tài liệu về Hệ thống Xây dựng Dojo.

Bất kỳ suy nghĩ nào về điều này? Nếu không có plugin đơn đặt hàng, tôi nên xử lý các tệp JavaScript đơn giản cùng với Dojo 1.7 như thế nào? Tôi có cần phải xử lý chúng một cách riêng biệt, hoặc có chức năng cho điều này trong bộ nạp hoặc xây dựng hệ thống?

+0

Bạn đang nói về các tập tin mô-đun-less hay phong cách cũ module đồng bộ? – hugomg

+0

Chỉ các tệp JavaScript bình thường, như jQuery (không được sử dụng làm mô-đun AMD), được viết theo bất kỳ kiểu nào có thể. –

Trả lời

4

Tôi chỉ tìm hiểu về bản thân mình, nhưng các tài liệu tôi thấy đề cập đến Generic Script Injection

Tải kịch bản chung của bạn như được mô tả trong các tài liệu, trong khi quy định cụ thể {async: 0} như một tùy chọn cấu hình cho yêu cầu() . Này, để hiểu biết của tôi, không load các kịch bản theo thứ tự mà bạn chỉ định trong tham số thứ hai (mảng chứa tên tập tin kịch bản/đường dẫn)

dụ của tôi:

require({async:0},['test1.js','test2.js','test3.js'],function(){ 
    //do stuff with reference to loaded scripts 

}); 

kiểm tra địa phương của tôi hiển thị nếu Tôi thay đổi cấu hình thành {async: 1} các tập lệnh tải theo thứ tự khác với thứ tôi đã chỉ định. Cho đến nay tôi đã không theo dõi điều này xuống trong mã bộ tải dojo, nhưng nó có vẻ có ý nghĩa, và làm việc, và không phải là một hack.

+0

Tôi chấp nhận câu trả lời này, bởi vì nó hoạt động! Tôi đã tạo ra một "module phụ thuộc" theo cách này: 'define ([" require "], function (require) {require ({async: 0}, [" script1.js "," script2.js "," script3.js " ]);}); '. Tôi nghĩ rằng đó là một giải pháp ok. Cảm ơn! Tuy nhiên, –

+0

Một báo trước. Tôi đã không điều tra thêm, nhưng có vẻ như (ít nhất là khi bạn tải các tập lệnh trong một mô-đun riêng biệt như đã đề cập ở trên), các tập lệnh được tải trong một phạm vi khác so với khi được tải thông qua thẻ tập lệnh thông thường. Ví dụ, tôi đã phải thay thế 'var uglyGlobal = true' bằng' window.uglyGlobal = true'. –

+0

Phương pháp chèn kịch bản lệnh cho '{async: 1}' config tải các tập lệnh bằng cách sử dụng thẻ '

2

Tôi không nghĩ plugin thường tương thích trên các bộ tải AMD. Nó không phải là tối ưu, nhưng bạn có thể sử dụng dojo/text! với một eval. Điều đó sẽ nội tuyến nội dung tại thời gian xây dựng.

+0

Bạn có ý như thế này không? 'define ([" văn bản! myScript "," văn bản! myScript2 "], hàm (s, s2) {eval (s); eval (s2)})' –

+0

Nó hoạt động, và tôi đang sử dụng nó trong một thử nghiệm doh , nhưng tôi không muốn đánh dấu nó là câu trả lời được chấp nhận, đó là một hack =) –

3

Tôi muốn đề xuất phương pháp tiếp cận khác cho mô-đun phụ thuộc như được đề cập trong các nhận xét ở trên. Vấn đề là define không chấp nhận tham số async. Sử dụng đơn giản require bên trong hàm define giới thiệu một điều kiện chủng tộc vì mã của các mô-đun bắt buộc chưa được thực thi.

Ví dụ (WRONG):
oldCode.js

 
window.foo = function(){}; 

legacyWrapper.js

 
define(["require"],function(require){ 
    require({async:0},["./oldCode"]); 
}) 

code.js

 
define(["./legacyWrapper"],function(){ 
    window.foo(); //throws exception, foo has not been loaded yet. 
}) 

(jsFiddle demo)

Tuy nhiên, có một giải pháp cho vấn đề này. Bạn cần trả lại Deferred để được giải quyết ngay khi tất cả các mô-đun được tải. Ví dụ sau tải a, b, c, d theo thứ tự.

 
define(["require","dojo/Deferred"],function(require,Deferred){ 
    var def = new Deferred(); 
    require({async:0}, 
      ["./moduleA", 
      "./moduleB", 
      "./moduleC", 
      "./moduleD"], 
      function(){ 
     def.resolve(); 
    }); 
    return def; 
}) 

Để tính truy cập quy định tại moduleA, bây giờ bạn có thể sử dụng

 
require(["legacyDeps"],function(legacyDeps){ 
    legacyDeps.then(function(){ 
     //It's save to assume that all legacy modules have been loaded here. 
    }); 
}); 
Các vấn đề liên quan