2012-03-26 9 views
5

Me gustaría ejecutar JSHint en todos mis archivos fuente de Javascript, pero varios de ellos tienen algunas marcas de plantillas de Django incorporadas. JSHint arroja una tonelada de errores en este marcado.¿Cómo ejecutar JSHint en archivos con marcado de plantilla de Django?

¿Hay una manera de cualquiera ...

  1. Dile JSHint ignorar esta marcado
  2. Ejecutar el analizador plantilla Djnago con algunos datos ficticios para generar todas las permutaciones de archivo de la rendido js y luego ejecutar JSHint ¿en ese?

Supongo que podría escribir un montón de código para hacer # 2 pero me pregunto si hay una manera más fácil.

Respuesta

3

Dependiendo de un marcado, puede salirse con la suya "ocultando" el marcado de Django con comentarios de JavaScript. Hacemos esto, por ejemplo:

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

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

Lo único es que hay que empezar script.js con una línea en blanco de otro modo // va a comer la primera línea legítima de código JavaScript que tiene allí. Escribí un simple ayudante {% includejs %} que hace eso automáticamente.

+0

Por lo tanto, esto se pone supere el 95% de mis problemas y es una solución sencilla y sencilla, pero ahora me preocupan los errores o, más apropiadamente, los que faltan porque estoy probando contra AMBAS ramas del IF. ¿Alguna vez encuentras que eso es un problema en la práctica? –

+1

Sí, tuve ese problema. Pero terminé evitándolo porque redefiní nuestra aplicación de manera que las plantillas de Django se usan solo para obtener datos dinámicos. Todo lo demás es JavaScript sin procesar en CDN. No estoy seguro si es útil en absoluto, lo siento. : - \ –

+0

Gracias, eso no ayuda –

1

También podría utilizar esta solución fea. jslint piensa que "stuff =" es parte del comentario.

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

En lo personal, me encontré con 3 problemas al pasar django javascript plantillas a través de la herramienta de JSLint:

Las estructuras de control

Ellos pueden ser fácilmente escondidos en JavaScript comentarios, al igual que Anton Kovalyov propuso:

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

Las variables de cadena

La solución obvia es incluir la etiqueta django entre comillas dobles. Sin embargo, cabe recordar que el código generado puede no ser válido si el contenido de la variable no está correctamente escapó:

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

estructuras complejas serializados a JSON

truco de Edwin funciona:

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

Si incluye la plantilla de origen de JavaScript en la plantilla html, puede declarar una función "captador" allí y acceder desde la secuencia de comandos javascript:

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

En tal caso, la fuente de JavaScript se vería bastante aceptable:

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

que he encontrado que el uso de la bandera --extract tiende a funcionar. También elimina cualquier código html que pueda tener en la plantilla.

jshint --extract=always your_template_file.html 
2

En realidad no es una forma canónica para ocultar Django marcado (o cualquier otro contenido) de JSHint:

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

Lo mismo para JSLint sería:

/*ignore jslint start*/ 
javascript_var = {{ context_json_string_var }}; 
/*ignore jslint end*/ 
Cuestiones relacionadas