2012-03-26 9 views
5

Chciałbym uruchomić JSHint na wszystkich moich źródłowych plikach JavaScript, ale kilka z nich ma wbudowany znacznik szablonów Django. JSHint zgłasza mnóstwo błędów w tym znaczniku.Jak uruchomić JSHint na plikach z znacznikami szablonów Django?

Czy istnieje sposób albo ...

  1. Powiedz JSHint zignorować ten Markup
  2. Run na Djnago parser szablonów z niektórych danych manekina do generowania wszystkich permutacji świadczonych js pliku, a następnie uruchomić JSHint Na tym?

Zakładam, że mógłbym napisać parę kodu do zrobienia # 2, ale zastanawiam się, czy jest łatwiejszy sposób.

Odpowiedz

3

W zależności od znaczników można uniknąć "ukrywania" znaczników Django za pomocą komentarzy JavaScript. Robimy to, na przykład:

// {% if cond %} 
someJavaScriptCode(); 
// {% else %} 
somethingElse(); 
// {% endif %} 

// {% include "script.js" %} 

Jedyną rzeczą jest to, że trzeba zacząć script.js z pustym line-inaczej // zje pierwszego legalnego linię kodu JavaScript tam masz. Napisałem prostego pomocnika {% includejs %}, który robi to automatycznie.

+0

Tak, ten dostaje minęło 95% moich problemów i jest fajnym, prostym rozwiązaniem, ale teraz martwię się błędami lub bardziej poprawnymi brakującymi błędami, ponieważ testuję przeciwko OBU działom IF. Czy uważasz, że jest to problem w praktyce? –

+1

Tak, miałem ten problem. Ale ostatecznie uniknęliśmy tego, ponieważ refaktoryzowałem naszą aplikację w sposób, w jaki szablony Django są używane tylko do pobierania dynamicznych danych. Cała reszta to surowe JavaScript na CDN. Nie jestem pewien, czy to w ogóle pomocne, przepraszam. : - \ –

+0

Dzięki, to pomaga –

1

Można również użyć tego brzydkiego rozwiązania. jslint uważa, że ​​"stuff =" jest częścią komentarza.

var stuff; 
/* {{ '*' + '/' }} 
stuff = {{ variable_containing_json_object_or_list }};      
// */ 
0

Osobiście spotkałem 3 problemy podczas przechodzenia Django javascript szablonów za pomocą narzędzia jslint:

struktur kontroli

Można je łatwo ukryć w JavaScript komentarzach, tak jak zaproponowano Anton Kovalyov:

// {{ if some_flag }} 
console.log("Conditional log"); 
// {{ endif }} 

zmienne String

Oczywistym rozwiązaniem jest umieszczenie tagu django w podwójnych cudzysłowach. Warto jednak pamiętać, że wygenerowany kod może być nieważny, jeśli zmienna treść nie jest właściwie uciekł:

var javascript_var = "{{ context_var|escapejs }}"; 

złożonych struktur szeregowane do JSON

sztuczkę Edwina działa:

var javascript_var; 
/* {{ '*' + '/' }} 
javascript_var = {{ context_json_string_var }};      
// */ 

Jeśli umieścisz szablon źródła javascript w szablonie html, możesz zadeklarować funkcję "getter" i uzyskać do niego dostęp ze skryptu javascript:

<script type="text/javascript">function getIt() { return {{ context_var }}; };</script> 
<script type="text/javascript">{% include 'script.js' %}</script> 

W takim przypadku źródłem javascript wyglądałby całkiem akceptowalne:

/*global getIt*/ 
var haveIt = getIt(); 
1

Odkryłam, że używając --extract flagę ma tendencję do pracy. Pozbywa się też kodu html, który możesz mieć w szablonie.

jshint --extract=always your_template_file.html 
2

Właściwie jest kanoniczny sposób ukryć Django znaczników (lub innych treści) z JSHint:

/* jshint ignore:start */ 
javascript_var = {{ context_json_string_var }}; 
/* jshint ignore:end */ 

To samo dla JSLint byłoby:

/*ignore jslint start*/ 
javascript_var = {{ context_json_string_var }}; 
/*ignore jslint end*/ 
Powiązane problemy