JSLint veya JSHint JavaScript doğrulamasını kullanmalı mıyım? [kapalı]


454

Şu anda JavaScript'imi JSLint'e göre onaylıyorum ve ilerleme kaydediyorum, özellikle de Jquery kütüphanesi ile çalışırken daha iyi JavaScript yazmama yardımcı oluyor.

Şimdi JSHint , JSLint çatalı ile karşılaştım .
Bu yüzden, JavaScript'in çalıştığı web uygulamalarını merak ediyorum, bu da çalışmak için daha iyi veya en geçerli doğrulama aracıdır:

  • JSLint veya JSHint?

Şimdi bir doğrulama mekanizmasına karar vermek ve ilerlemek istiyorum, bunu istemci tarafı doğrulaması için kullanın.

Ve jshint ve jslint arasındaki fark? Lütfen tek bir javascript örneğinde açıklayınız.

Bağlantılar:

  1. jshint - http://www.jshint.com/

  2. jslint - http://jslint.com/


4
ESLint nasıl ? Eksik olmasına rağmen: Combine this with the previous 'var' statement-> Do not mix 'require' and other declarations, paradoks.
nyuszika7h



JS geliştiricisi değil. Ancak JSHint kod inceleme sürecinde çok yararlı buldum. Bunu öneririm.
Chetan Vashistth

Yanıtlar:


156

[EDIT]
Bu cevap düzenlendi. Bağlam için orijinal cevabı aşağıda bırakıyorum (aksi takdirde yorumlar anlamlı olmaz).

Bu soru ilk olarak sorulduğunda, JSLint JavaScript için ana linting aracıydı. JSHint yeni bir JSLint çatalıydı, ancak henüz orijinalinden çok farklı değildi.

O zamandan beri, JSLint oldukça statik kalırken, JSHint çok şey değiştirdi - JSLint'in daha düşmanca kurallarının çoğunu attı, bir sürü yeni kural ekledi ve genellikle daha esnek hale geldi. Ayrıca, daha esnek ve daha fazla kural seçeneğine sahip başka bir ESLint aracı da mevcuttur.

Orijinal cevabımda, kendinizi JSLint kurallarına uymaya zorlamamanız gerektiğini söyledim; neden bir uyarı attığını anladığınız sürece, uyarıyı çözmek için kodu değiştirip değiştirmeyeceğiniz konusunda kendiniz bir karar verebilirsiniz.

2011'den itibaren JSLint'in son derece katı kuralları ile bu makul bir tavsiyeydi - JSLint testini geçebilecek çok az JavaScript kod kümesi gördüm. Bununla birlikte, günümüzün JSHint ve ESLint araçlarında bulunan daha pragmatik kurallarla, kodunuzu sıfır uyarı ile geçirmeye çalışmak çok daha gerçekçi bir öneridir.

Hala bir linter'in kasıtlı olarak yaptığınız bir şeyden şikayet edeceği durumlar olabilir - örneğin, her zaman kullanmanız gerektiğini biliyorsunuz, ===ancak sadece bir kez kullanmak için iyi bir nedeniniz var ==. Ancak o zaman bile, ESLint ile söz eslint-disablekonusu çizgiyi belirleme seçeneğiniz vardır, böylece kodunuzun geri kalanı kurala uyurken sıfır uyarı ile geçen bir tiftik testine devam edebilirsiniz. (bu tür şeyleri çok sık yapmayın!)


[ORİJİNAL CEVAP TAKİP EDİYOR]

Elbette JSLint kullanın. Ancak sonuçlara ve hakkında uyardığı her şeyi düzeltmeye kapılmayın. Kodunuzu geliştirmenize yardımcı olacaktır ve potansiyel hataları bulmanıza yardımcı olacaktır, ancak JSLint'in şikayet ettiği her şey gerçek bir sorun değildir, bu yüzden işlemi sıfır uyarı ile tamamlamanız gerektiğini düşünmeyin.

Herhangi bir önemli uzunluk veya karmaşıklığa sahip olan herhangi bir Javascript kodu, ne kadar iyi yazılmış olursa olsun, JSLint'te uyarılar üretecektir. Bana inanmıyorsanız, JQuery gibi bazı popüler kütüphaneleri çalıştırmayı deneyin.

