JavaScript

Lit Framework Kullanımı (Kod Örnekleri)

Son zamanlarda web bileşenlerinin ne olduğundan ve bunları yalnızca vanilya JavaScript ile kullanarak nasıl bir web uygulaması oluşturabileceğinizden bahsettik.

Web bileşenleri yalnızca vanilya JavaScript ile kesinlikle kullanılabilirken, özellikle değer bağlamayla ilgili daha karmaşık kullanım, kolayca hantal hale gelebilir.

Lit Framework Kullanımı (Kod Örnekleri)
Lit Framework Kullanımı (Kod Örnekleri)

Olası bir çözüm, VueJS veya React gibi bir web bileşeni çerçevesi kullanmak olabilir. Bununla birlikte, web standardı bileşenler hala geliştirme için büyük bir nimet olabilir.

Bu nedenle, özellikle web bileşenlerinden yararlanmak için geliştirilmiş “Lit” adlı bir çerçeve vardır. Kararlı bir sürüm olarak piyasaya sürülen Lit 2.0 ile web bileşeni geliştirmeyi nasıl basitleştirebileceğimize bir göz atacağımızı düşündük.

HTML

Özel öğelerin en güçlü yönlerinden biri, birden çok başka öğe içerme yeteneğidir. Bu, her ölçek için özel öğelere sahip olmanızı sağlar: bir düğmeden tüm sayfaya.

Bunu bir vanilya JavaScript özel öğesinde yapmak için, yeni alt öğeler oluşturmak üzere “innerHTML“yi kullanabilirsiniz.

Bu ilk örnek, bu kodun Lit karşılığına oldukça benziyor:

Vanilla JavaScript örneğinden iki temel fark vardır. İlk olarak, artık “render“ı çağırmak için “connectedCallback“i kullanmamız gerekmiyor. LitElement‘in ‘render‘ işlevi, gerektiğinde – örneğin veri değiştiğinde veya bir ilk işleme için – Lit tarafından çağrılır ve işleme yöntemini manuel olarak yeniden çağırma gereksinimini ortadan kaldırır.

Bununla birlikte, Lit bileşenleri, vanilya özel öğeleriyle aynı yaşam döngüsü metotlarını tam olarak destekler.

Vanilya JavaScript bileşeninden Lit uygulamasına geçişte kaçırılması daha kolay olan ikinci değişiklik, HTML’mizi ayarlarken basit bir template literal <p>Merhaba Lit!</p> kullanıyoruz.

Bu, etiketli şablonlar adı verilen şablon değişmezlerinin biraz nadiren kullanılan bir özelliğinden yararlanır. Etiketli şablonlar, bir şablon değişmezinin bir işleve geçirilmesine izin verir. Bu işlev daha sonra çıktıyı dize girdisine ve beklenen enterpolasyonlu yer tutuculara dayalı olarak dönüştürebilir.

Etiketli şablonlar, diğer işlevler gibi bir değer döndürdüğü için, bir değişkene “html“nin dönüş değerini atayabilirsiniz.

Bu değeri “console.log” yapacak olsaydınız, bunun bir HTMLElement olmadığını fark ederdiniz. Bunun yerine, Lit’in uygun DOM düğümlerine işlemek için kullandığı özel bir değerdir.

Event Binding

“Sözdizimi çok benzerse, özel öğeler oluşturmak için neden bir çerçeve ekleyeyim?”

Vanilla JavaScript ve Lit özel öğe kodu küçük bir demo için benzer görünse de: Büyütmek istediğinizde hikaye önemli ölçüde değişir.

Örneğin, bir buton oluşturmak ve vanilya JavaScript ile butna bir tıklama olayı eklemek istiyorsanız, innerHTML eleman atama yöntemini terk etmeniz gerekir.

İlk önce, “document.createElement” kullanarak bir öğe oluşturacağız, ardından olayları ekleyeceğiz ve son olarak düğümü DOM’a eklemek için “append” gibi bir öğe yöntemini kullanacağız.

Bu, ilk oluşturma için işe yarasa da, geniş ölçekte uygulamanızın sürdürülebilirliği ve performansında uzun vadeli hasara neden olabilecek herhangi bir Edge vakasını işlemez.

Örneğin, öğenin gelecekteki yeniden oluşturma işlemleri düğmeyi çoğaltacaktır. Bunu çözmek için, öğenin tüm “alt öğelerini” yinelemeli ve bunları birer birer “kaldırmalısınız”.

Ayrıca, öğe DOM’den kaldırıldığında, tıklama dinleyicisi arka planda örtük olarak kaldırılmaz. Bu nedenle, hiçbir zaman bellekten serbest bırakılmaz ve bir bellek sızıntısı olarak kabul edilir. Bu sorun, uygulamanızın uzun süreli kullanımı sırasında oluşmaya devam ederse, büyük olasılıkla bellek kullanımını şişirir ve sonunda kilitlenir veya askıda kalır.

