2013-06-05 25 views
6

Tôi đang cố gắng để tìm ra phương pháp tốt nhất để thử nghiệm một định nghĩa module javascript sử dụng một nhà máy UMD, tương tự như sau: https://github.com/umdjs/umd/blob/master/returnExportsGlobal.jskiểm tra Grunt cho UMD

Tôi không muốn để kiểm tra các mô-đun riêng của mình, tôi muốn để kiểm tra xem mô-đun có được 'xuất/tạo' chính xác trong các môi trường khác nhau hay không:

  1. Nếu CommonJS (nút) là mô-đun được xuất chính xác không?
  2. Nếu AMD, nó có được xác định chính xác không?
  3. Nếu trình duyệt (không có requirejs), được tạo ra toàn cầu chính xác chưa?

Tôi muốn chạy các thử nghiệm này bằng cách sử dụng grunt và hoa nhài. Tôi có thể sử dụng grunt-contrib-jasmine để kiểm tra các điểm 2 và 3, nhưng không phải cho điểm 1.

Tôi đoán tôi có thể sử dụng hỗn hợp grunt-contrib-jasmine và grunt-jasmine-node để kiểm tra mô-đun chính xác định nghĩa (thực hiện cụ thể tôi vẫn cần phải tìm ra), nhưng nó cảm thấy rất lộn xộn.

Ở cấp độ cao, có ai biết về bất kỳ phương pháp hiện có nào để đạt được điều này mà không cần sử dụng nhiều plugin grunt không?

Trả lời

4

Cuối cùng, tôi quyết định đi với các tác vụ lai, sử dụng grunt-contrib-jasmine cho trình duyệt kiểm tra AMD toàn cầu và trình duyệt, và jasmine_node để kiểm tra CommonJS. Tôi chỉ có một thông số tệp hỗ trợ tất cả 3 kiểm tra loại mô-đun.

Dưới đây là cấu hình grunt của tôi:

grunt.initConfig({ 
    pkg: grunt.file.readJSON('package.json'), 
    jasmine: { 
    browserGlobal: { 
     src: ['src/Foo.js'], 
     options: { 
     specs: 'spec/**/*.spec.js' 
     } 
    }, 
    browserAMD: { 
     src: ['src/Foo.js'], 
     options: { 
     specs: 'spec/**/*.spec.js', 
     template: require('grunt-template-jasmine-requirejs') 
     } 
    } 
    }, 
    jasmine_node: { 
    specNameMatcher: 'spec', 
    projectRoot: 'spec/' 
    } 
}); 

file đặc tả hoa nhài của tôi bây giờ hỗ trợ UMD:

(function (root, factory) { 
    if (typeof module === 'object' && module.exports) { 
    // Node/CommonJS 
    factory(
     require('modulename') 
    ); 
    } else if (typeof define === 'function' && define.amd) { 
    // AMD 
    define([ 
     'modulename' 
    ], factory); 
    } else { 
    // Browser globals 
    factory(root.ModuleName); 
    } 
}(this, function factory(ModuleName) { 

// Tests here 
})); 

Và đây là nhà máy UMD Tôi đang sử dụng cho mô-đun của tôi:

(function (root, factory) { 
    if (typeof module === 'object' && module.exports) { 
    // Node/CommonJS 
    module.exports = factory(); 
    } else if (typeof define === 'function' && define.amd) { 
    // AMD. Register as an anonymous module. 
    define(factory); 
    } else { 
    // Browser globals 
    root.ModuleName = factory(); 
    } 
}(this, function factory() { 


    // public API 
    return { 
    foo: 'bar' 
    }; 
})); 
0

Bạn cũng có thể sử dụng uRequire và lưu tự của mình khỏi tất cả các bản mẫu UMD trong tất cả các mô-đun của bạn, trong khi sử dụng declarative features.

Bạn chỉ cần viết đơn giản AMD hoặc CommonJS đồng bằng module (hoặc một kết hợp của hai) và chuyển đổi sang UMD (hoặc một RJS tối ưu hóa combined.js chạy như nó vốn có trên nodejs, Web/AMD & Web/Script) với một đơn giản build step and config, hoặc trong CLI hoặc trong grunt.

UMD được sản xuất dựa trên các mẫu nổi tiếng như https://github.com/umdjs/umd/blob/master/returnExportsGlobal.js, với nhiều chỉnh sửa khác nhau, một trong số đó là bạn có thể declaratively export to window/global.

Sau đó, bạn có thể chuyển đổi các thông số AMD hoặc commonJS đơn giản thành UMD và/hoặc 'combined.js' và nhấn cả trong trình duyệt hoặc grunt-mocha. Xem uBerscore cho nhiều ví dụ tầm thường và nâng cao hơn.