Bazı JSLint uyarıları diğerlerinden daha değerlidir: hangilerine dikkat edileceğini ve hangilerinin daha az önemli olduğunu öğrenin. Her uyarı dikkate alınmalıdır, ancak herhangi bir uyarıyı silmek için kodunuzu düzeltmek zorunda hissetmeyin; koda bakmak ve bundan memnun olduğunuza karar vermek gayet iyi; JSlint'in beğenmediği şeylerin aslında doğru olan şeyler olduğu zamanlar vardır.


3
JsHint'in en iyi kısmı, jQuery'yi kabul etmek için bayraklara sahip olması ve jslint kadar can sıkıcı / katı olmamasıdır. Örn: for (i = 0; i < dontEnumsLength; i++)atar Unexpected '++'tamam nerede. vb.
RaphaelDDL

2
Lütfen kuralları göz ardı etmeyin, bu linter ile yapabileceğiniz en kötü şey. Sadece kurun veya yapamıyorsanız değiştirin. JSHint ve JSCS kombinasyonu harika
AuthorProxy

JSHint, "Bir atama veya işlev çağrısı bekleniyordu ve bunun yerine bir ifade gördü." sadece operasyonlar için kullanılan bir üçlü için. Mozilla dokümantasyonu: "Farklı operasyonlar yapmak için boş alanda üçlü değerlendirmeler de kullanabilirsiniz" diyor. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/… @AuthorProxy Mozilla'ya gidiyorum ve JSHint'i görmezden geliyorum. Afedersiniz.
dewd

1
Şimdiye kadar, ESLint, airbnb gibi popüler yapılandırmalarla birlikte endüstrinin genel olarak yönlendirildiği yön gibi görünüyor.
jinglesthula

369

tl; dr paket servisi olan restoran :

Kendiniz veya ekibiniz için çok yüksek bir standart arıyorsanız, JSLint. Ama bu mutlaka bir standart değil, sadece bir standart, bazıları bize dogmatik olarak Doug Crockford adlı bir javascript tanrısından geliyor. Biraz daha esnek olmak veya ekibinizde JSLint'in görüşlerini satın almayan veya JS ile diğer C-ailesi dilleri arasında düzenli olarak ileri geri giden bazı eski uzmanlarınız varsa, JSHint'i deneyin.

uzun versiyon :

Çatalın arkasındaki mantık JSHint'in neden var olduğunu oldukça iyi açıklıyor:

http://badassjs.com/post/3364925033/jshint-an-community-driven-fork-of-jslint http://anton.kovalyov.net/2011/02/20/why--forked-jslint-to -jshint /

Bu yüzden sanırım Crockford merkezli olmaktan ziyade "toplum odaklı" bir fikir. Pratik olarak, JSHint genellikle JSLint'in üzerinde çalıştığı birkaç üslup ve küçük sözdizimsel "görüş" üzerinde biraz daha yumuşaktır (veya en azından yapılandırılabilir veya agnostik).

Örnek olarak, aşağıdaki A ve B'nin her ikisinin de iyi olduğunu düşünüyorsanız veya A'nın B'de bulunmayan bir veya daha fazla yönüyle kod yazmak istiyorsanız, JSHint tam size göre. B'nin tek doğru seçenek olduğunu düşünüyorsanız ... JSLint. Eminim başka farklılıklar da vardır, ancak bu birkaçını vurgular.

A) JSHint'i kutusundan çıkarır - başarısız JSLint

(function() {
  "use strict";
  var x=0, y=2;
  function add(val1, val2){
    return val1 + val2;
  }
  var z;
  for (var i=0; i<2; i++){
    z = add(y, x+i);
  }
})();

B) Hem JSHint hem de JSLint'i geçer

(function () {
    "use strict";
    var x = 0, y = 2, i, z;
    function add(val1, val2) {
       return val1 + val2;
    }
    for (i = 0; i < 2; i += 1) {
        z = add(y, x + i);
    }
}());

Şahsen JSLint koduna bakmak çok güzel buluyorum ve katılmadığım tek zor özellik, bir işlevde birden fazla var bildirimi ve for-loop var i = 0bildirimleri ve işlev bildirimleri için boşluk uygulamalarından bazıları .

JSLint'in zorladığı boşluk alanlarından birkaçı, kötü olmak zorunda değilim, ancak ailenin diğer dilleri (C, Java, Python, vb.) İçin oldukça standart bazı boşluklarla senkronize değilim. Javascript'te de sözleşmeler olarak izledi. Gün boyunca bu dillerden çeşitli yazı yazdığım ve kodumuzda Lint stili boşluktan hoşlanmayan ekip üyeleriyle çalıştığım için JSHint'i iyi bir denge olarak görüyorum. Meşru bir hata veya gerçekten kötü bir form olan şeyleri yakalar, ancak JSLint'in umursamadığım stilistik görüşler veya sözdizimsel nitpicks için (bazen devre dışı bırakamayacağım yollarla) yaptığı gibi havlamıyor.

