Tek script ile mağazanın kendi arama kutusuna bağlanan site içi arama ekranı ve otomatik tamamlama. Yazım hatası toleransı, filtreler, eş anlamlılar, yönlendirmeler ve on düzen şablonu; hepsi markaya göre kodsuz ayarlanıyor. 271 markada canlı.
271markada canlı
10şablon: 4 kabuk × 16 blok
~9 binsatır, v2 ve SearchKit
0çalışma anı bağımlılığı
Deneyin
Uydurma bir mağazada arayın
Arama kutusuna tıklayın ya da demonun içinde / tuşuna basın. "ketn" gibi bir yazım hatası, "tişört" gibi bir eş anlamlı deneyin ya da şablon değiştirin.
Etkileşimli arama için JavaScript gerekiyor. Arama kutusu otomatik tamamlama, kategori çipleri, sıralama, filtreler, yazım düzeltme on SearchKit düzen şablonu ve klasik V2 ekranı içeren bir ekran açıyor; katalog sentetik.
Canlı sürümle aynı istemci davranışı; arama servisi yerine bellekteki katalog ve simüle edilmiş ağ gecikmesi kullanılıyor.
Sorun
Eski arama widget'ı her marka için elle stillendiriliyordu, yazım hatası toleransı ve filtre yoktu, markalar sürekli rakiplerin arama ekranlarının görüntülerini gönderiyordu.
Her mağazanın farklı bir header'ı, farklı bir arama kutusu ve kendi CSS reset'i var. Backend arama servisi sıralı ürün ve kategori döndürüyor ama yazım hatalarını ve özelliğe göre daraltmayı karşılamıyor. Yerine gelecek şeyin yüzlerce sitede siteye özel kod olmadan çalışması gerekiyordu.
Rolüm
Search V2'yi ve şablon motoru SearchKit'i tek geliştirici olarak yazdım; toplu yayın için kullanılan aracı da. Arkasındaki arama servisi, entegre olduğum mevcut Lucene tabanlı bir endpoint.
esbuild ile tek IIFE paket; kendi DOM'unu ve CSS'ini kendisi oluşturuyor
Marka config'i: input seçicisi, gizlenecek yerel panel, eş anlamlılar, yönlendirmeler, önerilen aramalar, şablon, CSS
İstemci tarafında yazım hatası toleransı, Türkçe katlama, sayılı filtreler, sıralama, sonuçsuz arama kurtarma
Analitik için arama ve tıklama olayları
Mimari
Tuştan sonuca
BağlanmaYükleyici paketi seçer, seçiciyle mağazanın kendi input'una bağlanır, yerel paneli gizler.
ConfigMarka ayarları bir kez alınır: şablon, eş anlamlılar, yönlendirmeler, öneriler, CSS.
Arama servisiMevcut endpoint sıralı ürün ve kategori döndürür.
İstemci katmanıKatlama, yazım düzeltme, filtreler, sıralama, geç gelen eski yanıtları eleme.
Render + izlemeŞablon kabuğu ve bloklar, arama ve tıklama olayları.
Mor ton: benim yazdığım kısımlar.
Mühendislik kararları
Zor olan neydi, ne yaptım
271 başka stil dosyasına dayanan CSS
Önce temel stilleri @layer içine taşıdım. Markaların katmansız reset'leri katmanlı kuralları ezdi; geri aldım ve her yere !important koymadan marka reset'ini geçen önekli seçicilere döndüm. Yayından önce bir cascade test sayfasının 8/8 geçmesi gerekiyor.
Eski sonuçlar yeni aramayı ezmez
Her tuş vuruşu önceki isteği AbortController ile iptal ediyor, geç gelen her şeyi bir sıra koruması düşürüyor. Yükleme küçük bir durum makinesi: 550 ms'den sonra iskelet, 3 sn'de "yavaş" uyarısı, 10 sn'de zaman aşımı.
Türkçe metin, doğru şekilde
Katlama noktasız ı'yı ayrı harf olarak ele alıyor, yanlış çözülmüş karakterleri iki kez çözmeden onarıyor ve 31.000,00 TL gibi fiyatları doğru okuyor. Hatalı bir okuma bir keresinde 31.000 yerine 31 göstermişti.
Backend'in yakalamadığı yazım hataları
Bir arama sonuç vermediğinde istemci sorguyu ürün başlıklarından çıkan bir sözlükle karşılaştırıp "bunu mu demek istediniz" öneriyor, sonra boş sayfa yerine önerilen ürünlere düşüyor.
Klavye ve ekran okuyucular
Input bir ARIA combobox ve listbox; sonuçlar ok tuşlarıyla geziliyor, / aramaya odaklıyor, ekran açıkken odak içeride tutuluyor ve kapanınca geri dönüyor, azaltılmış hareket ayarı animasyonları kapatıyor.
"Açılmıyor" için saha rehberi
Gerçek sitelerde sık sebepler ölü seçiciler, scriptleri bekleten çerez onay bantları, başka sağlayıcıların arama scriptleri ve cache'lenmiş config'ti. Bunları çözümleriyle yazdım; destek ekibi çoğu vakayı bana gelmeden çözebiliyor.
V2'den önce
Search V2, daha önce üzerinde çalıştığım searchandising sonuç sayfasından doğdu: aramadan sonra tüm sonuç sayfasını marka başına kategori, banner ve sıralama kurallarıyla render eden, config ile yönetilen bir script. Markaya özel kodun nerede bozulduğunu orada öğrendim; V2'nin markaya özel her şeyi config'e itmesinin sebebi bu.
Çözmeye değer bir problemin mi var?Birlikte çözelim