2012-12-17 7 views
51

Ich habe mein JavaScript mit JSLint seit ungefähr 2 Jahren validiert und ab und zu gibt es Regeln, die sich ändern. Im Allgemeinen, wenn JSLint eine neue Regel einführt, gibt es ein Kontrollkästchen, um diese Regel beim Analysieren zu ignorieren, oder wenn Sie sie nicht ignorieren möchten, um Ihren Code damit kompatibel zu machen.Warum wurden die neuen JSLint-Fehler "Leerzeichen, keine Tabs" und "unsicheren Zeichen" eingeführt?

Als ich meine JSLint Validierung heute läuft, aber ich laufe in diese beiden neuen Fehler:

Benutzen Sie Leerzeichen, nicht Registerkarten.

Dies ist nicht der Fehler "Mischen von Tabs und Leerzeichen". Ich benutze nur Tabs. Dies ist eine kürzlich geänderte Version von "Mischen von Tabs und Leerzeichen", die Tabs generell nicht mehr erlaubt.

Und:

Unsafe Charakter.

*/

Unsicheres Zeichen.

_const: {

Es gibt keine neue Optionen zu ignorieren. Ich kann nicht verstehen, was unsicher ist über das Schließen eines Blockkommentars, warum es _const: {als unsicher, wenn ich nomen: true, (dangling _ in Bezeichnern) oder warum sollte ich plötzlich von Leerzeichen zu Tabs wechseln, wenn ich noch über die Konfiguration habe Einrücken von 4 Leerzeichen ist ein Tab.

Hat jemand eine Idee, warum diese eingeführt wurden, um zumindest zu verhindern, dass JSLint diese neuen Regeln ignoriert?

Update: Die Messy White Space Option funktioniert, um das Problem, aber es wäre anderes unerwartetes Verhalten verursachen:

if (condition) { 
    //   ^-- there is a space but it won't indicate an error 
+0

Bitte poste deine Linter Config. – oleq

+6

*/wird in JSLint als unsicher erachtet, weil der Ersteller von JSLint glaubt, dass es // sicherer ist, // Kommentare in jeder Zeile zu verwenden, anstatt Kommentare zu blockieren, da die Gefahr besteht, dass Sie versehentlich "* /" in Ihren Kommentar schreiben und schließe den Block zu früh. Persönlich ignoriere ich es. – Dawn

+0

@Dawn Ich bekomme es nicht nur bei dieser Linie, ich werde mit einem anderen aktualisieren, wo es noch weniger Sinn macht. –

Antwort

69

Nun, es wie Douglas Crockford sieht nur eine ganze Menge mehr Leute wechseln zu JSHint gemacht. Schauen Sie sich this commit an.

Der Fehler "Gemischte Leerzeichen und Tabulatoren" wurde entfernt, und an seiner Stelle wurde ein neuer Fehler "Leerzeichen, nicht Tabulatoren" hinzugefügt. Abgesehen davon gibt es eine kleine Änderung in diesem Diff, die die Ursache dafür zeigt. Die folgende Zeile (Kommentar hinzugefügt):

at = source_row.search(/ \t/); 
//     ^Space 

hat mit dieser ersetzt:

at = source_row.search(/\t/); 
//     ^No space! 

Nach dieser Suche gibt es eine if Aussage. Wenn die Bedingung true auswertet, wird die Warnung "Verwenden Sie Leerzeichen, nicht Tabs" ausgegeben. Hier ist diese Aussage:

if (at >= 0) { 
    warn_at('use_spaces', line, at + 1); 
} 

ich Hoffnung, dass dies nur ein wenig Aufsicht durch Crockford. Wie Sie sehen, wird JSLint jetzt diese Warnung auslösen, wenn Sie ein Tabulatorzeichen irgendwo verwenden.Leider sind seine Commit-Nachrichten völlig nutzlos und die Dokumentation scheint nicht aktualisiert worden zu sein, daher kann ich nichts anderes tun, als über die Gründe für diese Änderung zu spekulieren.

Ich schlage vor, dass Sie JSLint jetzt verlassen und zu JSHint wechseln.

+0

Vielen Dank für die Untersuchung. Der Wechsel von JSLint zu einem anderen Validator ist für mich keine Ost-Sache. Ich habe eine ganze Infrastruktur gebaut, um automatisierte Validierungen gegen JSLint laufen zu lassen ... –

+0

@ KonstantinD-Infragistics - JSHint begann das Leben als eine Gabelung von JSLint. Es sollte ziemlich einfach sein, sie zu tauschen. Wo es ein Werkzeug für JSLint gibt, gibt es normalerweise auch eines für JSHint (z. B. beide haben Node.js-Wrapper, mit denen Sie sie vom Terminal aus ausführen können). Können Sie die verwendete Version von JSLint alternativ steuern? –

+0

Ja, mein Node.js-Code lädt keine aktualisierte Version herunter und meine automatische Ausführung zeigt diese Fehler erst, wenn ich die jslint-Datei aktualisiere. Wenn Sie jedoch manuell nach Fehlern suchen möchten, können Sie dies auf jslint.com nicht mehr tun. –

12

Sie können den Fehler unterdrücken, indem Sie auf die Option "unordentlicher Leerraum" klicken.

+1

Es war sehr überraschend für mich, dass dies hat funktioniert. –

+0

Ich habe tatsächlich einen Fehler in dieser Problemumgehung gefunden, aber es ist immer noch das einzige, was bisher verfügbar ... –

+0

Was ist der Fehler, @ KonstantinD-Infragistics? –

7

Abhängig von Ihrem Editor/IDE können Sie einstellen, wie TAB funktioniert.

Zum Beispiel verwende ich Sublime Text. In der Nähe der unteren rechten Ecke gibt es eine Registerkarte Größe: 4.

Ich klickte darauf und legte es "Indent Using Spaces".

Dies aktualisiert alle meine Tabs Leerzeichen und JSLint Fehler verschwinden. Ich versuche, so wenig Optionen wie möglich mit JSLint zu verwenden, da ich möchte, dass mein Code gut strukturiert ist.

Ich benutze auch JSFormat, die Registerkarte auf der Grundlage meiner Editoren Einstellungen, so dass wenn ich fertig bin ich mein JSFormat, dann JSLint. Keine Fehler = fröhlicher Junge!

Ich hoffe, es hilft.

+0

Auch für vim, fügen Sie das einfach zu Ihrer .vimrc hinzu und sorgen Sie sich nie wieder darum: 'set tabstop = 4 shiftwidth = 4 expandtab' – gmeben

+13

Das Problem mit den meisten Editoroptionen von * Einzug mit Leerzeichen * ist, dass Sie einmal 'Tab' drücken, aber viermal' Backspace' drücken müssen. Es gibt keinen mir bekannten Editor, der Tabs-as-Spaces korrekt als eine einzige Entität behandelt. –

+0

Um dies zu bekämpfen, haben viele Editoren ihren eigenen Einzug und ihre eigenen Hotkeys. Zum Beispiel, mit sublime Text 'cmd +]' wird Einzug, während 'cmd + [' wird einrücken. Hilft, wenn Sie den Slop eines anderen aufräumen müssen. – TyMayn

4

zu beantworten warum JSLint jetzt eine Fehlermeldung über Registerkarten gibt, http://www.jslint.com/help.html gibt diese Begründung:

Tabs und Leerzeichen sollten nicht gemischt werden. Wir sollten nur eine in der Reihenfolge wählen, um die Probleme zu vermeiden, die von beiden kommen. Persönliche Präferenz ist ein äußerst unzuverlässiges Kriterium. Weder bietet ein mächtiger Vorteil gegenüber dem anderen. Vor fünfzig Jahren hatte Tab den Vorteil von weniger Speicher verbrauchen, aber Moores Gesetz hat diesen Vorteil beseitigt. Platz hat einen klaren Vorteil gegenüber Tab: Es gibt keinen zuverlässigen Standard für wie viele Leerzeichen ein Tab darstellt, aber es ist allgemein akzeptiert , dass ein Leerzeichen ein Leerzeichen belegt. Also Räume benutzen. Sie können mit den Tabs bearbeiten, wenn Sie müssen, aber stellen Sie sicher, dass es wieder Leerzeichen vor dem Festschreiben ist. Vielleicht eines Tages werden wir endlich einen universellen Standard für Tabs bekommen, aber bis dieser Tag kommt, ist die bessere Wahl Räume.

Im Wesentlichen möchte er, dass sich alle darüber einig werden, ob sie Tabulatoren oder Leerzeichen verwenden sollen, um zu verhindern, dass sie jemals gemischt werden. Er hat entschieden, dass die Konsistenz der Breite eines Raums die bessere Wahl ist, also sollten wir alle diese verwenden. Natürlich werden einige Leute mit dieser Denkweise nicht einverstanden sein (ich selbst eingeschlossen), aber das ist der Grund, warum JSLint diesen Fehler wirft.

+11

... das macht keinen Sinn. Wegen der definierten Breite sind die Leerzeichen NICHT konsistent ... weil manche Leute 2 Leerzeichen verwenden, manche 4, usw. Einige Einrückungen sind also doppelt so groß wie andere. Bei Tabs ist es einfach 1 Tab == der Einzug, und Ihr Editor mit Ihren Einstellungen bestimmt, wie weit dieser Eindruck als ... angesehen wird und jede Datei, die Tabs verwendet, wird genau das selbe für Sie anzeigen. Tab ist der perfekte Platzhalter für die Aussage "Es ist 1 Level von Einzug ... wie weit Sie das für Ihren Editor wollen", und jede Datei, die das verwendet, wird genau die gleichen Einrückungen haben. –