Pek çok iyi kütüphane Lint'able değildir, bu da bana göre JSLint'in bazılarının sadece "iyi kod" un 1 versiyonunu (aslında iyi kod) itmekle ilgili olduğu gerçeğini gösteriyor. Ama sonra tekrar, aynı kütüphaneler (ya da diğer iyi kütüphaneler) muhtemelen Hint'able değildir, bu yüzden touché.


11
... itiraf etmeliyim ki, son zamanlarda JS (ve CSS de tesadüfen) kodlama stilleri açısından çoğaldığını gördüğüm tavsiyenin profesyonel olmayan kalitesinden hayal kırıklığına uğradım. Sanki belirli bir dile aşılama, uzman olmayan uygulayıcıların (yani hedef kitle) ihtiyaçlarını geçersiz kılmıştır. Bu, iyi tavsiyeye ihtiyaç duydukları düşünüldüğünde böyle bir utançtır ve daha iyi bilmeden en iyi uygulama olarak lanse edilen şeyleri körü körüne takip edecek ve sürdürecektir. Genellikle, diğer diller için daha yerleşik kullanıcı toplulukları tarafından kabul edilen diğer standartlarla uyumsuzdur. :(
Lee Kowalkowski

67
JSLint zorlaştırır, nedenini @LeeKowalkowski for (var i = 0; ...; i++)çünkü olduğunu gelmez döngü müstakil olun. Kapsamı iişlevdir. Sözdizimi bir blok kapsamı oluşturuyor gibi görünüyor, ancak değil ve daha az deneyimli JavaScript programcıları ve birden çok dilde yazan insanlar bir değişkenin kapsamını yanlış anlamaya ve ince hatalara neden olabilir. Birçoğumuz (kendim dahil), tüm bildirimleri en üst düzeye çıkarmanın nasıl görünmeyeceğini beğenmeyebilir, ancak JavaScript'in blok kapsamına sahip olmadığı iyi bir hatırlatmadır.
Mark Evans

25
@MarkEvans Yalnızca döngüyü başka bir işleve taşırsanız, iyanlışlıkla küresel olmayacak görünümünden bağımsızdır . Aslında ikapsamlı engellemeyecek kapsamlı işlev olduğunu değişkenlere her zaman mümkün (olarak kullanılır nerede yakın olarak beyan edilmelidir üstündeki değişkenleri bildirmek için yeterli bir neden değildir programmers.stackexchange.com/questions/56585/... ).
Lee Kowalkowski

17
@MarkEvans Bence dil uygulama ayrıntılarına çok fazla odaklanıyorsunuz. Programlama standartları derleyiciler için değil insanlar için olmalıdır. Yaygın tuzakları yakalamak için statik bir kod analiz aracına güvenmek, ilk etapta onlardan kaçınan iyi alışkanlıkları benimsemenin yerini tutmaz. Basit bir döngü için bir yineleyici değişkeni gerektiren döngüden herhangi bir mesafe bildirilmelidir neden bir neden anlayamıyorum. Diğer diller için birçok kodlama standardı, değişkenlerin okunabilmeleri için mümkün olduğunca kullanıldıkları yere yakın olduğunu bildirmektedir. Bunu JS'de yapmamak için iyi bir neden görmedim.
Lee Kowalkowski

11
Bir döngü dışında bir yineleyici değişkeni kullanmak, bir linterın kontrol etmesi gereken şeydir.
Lee Kowalkowski

61

Javascript linting cephesinde başka bir olgun ve aktif olarak geliştirilmiş "oyuncu" var ESLint:

ESLint, ECMAScript / JavaScript kodunda bulunan kalıpları tanımlamak ve raporlamak için bir araçtır. Birçok açıdan, birkaç istisna dışında JSLint ve JSHint'e benzer:

  • ESLint, JavaScript ayrıştırma için Esprima'yı kullanır.
  • ESLint koddaki kalıpları değerlendirmek için bir AST kullanır.
  • ESLint tamamen takılabilir, her kural bir eklentidir ve çalışma zamanında daha fazlasını ekleyebilirsiniz.

Burada gerçekten önemli olan, özel eklentiler / kurallar ile genişletilebilir olmasıdır . Farklı amaçlar için zaten yazılmış birden fazla eklenti var. Diğerlerinin yanı sıra :

Ve elbette, çalıştırmak için seçim aracınızı kullanabilirsiniz ESLint:


1
Siz yazarken düzenleyicinizde çalışan bir linter sahibi olmanın değeri göz ardı edilemez. ESLint bu şekilde yoğun olarak kullanılmaktadır. JSLint veya JSHint editör desteğini (1 anekdot veri noktası) hiç duymadım.
jinglesthula

17

Aynı soruyu birkaç hafta önce sordum ve hem JSLint hem de JSHint'i değerlendiriyordum.

Bu sorudaki cevapların aksine, sonucum şu değildi:

Elbette JSLint kullanın.

Veya:

Kendiniz veya ekibiniz için çok yüksek bir standart arıyorsanız, JSLint.

JSHint'de JSLint ile hemen hemen aynı kuralları yapılandırabileceğiniz gibi. Bu yüzden, başarabileceğiniz kurallarda çok fazla fark olmadığını savunuyorum.

Dolayısıyla, bir diğerini seçmenin nedenleri teknik olmaktan daha politiktir.

Sonunda aşağıdaki nedenlerden dolayı JSHint ile gitmeye karar verdik:

  • JSLint'den daha yapılandırılabilir görünüyor.
  • Tek kişilik bir şovdan ziyade kesinlikle topluluk odaklı görünüyor ( Adam ne kadar havalı olursa olsun ).
  • JSHint OOTB kod stilimizle JSLint'den daha iyi eşleşti.

1
Kısa ve öz bir cevap için teşekkürler. Bu konu hakkındaki boşluklarımı çözdü.
akauppi

13

Üçüncü bir öneride bulunacağım, Google Closure Derleyici (ve ayrıca Closure Linter ). Burada çevrimiçi deneyebilirsiniz .

Kapatma Derleyicisi, JavaScript'in daha hızlı indirilmesini ve çalıştırılmasını sağlayan bir araçtır. JavaScript için gerçek bir derleyicidir. Kaynak dilden makine koduna derlemek yerine JavaScript'ten daha iyi JavaScript'e derler. JavaScript'inizi ayrıştırır, analiz eder, ölü kodu kaldırır ve yeniden yazar ve kalanları en aza indirir. Ayrıca söz dizimini, değişken referansları ve türleri kontrol eder ve yaygın JavaScript tuzakları hakkında uyarır.


4
Kapatma Derleyicisi, linterın almadığı şeyi ne alır?
James McMahon

4
Mutlaka olması gerektiği zaman bu araç tarafından üretilen tek bir uyarı görmüyorum. JSLint ve JSHint aynı girdi için o kadar çok uyarı üretir ki ikisi de "çok fazla hata" verir.
wallyk

6
yeni bir projede kapanış kullandık ve bir daha yapmazdık. linter belirli kontrolleri çevirecek şekilde yapılandırılamaz (birçoğu umursamayacağınız şeylerdir) ve derleyici gerçekten sadece kapanış dostu kütüphanelerle (gerçekten orada olmayan) çalışıyorsanız işe yarar. Google dışında herhangi bir).
Robert Levy

