2015-01-18 31 views
5

Açık kaynak dağıtımı için tasarlanan ilk AngularJS modülümü oluşturuyorum. Başkalarının tüketmesi kolay bir şekilde paketlemek isterim. Angularjs kendi iç modül sistemi vardır çünkü kayıt,UMD'yi ihracat olmaksızın kullanmak, bir bağımlılığı basitleştirmek için makul midir?

(function (root, factory) { 
    if (typeof define === 'function' && define.amd) { 
    define(['b'], factory); // AMD 
    } else if (typeof exports === 'object') { 
    module.exports = factory(require('b')); // Node 
    } else { 
    root.returnExports = factory(root.b); // browser global (root is window) 
    } 
}(this, function (b) { 
    // use b in some fashion 
    return {}; // return a value to define the module export 
})); 

Ancak:

UMD projesi AMD, CommonJS (veya en azından Düğüm) ve tarayıcı globalsin uyumlu JavaScript modüllerinin ihraç için pattern sağlar Bir modül, angular nesnesinde, yani angular.module()'da bir yöntemi çağırmak suretiyle yapılır. Böylece, bir UMD modülünün herhangi bir şeyi ihraç etmesi gerekmeyecek; Sadece angular numaralı telefona gereksinim duymanız ve işlem yapmanız gerekir.

(function (root, factory) { 
    if (typeof define === 'function' && define.amd) { 
    factory(require(['angular'])); // AMD 
    } else if (typeof exports === 'object') { 
    factory(require('angular')); // Node 
    } else { 
    factory(root.angular); // browser global (root is window) 
    } 
}(this, function (angular) { 
    angular.module(...); 
})); 

bu kadar büyük mi, yoksa ruhuna aykırıdır vermez: Benim durumumda özgü

(function (root, factory) { 
    if (typeof define === 'function' && define.amd) { 
    factory(require(['b'])); // AMD 
    } else if (typeof exports === 'object') { 
    factory(require('b')); // Node 
    } else { 
    factory(root.b); // browser global (root is window) 
    } 
}(this, function (b) { 
    // use b in some fashion 
})); 

Veya: Önceki örnekte açısından, ben şuna benzer düşünüyorum UMD? Soruyorum çünkü hiçbir şey vermeyen herhangi bir UMD modeli bulamadım.

cevap

1

Köşeli bir eklenti olarak, bunun yerine üreticiyi ihraç eden bir modül sunmak daha iyi olabilir, böylece insanlar "ne açısal araçlardan" sorumlu kalırlar. Örneğin, özelleştirilmiş bir hata ayıklama sürümünü köşeli olarak kullanıyorum, ancak kodunuzu kullanmak istiyorum derim: Şu an yapamıyorum, çünkü benim için açısallık gerektirmeye karar verdiniz. Ben, geliştirici olarak, kodunuz olacağı benim açısal kullanarak biliyorum, yerine şimdi köşeli iki farklı versiyonunu yüklenmiş bulunan

Şimdi
var myangular = require('debug-angular/ext/symbolised'); 
var yourmodule = require('yourmodule'); 
yourmodule.register(myangular); 

ile: O değil gerçekten büyük bir fikir gibi görünüyor, ama bundan çıkan tüm komik versiyon uyuşmazlığı hataları.

Yani çok güzel bir umd fabrika bu olacaktır:

(function (root, factory) { 
    if (typeof define !== 'undefined' && define.amd) { 
    define(['angular'] , function (angular) { 
     factory(angular); 
    }); 
    } else if (typeof module !== 'undefined' && module.exports) { 
    module.exports = { 
     register: function(angular) { 
     factory(angular); 
     } 
    }; 
    } else { 
    factory(root.angular); // browser global (root is window) 
    } 
}(this, function (angular) { 
    angular.module(...); 
})); 
+1

