Kodunuzun hangi ortamda çalıştığını anlamaya çalışmayla ilgili sorun, herhangi bir nesnenin değiştirilebileceği ve bildirilebileceğidir, bu da hangi nesnelerin çevreye özgü olduğunu ve program tarafından değiştirildiğini anlamayı imkansız hale getirir.
Ancak, hangi ortamda bulunduğunuzdan emin olmak için kullanabileceğimiz birkaç püf noktası var.
Alt çizgi kütüphanesinde kullanılan genel kabul görmüş çözümle başlayalım:
typeof module !== 'undefined' && module.exports
Bu teknik aslında sunucu tarafı için mükemmel, require
işlev çağrıldığında, this
nesneyi boş bir nesneye sıfırlar ve module
sizin için yeniden tanımlar , yani herhangi bir dış müdahale konusunda endişelenmenize gerek yoktur. Kodunuz yüklendiği require
sürece güvendesiniz.
Ancak, herkes module
aradığınız nesne gibi görünmesini sağlamak için kolayca tanımlayabildiğinden, bu tarayıcıda ayrılır . Bir yandan bu istediğiniz davranış olabilir, ancak kütüphane kullanıcısının genel kapsamda hangi değişkenleri kullanabileceğini de belirler. Belki birisi module
, exports
içinde başka bir kullanım için adı olan bir değişken kullanmak istemektedir . Bu olası değildir, ancak başka bir ortamın bu değişken adını kullanması nedeniyle başka hangi değişkenleri kullanabileceğimizi kime görebiliyoruz?
Ancak, hile, komut dosyanızın genel kapsamda yüklendiğini varsayarsak (bir komut dosyası etiketi aracılığıyla yüklenirse olur), bir değişken bir dış kapanışta ayrılamaz, çünkü tarayıcı buna izin vermez . Şimdi düğümde, this
nesne boş bir nesne olduğunu unutmayın, ancak module
değişken hala kullanılabilir. Bunun nedeni dış bir kapanışta beyan edilmiş olmasıdır. Böylece ekstra bir kontrol ekleyerek alt çizginin kontrolünü düzeltebiliriz:
this.module !== module
Bununla, bir kişi module
tarayıcıda genel kapsamda beyan ederse , this
nesnenin içine yerleştirilir , bu da testin başarısız olmasına neden olur, çünkü this.module
modülle aynı nesne olacaktır. Düğümde, this.module
yoktur ve module
bir dış kapak içinde bulunur, bu nedenle eşdeğer olmadığı için test başarılı olacaktır.
Böylece, son test:
typeof module !== 'undefined' && this.module !== module
Not: Bu artık module
değişkenin global kapsamda serbestçe kullanılmasına izin verse de, yeni bir kapatma oluşturarak ve module
bunun içinde bildirerek , daha sonra komut dosyasını bu kapatma içine yükleyerek bunu tarayıcıda atlamak hala mümkündür . Bu noktada kullanıcı, düğüm ortamını tamamen çoğaltır ve umarım ne yaptıklarını bilir ve bir düğüm stili gereksinimi yapmaya çalışır. Kod bir komut dosyası etiketinde çağrılırsa, yeni dış kapaklardan yine de güvende olacaktır.