Bunu çözmek için, sahip olduğunuz her ‘addEventListener‘ için bir değişken atamanız gerekir. Bu, bir veya iki etkinlik için basit olabilir, ancak çok fazla ekleyin ve takip etmek zor olabilir.

Ve tüm bunlar bakım bakış açısını yok sayar: Bu kod bir bakışta ne yapar?

HTML gibi bir şeye benzemiyor ve sonuç olarak, bir dizede standart HTML yazmak ile öğeleri oluşturmak için DOM API’lerini kullanmak arasında tutarlı bir şekilde bağlam kayması yapmanızı gerektiriyor.

Neyse ki, Lit’in bu sorunları yok. Vanilla JavaScript yerine Lit kullanarak özel bir öğeye aynı düğme yapımı ve işlemesi:

Evet, hepsi bu. Lit, “@” işaretini kullanarak ve işlevi “html” etiketli şablona yer tutucu olarak ileterek öğeleri bağlamanıza olanak tanır. Bu yalnızca HTML benzeri görünmekle kalmaz, olay temizleme, yeniden oluşturma ve daha fazlasını da gerçekleştirir.

Nitelikler ve Özellikler

Daha önce öğrendiğimiz gibi, bileşenler arasında ve bileşenlere değer aktarmanın iki yolu vardır: nitelikler ve değerler.

Önceden Vanilla JavaScript kullanırken bunları ayrı ayrı tanımlamamız gerekiyordu. Ayrıca, hangi özniteliklerin değer değişikliklerini dinamik olarak dinleyeceğimizi bildirmemiz gerekiyordu.

Lit’te, öznitelikleri ve özellikleri statik bir alıcı kullanarak bildiririz ve bunları herhangi bir işlevimizde normal değerler olarak ele alırız.

Yeni başlayanlar için, bir özelliğin değeri değiştiğinde artık manuel olarak “render” çağırmamız gerekmiyor. Değerler değiştirildiğinde Lit yeniden oluşturulacaktır.

Yine de hepsi bu kadar değil: Dikkatli okuyucular, “mesaj” özelliğiyle ilişkili bir tür bildirdiğimizi fark edeceklerdir.

React ekosisteminin PropType‘larından farklı olarak, “type” alt özelliği, çalışma zamanı türü doğrulaması yapmaz. Bunun yerine, otomatik tip dönüştürücü görevi görür.

Özniteliklerin yalnızca dizeler olabileceği bilgisi hata ayıklama sırasında hatırlanması zor olabileceğinden, bu çok yardımcı olabilir.

Örneğin, Lit’e bir niteliği bir Sayıya dönüştürmesini söyleyebiliriz ve sayı gibi görünen bir dizeden gerçek bir JavaScript türü numarasına geçecektir.

Özellik Tepkimesi

Manuel olarak “render” çağırmak zorunda kalmamanın en büyük faydalarından biri, Lit’in güncellenmesi gerektiğinde içerikleri oluşturabilmesidir.

Örneğin, bu örnekte, içerikler yeni değerlerle güncellenecek şekilde düzgün bir şekilde işlenecektir.

Reaktif Veri Bağlama

Bu tepkisellik kendi sınırlamalarıyla birlikte gelir. Sayılar ve diziler oldukça önemsiz bir şekilde ayarlanabilse de, nesneler (ve uzantı dizileriyle) farklı bir hikaye.

Bunun nedeni, Lit’in oluşturmada hangi özelliklerin güncelleneceğini bilmesi için, bir nesnenin birinden diğerine farklı bir referans değerine sahip olması gerekir. React ve diğer çerçeveler, durumdaki değişiklikleri de bu şekilde algılar.

HTML nitelikleri, verileri bir web bileşenine aktarmanın tek yolu değildir. Öğe sınıfındaki özellikler, bir öğeye yalnızca bir dizeden fazlasını iletmenin bir yoludur.

‘type’ alanı da bu sorunu çözmeye yardımcı olabilir, ancak yine de seri hale getirilebilirlikle sınırlısınız, yani işlevler gibi şeylerin nitelikler tarafından geçemeyeceği anlamına gelir.

Özellikler, web bileşenlerine veri aktarmanın daha sağlam bir yöntemi olsa da, kodlamadaki karmaşıklıkları nedeniyle vanilya JavaScript’te nadiren kullanılırlar.

Örneğin, bu bir diziyi geçirmenin basit bir gösterimidir.

