2012-08-14 2 views
8

Ich möchte meine Anwendungslogik in mehrere Javascript-Dateien für die Gesundheit und Entwicklerfreundlichkeit getrennt, die im Ordner/src gespeichert sind. Diese Dateien sollten während des Erstellungsprozesses in /dist/app.js getönt und verkettet werden. Ich benutze Grunt für meinen Build-Prozess, da es bereits mit praktischen Lint- und Concat-Aufgaben ausgestattet ist.Wie löse ich Abhängigkeiten beim Linen einzelner Javascript-Dateien mit grunt?

 

    + 
    |- grunt.js 
    |- readme 
    |-vendors 
     |-backbone.js 
    |- src 
     |- core.js 
     |- user.js 
    |- dist 
     |-app.js 

Ich bin in ein lästiges Problem läuft. Ich benutze backbone.js für die Anwendungsstruktur, und die meisten meiner Quelldateien beginnen mit der Definition von Modellen durch Erweitern Backbone.Model. Beim Löschen dieser Dateien beschwert sich JSHint darüber, dass Backbone nicht definiert ist, und zwar zu Recht - das Backbone befindet sich außerhalb seines eigenen Verzeichnisses. Das Einbeziehen aller notwendigen Skripte in die richtige Reihenfolge ist etwas, von dem ich annehme, dass es im HTML getan wird. Jede einzelne Quelldatei sollte nur über sich selbst verfügen.

Ich weiß, dass ich diese undefined Warnungen unterdrücken kann durch undef Flagge Flusen in grunt.js zu falsche Einstellung, aber ich möchte es wahr, um über andere nicht definierte Variablen gewarnt zu werden gesetzt halten in meiner Anwendung, da es ein häufiger Tippfehler ist. Gibt es eine saubere Methode, um Grunt (oder Flusen) mitzuteilen, welche Dateien vor dem Linting aufgenommen werden sollen? Mache ich etwas falsch mit meinem Build-Prozess oder mit meiner Anwendungsarchitektur? Oder muss ich einfach damit leben?

Antwort

11

Die jshint Optionen können Sie eine Liste von Globals spezifizieren, die aus anderen Bibliotheken kommen Sie verwenden, in Ihrer grunt.js Datei:



    jshint: { 
     options: { 
     curly: true, 
     eqeqeq: true, 
     immed: false, 
     latedef: true, 
     newcap: true, 
     noarg: true, 
     sub: true, 
     undef: true, 
     boss: true, 
     eqnull: true, 
     browser: true 
     }, 

     globals: { 
     jQuery: true, 
     Backbone: true, 
     _: true 
     } 
    }, 

Note die globals Einstellung am unteren Ende. Dies ermöglicht JSHint, diese Variablen zu ignorieren, aber weiterhin Ihre undef: true Einstellung (wie oben gezeigt).

+0

Perfect! Vielen Dank! Ich war mir ziemlich sicher, dass es einen einfachen Weg dafür geben musste, aber die Dokumentation von grunt war nicht sehr klar und ich hatte keine Erfahrung mit JSHint. Danke noch einmal! – timkg

+2

Hinzufügen von etwas wie 'core.js' zu dem Beispiel' globals' in der Antwort würde Klarheit helfen. Ich kam aus einer Web-Storm-Perspektive und fragte mich, wie ich in meiner eigenen Bibliothek definierte Objekte hinzufügen würde, bevor ich erkannte, dass ich sie zu der Datei hinzufügen konnte. Vielleicht möchten Sie auch erwähnen, dass Sie die Optionen zu einer einzigen Datei hinzufügen können mit dem '/ * globalen Schlüssel: Wert, .. * /' Syntax – Snekse

+2

Ich bekam weiter "foo 'ist nicht definiert" bis ich die Globals verschoben Objekt innerhalb des Optionsobjekts. –

0

Ein alternativer Ansatz (das nicht auf Grunzen verlassen) ist ein jshint Kommentar in Ihre js Dateien hinzuzufügen:

/* global Backbone, jQuery, _ */ 
+1

Und wenn Ihr Skript einem globalen Wert einen Wert zuweisen muss, fügen Sie ': true' (keine Leerzeichen) danach hinzu. Zum Beispiel '/ * global Backbone, jQuery: true, _ * /' –

Verwandte Themen