Genelde, kütüphanenin hangi sürümünün ekleneceğini (sıkıştırılmış sıkıştırmaya karşı sıkıştırılmış) belirlemek için oluşturma aracına kaldığını iddia ediyorum. Ayrıca, eğer kütüphaneyi açısalya karşı geliştiriyorsa, bu kimsenin değil, açısını ve açısını almak oldukça mantıklıdır. Sadece iki sentim. – icfantv

+0

Sadece "minified veya değil" hakkında konuşmak değilim, jquery vs zepto düşünün: tamamen farklı kütüphaneler, ancak% 99 aynı API, böylece jQuery dayanan hemen hemen herhangi bir eklenti zepto ile sadece iyi çalışır ... sağlanan kendi jantını yüklemiyor. Benimle aynı API'ye sahip bir kütüphaneye sahip olabilirdim, bu durumda benim için açısal modül yükleyen modül, yararlı olanın tersi olacaktır. –

+0

Bu durumda, doğru uygulamanın, üçüncü taraf kitaplığının tutarlı bir API sağlamak için uygulayacağı bir arabirim olacağını iddia ediyorum. Ama bu, @Bungle, açısal bir JS modülünü yazmak istediğini belirttiğinden beri tüm bu tartışmalardan biri. Bu nedenle, eğer istemiyorsa başka bir kütüphaneyi desteklememelidir - özellikle de modülün inşa edildiği temelde açısal olduğu ve tartışmalı olarak açısal web uygulamaları için temel oluşturduğu için. Ancak tarihler hakkında konuşuyorsak, size% 100 katılıyorum. – icfantv

1

Bu kalıbı kullanarak yanlış bir şey görmüyorum. Muhtemelen keşfettiğiniz gibi, Angular kendi modülünü kullandığı için mevcut modül sistemleri ile çok iyi oynamamaktadır, ancak bir modülün herhangi bir şeyi dışa aktarmak zorunda kalmaması gerekir. Bir proje için ana modül ne sıklıkta ihracat yapmaktadır? Genellikle bağımlılıkları alır.

Benzer bir şey yapan bir örnek arıyorsanız, UMD kullanan ancak jQuery'ye bağlı olan jQuery mousewheel eklentisine bakabilirsiniz.

alıntı jquery.mousewheel.js den:

(function (factory) { 
    if (typeof define === 'function' && define.amd) { 
     // AMD. Register as an anonymous module. 
     define(['jquery'], factory); 
    } else if (typeof exports === 'object') { 
     // Node/CommonJS style for Browserify 
     module.exports = factory; 
    } else { 
     // Browser globals 
     factory(jQuery); 
    } 
}(function ($) { 

tek fark jQuery nesne geçer, böylece bunu uzatmak isteyen, Düğüm/CommonJS ihracat için bir kurucu dönmenizdir .


Bir yan notta, AMD bölümünde UMD uygulamanızla ilgili bir sorun var.

Şu ana kadar:

factory(require(['b'])); // AMD 

sen gerekir Nerede: AMD asenkron olduğundan

define(['b'], factory); // AMD 

, senkronize olan açısal modülünü gerektirecek mümkün olmaz.

(function (root, factory) { 
    if (typeof define === 'function' && define.amd) { 
    define(['b'], factory); // AMD 
    } else if (typeof exports === 'object') { 
    factory(require('b')); // Node 
    } else { 
    factory(root.b); // browser global (root is window) 
    } 
}(this, function (b) { 
    // use b in some fashion 
})); 
+0

jquery.mousewheel.js bunun çok iyi bir örneğidir, tam olarak geçerli görünüyor, teşekkürler. – estus

+0

@alexanderomara Pasajı OP'nin orijinalinin bir kopyası yerine doğru olana değiştirmelisiniz, böylece dikkatsiz okuyucular pasajı yalnızca kopyalayıp yapıştırmayacaklardır –

+0

@ I-LinKuo Good catch! Kopyala yapıştır başarısız. –