İlk olarak, “querySelector” gibi bir API kullanarak öğeye bir referans almanız gerekir. Bu, bileşene yeni bir referans eklemeniz ve kimliklerin kodun her iki bölümünde de eşleştiğinden emin olmanız gerektiği anlamına gelir.

Ardından, öznitelik değerlerini güncellemede olduğu gibi, UI’yi güncellemek için “render” işlevini manuel olarak çağırmamız gerekiyor.

Ancak bu şikayetler bir yana, bir tane daha var: Verilerinizi ve bileşen etiketlerinizi iki farklı alana yerleştirir. Bu nedenle, hata ayıklamak veya hangi verinin hangi bileşene aktarıldığını anlamak daha zor olabilir.

Lit farklı bir yaklaşım benimsiyor. Bir Lit html etiketli şablon içinde, bir öznitelik bağlamadan önce bir nokta ekleyin ve aniden onun yerine bir özellik olarak geçecektir.

Bu işe yarar, çünkü özellikler ve nitelikler, Lit ile aynı anda oluşturulur.

Ancak, nokta bağlamanın HTML standardı olmaması nedeniyle, özellikleri bağlamak için bir Lit şablonu kullanmak zorunda olmanın yan etkisi ile birlikte gelir. Bu, uygulamalarda bir sorun oluşturmaz – çünkü çoğu, uygulamaları boyunca bileşenleri kullanma ve oluşturma eğilimi gösterir.

Dizi Oluşturma

Vanilla JavaScript web bileşenleri hakkındaki makalemizde basit bir yapılacaklar listesi oluşturduk. Bu örneğe bir kez daha bakalım, ancak bu sefer bileşen kodumuz için Lit’i kullanıyoruz. Verileri ve kullanıcı girişini yönetecek olan bir üst “FormElement” ile başlayacağız.

Artık bir dizi içeren bir formumuz olduğuna göre, önemli bir soru ortaya çıkıyor: Bir liste için bireysel öğeler oluşturmak için bir diziyi nasıl yineleyeceğiz?

React’te ‘Array.map’ ve Vue’da ‘v-for’ bulunurken, Lit bir ‘repeat’ işlevi kullanır. İşte bir örnek:

Geçiş Fonksiyonları
Lit’in artılarını ve eksilerini konuşmak için koddan uzaklaşmadan önce (şşş, spoiler!); bugün bahsettiğimiz vanilya JavaScript web bileşenlerine göre birçok avantajı gösteren bir kod örneğine bakalım.

Önceki blog gönderisinin okuyucuları, bir web bileşenine bir dizi nesneyi geçirirken işlerin oldukça iyi göründüğünü hatırlayacaktır.

Olay dinleyicilerini bir dizi nesneye bağlamayı deneyene kadar işler karmaşık (ve dağınık) hale geldi. Öğeleri “document” kullanarak manuel olarak oluşturma ihtiyacı, özellikleri geçmek için “querySelector” ile uğraşma, manuel olarak “render” çağırma ve özel bir “clear” yöntemini uygulamaya ihtiyaç duyma arasında – karmaşık bir deneyimdi.

Lit’in işi nasıl ele aldığını görelim.

‘render’ yöntemimizde bir ‘filtre’ kullandığımızı fark edeceksiniz. Bu mantık ‘render’ metodu içinde olduğu için her UI güncellemesinde çalışacaktır. Pahalı işlemleriniz olması durumunda bunu not etmek önemlidir: bunları render yönteminde çalıştırmaktan kaçınmalısınız.

Ancak bunun dışında – hepsi bu kadar! Tıpkı HTML’nin yaptığı gibi okur (temizleme ve pervane geçişinin ek avantajıyla), dinamik verileri işler ve daha fazlasını yapar!

Sonuç

Bir uygulamada Lit’ten yararlanma yeteneği, bir projeyi sürdürmeyi ve geliştirmeyi, web bileşenlerini kendiniz yuvarlamaktan daha kolay hale getirir.

Lit, Polimerin ilk günlerinden itibaren web bileşenlerinde önemli bir büyüme göstermektedir. Bu büyüme, Lit ekibinin kendisinden de kaynaklanmıyor!

Tam teşekküllü bir çerçeve olmadan önce proje, Polymer’in bir dalı olan ‘lit-html’ paketinden başladı. Polymer ekibi, web bileşenlerinin modern varyantını standartlaştırmada etkili oldu.

Lit’i kullanma yeteneği, web bileşeni geliştirmeyi güçlü bir şekilde artırabilir, ancak orada başka seçenekler de var. Bir dahaki sefere rakiplerin ne yaptığından, her birinin artı ve eksilerinin neler olduğundan ve uygulamalarınız için en iyi seçimi nasıl yapabileceğinizden bahsedeceğiz.