İstisnaların Amacı
Kapsamlar, gelişmiş derleme sırasında yeniden adlandırılmaması gereken sembollerin adlarını Closure Compiler'a bildiren bildirimlerdir. Harici simgeler olarak anılır. Bu simgeler genellikle derlemenin dışındaki bir kod (ör. yerel kod veya üçüncü taraf kitaplıklar) tarafından tanımlanır. Bu nedenle, hariç tutulanlar genellikle tür sembolleri de içerir. Böylece, Clogg Compiler bu sembolleri kullanıp kullanmadığınızı kontrol edebilir.
Genellikle hariç tutmak, en iyi yöntem, uygulamacı ile derlenmiş bir kod parçasının tüketicileri arasındaki API sözleşmesidir. Hariç tutulanlar, uygulamaya geçiren kişinin vaat ettiği taahhütleri ve tüketicilerin neyi kullanmak isteyebileceğini tanımlar. Her iki taraf da sözleşmenin bir kopyasını almalıdır.
Hariç tutulanlar, diğer dillerdeki başlık dosyalarına benzer.
Söz Dizileri
Dışlamalar, Closure Compiler için not eklenmiş normal JavaScript'e çok benzeyen dosyalardır. Aralarındaki temel fark, içeriklerinin hiçbir zaman derlenen çıktı kapsamında yazdırılmamasıdır. Bu nedenle değerlerden hiçbiri anlamlı değildir, yalnızca adlar ve türler anlamlıdır.
Aşağıda, basit bir kitaplık için harici dosyalar örneği verilmiştir.
// The `@externs` annotation is the best way to indicate a file contains externs. /** * @fileoverview Public API of my_math.js. * @externs */ // Externs often declare global namespaces. const myMath = {}; // Externs can declare functions, most importantly their names. /** * @param {number} x * @param {number} y * @return {!myMath.DivResult} */ myMath.div = function(x, y) {}; // Note the empty body. // Externs can contain type declarations, such as classes and interfaces. /** The result of an integer division. */ myMath.DivResult = class { // Constructors are special; member fields can be declared in their bodies. constructor() { /** @type {number} */ this.quotient; /** @type {number} */ this.remainder; } // Methods can be declared as usual; their bodies are meaningless though. /** @return {!Array<number>} */ toPair() {} }; // Fields and methods can also be declared using prototype notation. /** * @override * @param {number=} radix */ myMath.DivResult.prototype.toString = function(radix) {};
--externs
Bayrak
Genel olarak @externs
ek açıklaması, derleyiciye bir dosyanın harici öğeleri içerdiğini bildirmenin en iyi yoludur. Bu dosyalar, --js
komut satırı işareti kullanılarak normal kaynak dosyalar olarak eklenebilir
Ancak, harici dosyaları belirtmenin başka bir eski yolu daha vardır. --externs
komut satırı işareti, harici dosyaları açık bir şekilde iletmek için kullanılabilir. Bu yöntem önerilmez.
Extex'leri kullanma
Yukarıdaki sınırlar hariç tutulabilir.
/** * @fileoverview Do some math. */ /** * @param {number} x * @param {number} y * @return {number} */ export function greatestCommonDivisor(x, y) { while (y != 0) { const temp = y; // `myMath` is a global, it and `myMath.div` are never renamed. const result = myMath.div(x, y); // `remainder` is also never renamed on instances of `DivResult`. y = result.remainder; x = temp; } return x; }
Explans'ı Closure Compiler Service API ile dahil etme
Hem Closure Compiler uygulaması hem de Closure Compiler service API, harici bildirimlere izin verir. Ancak Closure Compiler hizmeti kullanıcı arayüzü, harici dosyaları belirtmek için bir arayüz öğesi sağlamaz.
Kapanış Derleyici hizmetine harici beyan göndermenin üç yolu vardır:
-
@externs
ek açıklamasını içeren bir dosyayı kaynak dosya olarak iletin. -
JavaScript'i
js_externs
parametresindeki Closure Compiler hizmetine iletin. -
Bir JavaScript dosyasının URL'sini
externs_url
parametresindeki Closure Compiler hizmetine iletin.
js_externs
ile externs_url
kullanımı arasındaki tek fark, JavaScript'in Closure Compiler hizmetine nasıl bildirildiğidir.
Dışa Aktarmaların Amacı
Dışa aktarmalar, derlemeden sonra simgelere tutarlı adlar verilmesini sağlayan başka bir mekanizmadır. Dış kaynaklılardan daha az faydalıdır ve genellikle kafa karıştırıcıdır. Basit durumlar dışındaki her şey için en iyi yöntem budur.
Dışa aktarma işlemleri, Closure Compiler'ın dize değişmezlerini değiştirmemesine dayanır. Değişmez ada sahip bir mülke atanan nesne, derlemeden sonra bile bu özellik adı üzerinden kullanılabilir.
Aşağıda basit bir örnek verilmiştir.
/** * @fileoverview Do some math. */ // Note that the concept of module exports is totally unrelated. /** @return {number} */ export function myFunction() { return 5; } // This assignment ensures `myFunctionAlias` will be a global alias exposing `myFunction`, // even after compilation. window['myFunctionAlias'] = myFunction;
Kapatma Kitaplığı'nı kullanıyorsanız dışa aktarma işlemleri, goog.exportSymbol
ve goog.exportProperty
işlevleri kullanılarak da tanımlanabilir.
Bu işlevlerin Kapatma Kitaplığı dokümanlarında daha fazla bilgiye ulaşabilirsiniz. Ancak bunların özel derleyici desteğine sahip olduğunu ve derlenen çıkışta tamamen dönüştürüleceğini unutmayın.
Dışa Aktarma ile ilgili sorunlar
Dışa aktarma işlemleri, tüketicilerin başvurması için yalnızca açığa çıkan bir takma ad oluşturmaları açısından dış konumlardan farklıdır. Dışa aktarılan simge, derlenen kod içinde yine yeniden adlandırılır. Bu nedenle, dışa aktarılan simgelerin kodunuzda yeniden atanması, açığa çıkan takma adın yanlış bir şeyi işaret etmesine neden olacağından sabit olmalıdır.
Yeniden adlandırma işlemindeki bu incelik, dışa aktarılan örnek özellikleriyle ilgili olarak özellikle karmaşıktır.
Teoride, uzun adlar kodunuzda daha kısa adlarla değiştirilebildiği için dışa aktarma işlemlerine göre kod boyutları dışa aktarıldığında daha küçük olabilir. Pratikte bu iyileştirmeler genellikle çok küçüktür ve dışa aktarmaların yarattığı kafa karışıklığını haklı çıkarmaz.
Ayrıca, ihracat işlemleri tüketicilerin tüketim hususundaki gibi izlemelerini sağlayacak bir API sunmaz. İhracat, ihracatla karşılaştırıldığında, göstermek istediğiniz sembollerin türlerini, türlerini ve size kullanım bilgilerini ekleyeceğiniz bir yer sağlar. Ek olarak, tüketicileriniz Giyim Derleyici'yi de kullanıyorsa derlenmeleri için harici kullanıcıların olması gerekir.