Salesforce LWC için CSS @track dekoratörüne yönelik kapsamlı bir rehber; verimli veri değişikliği takibi ve render etme yoluyla performans optimizasyonundaki rolünü inceliyor.
CSS @track: Verimli Veri Bağlama ile Web Performansını Artırma
Modern web geliştirme dünyasında, özellikle Salesforce ekosisteminde Lightning Web Components (LWC) kullanırken performans her şeyden önemlidir. Kullanıcılar hızlı, duyarlı ve sorunsuz deneyimler bekler. LWC'de en iyi performansı elde etmek için güçlü araçlardan biri @track
dekoratörüdür. Bu makale, verimli veri bağlama ve geliştirilmiş web performansı için @track
'i anlama ve kullanma konusunda kapsamlı bir rehber sunmaktadır.
@track
Dekoratörü Nedir?
LWC'deki @track
dekoratörü, bir bileşenin JavaScript sınıfındaki özelliklerdeki değişiklikleri izlemek için kullanılır. Bir özellik @track
ile dekore edildiğinde, LWC'nin reaktif motoru bu özelliği değişiklikler için izler. Bir değişiklik tespit edildiğinde, LWC bileşeni yeniden render eder ve kullanıcı arayüzünü yeni verileri yansıtacak şekilde günceller.
Bunu özel bir gözlemci olarak düşünün. Karmaşık değişiklik algılama mekanizmalarını manuel olarak uygulamak yerine, @track
LWC'ye hangi özelliklerin güncellemeleri tetiklemesi gerektiğini bildirmenin bildirimsel ve verimli bir yolunu sunar.
Anahtar Kavram: @track
'i stratejik olarak kullanarak, hangi bileşen güncellemelerinin tetikleneceğini kontrol edebilir, gereksiz yeniden render etmeyi en aza indirebilir ve performansı önemli ölçüde artırabilirsiniz.
@track
Performans İçin Neden Önemlidir?
Web tarayıcıları ekrandaki öğeleri sürekli olarak render eder ve yeniden render eder. Bu süreç, özellikle büyük miktarda veriye sahip karmaşık uygulamalarda kaynak yoğun olabilir. Gereksiz yeniden render etme şunlara yol açabilir:
- Yavaşlama: Kullanıcı arayüzü hantal ve tepkisiz hale gelir.
- Artan CPU Kullanımı: Tarayıcı daha fazla işlem gücü tüketir, bu da mobil cihazlarda pil ömrünü tüketebilir.
- Kötü Kullanıcı Deneyimi: Kullanıcılar yavaş performanstan dolayı hayal kırıklığına uğrar ve uygulamayı terk edebilir.
@track
, bileşenlerin ne zaman yeniden render edileceğini hassas bir şekilde kontrol etmenize olanak tanıyarak bu sorunları azaltmaya yardımcı olur. @track
veya benzer mekanizmalar olmadan, LWC değişiklikler için daha sık ve potansiyel olarak gereksiz kontroller yapmak zorunda kalır, bu da performans düşüşüne yol açar.
@track
Nasıl Çalışır?
Bir özelliği @track
ile dekore ettiğinizde, LWC'nin reaktif motoru özelliği saran bir proxy nesnesi oluşturur. Bu proxy nesnesi, özelliğin değerini değiştirmeye yönelik tüm girişimleri yakalar. Bir değişiklik algılandığında, proxy nesnesi bileşenin yeniden render edilmesini tetikler.
Önemli Not: @track
, bir nesne veya dizi ise özelliğin *içindeki* değişiklikleri değil, yalnızca özelliğin kendi *değerindeki* değişiklikleri izler. Bu, @track
'i etkili bir şekilde nasıl kullanacağınızı anlamak için çok önemli bir ayrımdır.
@track
ve Genel Özellikler (@api
) Karşılaştırması
@track
'i @api
ile dekore edilmiş genel özelliklerden ayırmak önemlidir. Her ikisi de yeniden render etmeyi tetikleyebilse de, farklı amaçlara hizmet ederler:
@track
: Bir bileşen içindeki özel özelliklerdeki değişiklikleri izlemek için kullanılır. Bu özelliklerdeki değişiklikler genellikle bileşenin kendisi tarafından başlatılır.@api
: Ana bileşenler veya harici sistemler (örneğin, Apex veya diğer Lightning bileşenlerinden) tarafından erişilebilen ve değiştirilebilen genel özellikleri tanımlamak için kullanılır.
@api
özelliklerindeki değişiklikler *her zaman* yeniden render etmeyi tetikler, çünkü bunlar bileşenin genel arayüzünü temsil eder. @track
, dahili bileşen durumu için yeniden render etme üzerinde daha hassas kontrol sağlar.
@track
Ne Zaman Kullanılır?
İşte @track
kullanmanın faydalı olduğu bazı yaygın senaryolar:
- İlkel Veri Tiplerini İzleme: String, number, boolean ve date gibi basit veri tipleri için
@track
kullanın. Bu tiplerdeki değişiklikler doğrudan izlenir ve yeniden render etmeyi tetikler. - Nesne ve Dizi Değişikliklerini İzleme (Kısmen):
@track
nesneler ve diziler *içindeki* değişiklikleri derinlemesine izlemese de, nesne veya dizi *referansındaki* değişiklikleri izler. Bu,@track
ile dekore edilmiş bir özelliğe yeni bir nesne veya dizi atarsanız, bunun yeniden render etmeyi tetikleyeceği anlamına gelir. - Kullanıcı Etkileşimine Göre Render Optimizasyonu: Kullanıcı eylemlerine (örneğin, düğme tıklamaları, girdi değişiklikleri) göre güncellenen bir bileşeniniz varsa, bileşenin yalnızca ilgili veri değiştiğinde yeniden render edilmesini sağlamak için
@track
kullanın.
@track
Ne Zaman KULLANILMAZ (ve Alternatifleri)
Özellikle karmaşık nesneler ve dizilerle uğraşırken @track
'in en uygun seçim olmayabileceği durumlar vardır. Yanlış kullanılması, beklenmedik davranışlara veya performans sorunlarına yol açabilir.
- Derinlemesine İç İçe Nesneler ve Diziler: Daha önce belirtildiği gibi,
@track
bir nesnenin veya dizinin *içindeki* değişiklikleri değil, yalnızca *referansındaki* değişiklikleri izler. İç içe bir nesne veya dizinin derinliklerindeki bir özelliği değiştirirseniz, bileşen yeniden render *edilmez*. - Büyük Veri Kümeleri: Çok büyük veri kümeleriyle çalışırken, her değişikliği
@track
ile izlemek verimsiz hale gelebilir. Sayfalama, sanallaştırma veya özel veri yapıları kullanma gibi alternatif stratejileri göz önünde bulundurun.
Karmaşık Veriler İçin @track
Alternatifleri:
- Değişmezlik (Immutability): Verilerinizi değişmez olarak kabul edin. Mevcut nesneleri veya dizileri değiştirmek yerine, istenen değişikliklerle yenilerini oluşturun. Bu,
@track
özelliği güncellendiğinde nesne referansının değişmesini ve yeniden render etmeyi tetiklemesini sağlar. Immer.js gibi kütüphaneler değişmez veri yönetimine yardımcı olabilir. - Manuel Yeniden Render Etme: Bazı durumlarda,
renderedCallback()
yaşam döngüsü kancasını kullanarak yeniden render etmeyi manuel olarak tetiklemeniz gerekebilir. Bu size render süreci üzerinde tam kontrol sağlar. Ancak, kodunuzu daha karmaşık hale getirebileceği için bunu idareli kullanın. - Olay Yönetimi ve Hedefli Güncellemeler: Her değişikliği tespit etmek için
@track
'e güvenmek yerine, bileşenin belirli kısımlarını doğrudan güncellemek için olay yönetimini kullanmayı düşünün. Örneğin, bir kullanıcı listedeki tek bir öğeyi düzenlerse, tüm listeyi yeniden render etmek yerine yalnızca o öğenin görsel temsilini güncelleyin.
@track
Kullanımına İlişkin Pratik Örnekler
@track
kullanımını bazı pratik örneklerle gösterelim.
Örnek 1: Basit Bir Sayacı İzleme
Bu örnek, bir düğmeye tıklandığında artan basit bir sayacın nasıl izleneceğini gösterir.
JavaScript (myComponent.js):
import { LightningElement, track } from 'lwc';
export default class MyComponent extends LightningElement {
@track counter = 0;
incrementCounter() {
this.counter++;
}
}
HTML (myComponent.html):
Counter: {counter}
Bu örnekte, counter
özelliği @track
ile dekore edilmiştir. incrementCounter()
metodu çağrıldığında, counter
değeri artırılır, bu da bileşenin yeniden render edilmesini tetikler ve görüntülenen sayaç değerini günceller.
Örnek 2: Bir Nesnedeki Değişiklikleri İzleme (Yüzeysel İzleme)
Bu örnek, @track
'in bir nesnenin *referansındaki* değişiklikleri nasıl izlediğini gösterir. Nesne *içindeki* özellikleri değiştirmek yeniden render etmeyi *tetiklemez*.
JavaScript (myComponent.js):
import { LightningElement, track } from 'lwc';
export default class MyComponent extends LightningElement {
@track contact = {
firstName: 'John',
lastName: 'Doe'
};
updateFirstName() {
// This will NOT trigger a rerender
this.contact.firstName = 'Jane';
}
replaceContact() {
// This WILL trigger a rerender
this.contact = {
firstName: 'Jane',
lastName: 'Doe'
};
}
}
HTML (myComponent.html):
First Name: {contact.firstName}
Last Name: {contact.lastName}
"Update First Name" düğmesine tıklamak, bileşenin yeniden render edilmesine neden *olmaz*, çünkü @track
nesne *içindeki* değişiklikleri değil, yalnızca nesne *referansındaki* değişiklikleri izler. "Replace Contact" düğmesine tıklamak ise yeniden render etmeye neden *olur*, çünkü contact
özelliğine yeni bir nesne atar.
Örnek 3: Bir Nesnedeki Değişiklikleri İzlemek İçin Değişmezliği Kullanma (Derin İzleme)
Bu örnek, @track
kullanarak bir nesne içindeki değişiklikleri etkili bir şekilde izlemek için değişmezliğin nasıl kullanılacağını gösterir.
JavaScript (myComponent.js):
import { LightningElement, track } from 'lwc';
export default class MyComponent extends LightningElement {
@track contact = {
firstName: 'John',
lastName: 'Doe'
};
updateFirstName() {
// Create a new object with the updated first name
this.contact = {
...this.contact,
firstName: 'Jane'
};
}
}
HTML (myComponent.html):
First Name: {contact.firstName}
Last Name: {contact.lastName}
Bu örnekte, updateFirstName()
metodu, güncellenmiş firstName
ile *yeni* bir nesne oluşturmak için spread operatörünü (...
) kullanır. Bu, contact
özelliği güncellendiğinde nesne referansının değişmesini ve yeniden render etmeyi tetiklemesini sağlar.
@track
Kullanımı İçin En İyi Uygulamalar
@track
'in faydalarını en üst düzeye çıkarmak ve olası performans tuzaklarından kaçınmak için bu en iyi uygulamaları izleyin:
@track
'i İdareli Kullanın: Yalnızca gerçekten yeniden render etmeyi tetiklemesi gereken özellikleri dekore edin. Yalnızca dahili hesaplamalar veya geçici depolama için kullanılan özellikleri izlemekten kaçının.- Değişmezliği Tercih Edin: Nesneler ve dizilerle çalışırken, değişikliklerin doğru bir şekilde izlendiğinden emin olmak için değişmezliğe öncelik verin. Mevcut olanları değiştirmek yerine yeni nesneler ve diziler oluşturmak için spread operatörü veya Immer.js gibi kütüphaneler gibi teknikleri kullanın.
- Bileşen Hiyerarşisini Göz Önünde Bulundurun: Bir bileşendeki değişikliklerin hiyerarşideki diğer bileşenleri nasıl etkileyebileceğini düşünün. Bileşenler arasında değişiklikleri iletmek ve ana bileşenlerin gereksiz yere yeniden render edilmesini önlemek için olayları (events) kullanın.
- Bileşenlerinizi Profilleyin: Bileşenlerinizi profillemek ve performans darboğazlarını belirlemek için Salesforce Lightning Inspector'ı kullanın. Bu,
@track
'in verimsiz kullanıldığı veya alternatif optimizasyon stratejilerinin daha uygun olabileceği alanları belirlemenize yardımcı olabilir. - Kapsamlı Test Edin: Bileşenlerinizin doğru şekilde yeniden render edildiğinden ve kullanıcı arayüzünün beklendiği gibi güncellendiğinden emin olmak için kapsamlı bir şekilde test edin. Özellikle uç durumlara ve karmaşık veri senaryolarına dikkat edin.
Gerçek Dünya Senaryolarında @track
Salesforce LWC'nin gerçek dünya senaryolarında @track
'in nasıl kullanılabileceğini keşfedelim.
- Dinamik Formlar: Dinamik bir form bileşeninde, form alanlarının değerlerini izlemek için
@track
kullanabilirsiniz. Bir kullanıcı bir alan değerini değiştirdiğinde, bileşen diğer alanların görünümünü güncellemek veya doğrulamalar yapmak için yeniden render edilir. Örneğin, "Ülke" alanını değiştirmek, "Eyalet/İl" alanındaki mevcut seçenekleri dinamik olarak güncelleyebilir. İlleri olan Kanada ile eyaletleri olan Amerika Birleşik Devletleri gibi ülkeleri düşünün; görüntülenen seçenekler bağlamsal olarak ilgili olmalıdır. - Etkileşimli Grafikler ve Çizelgeler: LWC'de etkileşimli grafikler veya çizelgeler oluşturuyorsanız, seçilen veri noktalarını veya filtre kriterlerini izlemek için
@track
kullanabilirsiniz. Kullanıcı grafikle etkileşime girdiğinde (örneğin, bir çubuğa tıklayarak), bileşen grafiğin görünümünü güncellemek veya seçilen veri noktası hakkında ayrıntılı bilgi göstermek için yeniden render edilir. Kuzey Amerika, Avrupa, Asya-Pasifik gibi farklı bölgeler için veri gösteren bir satış panosu hayal edin. Bir bölge seçmek, grafiği o bölgedeki satış performansının daha ayrıntılı bir görünümünü gösterecek şekilde günceller. - Gerçek Zamanlı Veri Güncellemeleri: Gerçek zamanlı veri güncellemeleri gerektiren uygulamalarda (örneğin, hisse senedi takipçileri, sensör okumaları), gelen verileri izlemek ve kullanıcı arayüzünü buna göre güncellemek için
@track
kullanabilirsiniz. Veri hacimleri ve güncelleme sıklığı göz önünde bulundurularak kullanılmalıdır; son derece yüksek frekanslı güncellemeler için alternatif yaklaşımlar gerekebilir. Örneğin, USD, EUR, JPY ve GBP arasındaki gerçek zamanlı döviz kurlarını gösteren bir bileşen, kurlar değiştikçe oranları güncellemek için@track
kullanır. - Özel Arama Bileşenleri: Özel bir arama bileşeni oluştururken, arama terimini ve arama sonuçlarını izlemek için
@track
kullanılabilir. Kullanıcı arama kutusuna yazdıkça, bileşen arama sonuçlarını güncellemek için yeniden render edilir. Bu, arama aynı zamanda görüntülenen verilere filtreler ve sıralamalar uyguluyorsa özellikle yararlıdır. Çeşitli kaynaklardan veri alan küresel bir arama bileşeni düşünün;@track
kullanmak, kullanıcı girdisine dayalı olarak aramanın gerçek zamanlı olarak hassaslaştırılmasını sağlar.
LWC'de @track
'in ve Reaktif Programlamanın Geleceği
@track
dekoratörü, LWC'nin reaktif programlama modelinin temel bir parçasıdır. LWC gelişmeye devam ettikçe, reaktif motorda daha fazla iyileştirme ve yüksek performanslı web uygulamaları oluşturmayı daha da kolaylaştıran yeni özellikler görmeyi bekleyebiliriz.
Potansiyel Gelecek Yönelimleri:
- Geliştirilmiş Derin İzleme: LWC'nin gelecekteki sürümleri, nesneler ve diziler içindeki değişiklikleri izlemek için daha sağlam mekanizmalar sunabilir ve manuel değişmezlik yönetimi ihtiyacını azaltabilir.
- Yeniden Render Etme Üzerinde Daha Ayrıntılı Kontrol: LWC, geliştiricilere bileşenlerin ne zaman ve nasıl yeniden render edileceği konusunda daha da hassas kontrol sağlayan yeni özellikler sunabilir, bu da performansı daha da optimize eder.
- Reaktif Kütüphanelerle Entegrasyon: LWC, RxJS veya MobX gibi popüler reaktif kütüphanelerle daha sorunsuz bir şekilde entegre olabilir ve geliştiricilere veri akışını ve bileşen güncellemelerini yönetmek için daha geniş bir araç yelpazesi sunabilir.
Sonuç
@track
dekoratörü, Salesforce LWC'de web performansını optimize etmek için güçlü bir araçtır. Nasıl çalıştığını anlayarak ve en iyi uygulamaları takip ederek, harika bir kullanıcı deneyimi sunan duyarlı ve verimli uygulamalar oluşturabilirsiniz. @track
'i stratejik olarak kullanmayı, değişmezliği tercih etmeyi ve potansiyel performans darboğazlarını belirlemek için bileşenlerinizi profillemeyi unutmayın. LWC gelişmeye devam ettikçe, en son özellikler ve en iyi uygulamalarla güncel kalmak, yüksek performanslı web uygulamaları oluşturmak için çok önemli olacaktır.
@track
'in gücünü benimseyin ve LWC'nin tüm potansiyelini ortaya çıkarın!