4
Bu, Google Closure Comepiler'e tek başına atıfta bulunmaz, ancak Google'ın araçlarına her zaman bir tuz tanesi ile bakılmalıdır. Belirli Google hedeflerini çözmek için oluşturulmuştur ve hedeflerinize uygun olmayabilir.
Pacerier

@RobertLevy sahip olduğunuz deneyiminizi yorumladığınız için teşekkür ederiz ... javascript için google stil kılavuzunu okuyordum ve tüy bırakmayan program olarak kapatma derleyici tavsiye etti. ama şimdi görüyorum ki jslint ve jshint gibi diğerleri var
Trevor Boyd Smith

13

Önsöz: Bu hızla yükseldi. Ama çekmeye karar verdim. Bu cevap size ve diğer okuyuculara yardımcı olabilir.

Burada biraz taşındım

Kod İpucu

JSLint ve JSHint kullanmak için iyi bir araç olsa da, yıllar içinde arkadaşım @ugly_syntax'ın ne dediğini takdir etmeye geldim :

daha küçük tasarım alanı .

Bu, bir "zen keşiş" gibi, kişinin yapması gereken seçimleri sınırlandıran, daha üretken ve yaratıcı olabilen genel bir ilkedir.

Bu nedenle benim en sevdiğim sıfır yapılandırma JS kod stili:

Standart JS .

GÜNCELLEME :

Akış çok gelişti. Bununla birlikte, çok sayıda hata önlemenize yardımcı olacak JS'nize türler ekleyebilirsiniz. Ancak, örneğin türlenmemiş JS'yi arayüzlerken de yolunuzun dışında kalabilir. Bir şans ver!

Hızlı başlangıç ​​/ TL; DR

standardProjenize bağımlılık olarak ekleyin

npm install --save standard

Ardından package.json, aşağıdaki test komut dosyasını ekleyin:

"scripts": {
    "test": "node_modules/.bin/standard && echo put further tests here"
},

Geliştirirken daha üstün çıktı için npm install --global snazzyve yerine çalıştırın npm test.

Not: Sezgisel yöntemlere karşı tip kontrolü

Arkadaşım tasarımı yerden söz anılacaktır Elm ve ben o dilini denemeye davet ediyoruz.

Neden? JS aslında türlenmemiş özel bir dil sınıfı olan LISP'den esinlenmiştir . Elm veya Purescript gibi dil, işlevsel programlama dilleri olarak yazılmıştır .

Derleyicinin dili veya kendi programınızın kurallarını ihlal ettiğinizde sizi kontrol edebilmesi ve yönlendirebilmesi için özgürlüğünüzü kısıtlayın; programınızın boyutundan (LOC) bağımsız olarak.

Son zamanlarda genç bir meslektaşımız iki kez reaktif bir arayüz uyguladı: bir kez Elm'de, bir kez React'de; neden bahsettiğim hakkında bir fikir edinmek için bir göz atın.

Karşılaştır Main.elm(yazılmıştır) ⇔ index.js(türsüz, test yok)

(ps. React kodunun deyimsel olmadığını ve geliştirilebileceğini unutmayın)

Son bir açıklama,

gerçek şu ki JS türü çözülmemiş. Size kim yazım programlama öneririm ?

Bakın, JS ile farklı bir alandayız: türlerden arınmış, uygun bir tür vermek zor veya imkansız olan şeyleri kolayca ifade edebiliriz (ki bu kesinlikle bir avantaj olabilir).

Ancak türler olmadan, programlarımızı kontrol altında tutmak için çok az şey var, bu yüzden testler ve (daha az genişletmek için) kod stillerini uygulamaya zorlanıyoruz.

İlham almak için LISP'ye (örn. ClojureScript ) bakmanızı ve kodlarınızı test etmeye yatırım yapmanızı öneririm . Bir fikir edinmek için alt ekibin yolu bölümünü okuyun .

Barış.


Neden inişli çıkışlı? Kesinlikle umrumda değil, ama OP "daha iyi JavaScript yazmama yardımcı oluyor" yazdığından bu yararlı bir cevap mı? Ne düşünüyorsun?
teller

1
Mainvelm ve index.js bağlantılarınız 404s
cs01

1
Soru açıkça alternatifler istemeyen jslint veya jshint'di.
jzacharuk

1
GIF bir oy hak ediyor.
sr9yar

8

Peki, manuel tiftik ayarları yapmak yerine tüm tiftik ayarlarını JS dosyamızın en üstüne ekleyebiliriz, ör.

Bu dosyadaki tüm global değişkenleri şöyle bildir:

/*global require,dojo,dojoConfig,alert */

Aşağıdaki tüm tiftik ayarlarını bildirin:

/*jslint browser:true,sloppy:true,nomen:true,unparam:true,plusplus:true,indent:4 */

Bu size yardımcı olacağını umuyoruz :)


1

Aktif olarak geliştirilen başka bir alternatif daha var - JSCS - JavaScript Kod Stili :

JSCS, stil rehberinizi programlı olarak uygulamak için bir kod stili linteridir. JQuery, Airbnb, Google ve daha fazlası gibi popüler stil kılavuzlarından hazır ayarlar da dahil olmak üzere 150'den fazla doğrulama kuralını kullanarak projeniz için JSCS'yi ayrıntılı olarak yapılandırabilirsiniz.

Birden ile gelir hazır ayarlar sadece belirtilerek seçim yapabilecekleri presetiçinde .jscsrcyapılandırma dosyasının ve özelleştirmek - geçersiz kılmayı etkinleştirmek veya herhangi bir kural devre dışı bırakın:

{
    "preset": "jquery",
    "requireCurlyBraces": null
}

Popüler editörler için tasarlanmış eklentiler ve uzantılar da vardır.

Ayrıca bakınız:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.