npm, Önbellek ve CSP

Script yerine npm paketi, dağıtılan dosyaların önbelleği, CSP ve service worker

Script etiketiyle kurulumun ötesindeki dört konu: script yerine npm paketi, Selwise'ın dağıttığı dosyaların önbellek davranışı, tarayıcı bildirimleri için service worker ve içerik güvenlik politikası (CSP) olan siteler. Standart kurulum için Widget Kurulumu.

npm paketi

Etiket ekleyemediğiniz ya da çalışma zamanının yaşam döngüsünü uygulama kabuğunun yönetmesini istediğiniz durumlarda (Next.js uygulamaları, SPA kabukları) @selwise/widget paketini kullanın:

npm install @selwise/widget
import Selwise from '@selwise/widget';

const widget = new Selwise();
await widget.init({
  siteKey: 'SITE_KEY',
  apiUrl: 'https://api.selwise.com/api/v1', // isteğe bağlı
  exposeGlobal: true,                       // window.Selwise'ı da kur
});
SeçenekTürVarsayılanAçıklama
siteKeystringyokZorunlu. Boşsa init() hiçbir şey yapmaz
apiUrlstringhttps://api.selwise.com/api/v1/api/v1 eksikse eklenir. Ortamda NEXT_PUBLIC_API_URL tanımlıysa o sizin verdiğinizi geçersiz kılar: yanlışlıkla tanımlı bir değişken istekleri başka bir ana bilgisayara yönlendirir
exposeGlobalbooleanfalsetrue ise örneği window.Selwise'a atar; destroy() onu temizler. Kuyruğa alınmış çağrılar (komut kuyruğu) yalnızca bu seçenekle oynatılır
localestring<html lang>Widget'ın konuşacağı dil (en, en-GB). Hesapta açık değilse hesabın varsayılan dili kullanılır. Bkz. Dil
  • Tarayıcıda çalışır. init() gerçek bir DOM ister; SSR sırasında çağrılırsa konsola init() must be called in a browser environment yazar ve hiçbir şey yapmaz. Modülü içe aktarmak her yerde güvenlidir. Next.js'te init()'i bir istemci bileşeninde useEffect içinde çağırın.
  • Uygulama kabuğu başına tek örnek. İki canlı örnek çift olay ve çift çizim demektir. Bir Selwise örneği oluşturup paylaşın, kabuk kapanırken destroy() çağırın.
  • Paket CDN sürümünden farklı olarak tek bir modül olarak gelir (arama, öneri, çizici parçaları birleşik, gzip ~130 KB); CDN sürümü yalnızca kullanılan parçaları ayrıca indirir. Sayfa performansı öncelikse CDN'i seçin.
  • Çıktı tipleri paketle gelir (WidgetConfig, ConsentState, TrackArgs, SelwiseDataLayer); ek olarak resolveApiUrl(input?) dışa aktarılır.

Tam yöntem listesi: JavaScript API. Mobil uygulamada bu paket değil, Mobil SDK kullanılır.

Dağıtılan dosyalar ve önbellek

CDN'de (https://widget.selwise.com) yalnızca client.js etiketini eklersiniz; geri kalanını widget gerektiğinde ve gereken özellik açıksa kendisi yükler. Parça adları içerik özetiyle birlikte (selwise-search.1a2b3c4d.js) yayınlanır.

Dosya (parça)Ne zaman yüklenir
client.jsHer zaman; ana giriş (gzip 50 KB bütçeli, bugün yaklaşık 25 KB)
selwise-policiesDeney, segment, sıklık sınırı ve çakışma çözümü (sayfa çizildikten sonra)
selwise-renderersKampanya şablonları gerektiğinde
selwise-consentÇerez onayı banner'ı gerektiğinde
selwise-datalayer, selwise-batcher, selwise-cartVeri katmanı köprüsü, olay toplama, mağaza sepetinin okunması
selwise-search, selwise-recoArama ya da öneri modülü açıkken
selwise-enrichment, selwise-onsite, selwise-tabtalk, selwise-scenarios, selwise-pushYalnızca o özellik kanalda etkinse
selwise-vendor, selwise-sanitize-css, selwise-sentryParçalar arası paylaşılan kütüphane (HTML temizleyici dahil), CSS temizleyici, hata raporlama
selwise-editorYalnızca panelden açılan görsel editör oturumunda; alışverişçi indirmez
selwise-sw.jsTarayıcı bildirimi için hizmet çalışanı; sizin alan adınızın kökünden sunulur, aşağıya bakın

Neyin ne kadar önbelleğe alındığı:

DosyaÖnbellekAnlamı
client.js5 dakika (max-age=300, stale-while-revalidate=60)Adı hiç değişmez; yeni sürüm en geç birkaç dakikada ulaşır. Tarayıcıya giden değer, CDN'in ayarlarına göre daha uzun olabilir
Özetli parçalar (ad.1a2b3c4d.js)1 yıl, immutableDosya adı içeriğiyle değişir
/v1/... yolundaki her dosya1 yıl, immutableAşağıya bakın
Diğer dosyalar1 saatselwise-sw.js dahil

/v1/client.js adresi de vardır ve uzun önbelleğe alınır, ama bu bir sürüm sabitleme değildir: yeni sürümler aynı yola yayınlanır; yalnızca tarayıcı bir yıl boyunca yeniden sormaz. Bir parça adı değiştiğinde eski bir client.js'in istediği eski parça artık sunulmayabilir. Standart /client.js yolunu kullanın.

CDN dosyalarına robots.txt ile indekslemeye kapalıdır ve her kaynağa CORS yanıtı verilir (crossorigin öznitelikli bir <link> ya da <script> sorunsuz çalışır).

Web bildirimi için service worker

Kanalda tarayıcı bildirimi (web push) kullanıyorsanız selwise-sw.js dosyasını alan adınızın kökünden (https://magaza.com/selwise-sw.js) sunmanız gerekir. Bir hizmet çalışanının kapsamı sunulduğu klasörden geniş olamaz ve bildirim her sayfada çalışmalıdır; bu yüzden CDN'imizden sunmak işe yaramaz (hizmet çalışanı bizim alan adımıza kaydolurdu). Dosyayı panelde Ayarlar → Mesajlaşma Sağlayıcıları (Settings → Messaging Providers) ekranındaki web bildirimi bölümündeki Download selwise-sw.js bağlantısından ya da https://widget.selwise.com/selwise-sw.js adresinden indirin. Dosya yalnızca iki iş yapar: bildirimi çizer ve tıklanınca bağlantıyı açar. fetch olaylarını yakalamaz, yani sitenizin önbelleğine ya da çevrimdışı davranışına dokunmaz.

İzin istemi hiçbir zaman sayfa yüklenirken çıkmaz; tarayıcılar bir siteye ömür boyu tek istem hakkı tanır. İstemi bir düğmeden çağırmak için Selwise.requestPushPermission() kullanılır, bkz. JavaScript API.

CSP ve içerik güvenlik politikası

Siteniz bir Content-Security-Policy yayınlıyorsa widget'ın çalışması için şu kaynaklara izin vermeniz gerekir. Kodda ulaşılan alan adları yalnızca bunlardır:

YönergeGerekenNeden
script-srchttps://widget.selwise.comclient.js ve tüm tembel parçalar aynı kökten yüklenir
connect-srchttps://api.selwise.comBütün API çağrıları (fetch, sendBeacon): yapılandırma, olaylar, sipariş, arama, öneri
img-srcGörsellerinizin ve ürün görsellerinizin ana bilgisayarları, https://api.selwise.comKampanya ve kart görselleri; panelden yüklenen görseller api.selwise.com/api/v1/public/media/... adresinden gelir
style-src'unsafe-inline'Widget style öğeleri ve satır içi style nitelikleri ekler (kampanya stilleri, zenginleştirme CSS'i)
worker-src'self'Yalnızca web bildirimi kullanıyorsanız: /selwise-sw.js kök hizmet çalışanı

Ek olarak bazı özellikler satır içi kod gerektirir; yalnızca onları kullanıyorsanız izin verin:

ÖzellikGerekenNeden
Komut kuyruğu ve sipariş takibi snippet'iscript-src için 'unsafe-inline' ya da bir nonce/hashSizin sayfanızdaki satır içi script'ler
Özel Script'lerscript-src için 'unsafe-inline'Widget bu script'leri sayfaya satır içi script öğesi olarak ekler; nonce taşıyamaz
Kampanya, öneri ya da ürün kartı özel JavaScript alanı ve özel sepete ekleme betiğiscript-src için 'unsafe-eval'Bu alanlar new Function ile çalıştırılır

Kullandığınız modüllere bakarak en dar kümeyi seçin: özel script ve özel JavaScript kullanmıyorsanız yalnızca ilk beş satır yeter. Bir politika ihlali tarayıcı konsolunda Refused to load/connect ... olarak görünür (bkz. Takip Sorunları).

Önerilen yöntem: önce Report-Only modunda deneyin. Content-Security-Policy-Report-Only ile bir hafta raporlama toplayın, widget'ın ihlal üretmediğini doğrulayın, sonra uygulayın.

Son güncelleme: 22 Ekim 2026