Как запустить JSHint для файлов с разметкой шаблона Django? - PullRequest
5 голосов
/ 26 марта 2012

Я хотел бы запустить JSHint для всех моих исходных файлов Javascript, но некоторые из них имеют некоторую встроенную разметку шаблона Django.JSHint генерирует массу ошибок в этой разметке.

Есть ли способ либо ...

  1. Сказать JSHint игнорировать эту разметку
  2. Запустить шаблон Djnagoсинтаксический анализатор с некоторыми фиктивными данными для генерации всех перестановок визуализированного js-файла и последующего запуска JSHint для этого?

Я предполагаю, что мог бы написать кучу кода для выполнения # 2, но мне интересно, есть либолее простой способ.

Ответы [ 5 ]

3 голосов
/ 26 марта 2012

В зависимости от разметки вы можете избежать «скрытия» разметки Django с комментариями JavaScript.Мы делаем это, например:

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

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

Единственное, что вы запускаете script.js с пустой строки - в противном случае // будет использовать первую допустимую строку кода JavaScript, которая у вас есть.Я написал простой помощник {% includejs %}, который делает это для меня автоматически.

2 голосов
/ 04 апреля 2017

На самом деле существует канонический способ скрыть разметку Django (или любой другой контент) от JSHint:

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

То же самое для JSLint будет:

/*ignore jslint start*/
javascript_var = {{ context_json_string_var }};
/*ignore jslint end*/
1 голос
/ 15 декабря 2014

Я обнаружил, что использование флага --extract имеет тенденцию работать.Он также избавляет от любого HTML-кода, который вы можете иметь в шаблоне.

jshint --extract=always your_template_file.html
1 голос
/ 22 декабря 2012

Вы также можете использовать это уродливое решение. jslint считает, что «stuff =» является частью комментария.

var stuff;
/* {{ '*' + '/' }}
stuff = {{ variable_containing_json_object_or_list }};                      
// */
0 голосов
/ 13 сентября 2013

Лично я столкнулся с 3 проблемами при передаче шаблонов javascript django через инструмент jslint:

Контрольные структуры

Их можно легко спрятать в комментариях javascript, как предложил Антон Ковалев:

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

Строковые переменные

Очевидное решение - заключить тег django в двойные кавычки. Однако стоит помнить, что сгенерированный код может быть недействительным, если содержимое переменной не экранировано должным образом:

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

Сложные структуры, сериализованные в json

трюк Эдвина работает:

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

Если вы включите исходный шаблон javascript в шаблон html, вы можете объявить там функцию «getter» и получить к ней доступ из сценария javascript:

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

В таком случае исходный код javascript будет выглядеть довольно приемлемо:

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