我想在我所有的 Javascript 源文件上运行 JSHint,但其中一些有一些嵌入的 Django 模板标记。JSHint 在这个标记上抛出了大量错误。
有没有办法...
- 告诉 JSHint 忽略这个标记
- 使用一些虚拟数据运行 Djnago 模板解析器以生成呈现的 js 文件的所有排列,然后在其上运行 JSHint?
我想我可以写一堆代码来做#2,但我想知道是否有更简单的方法。
我想在我所有的 Javascript 源文件上运行 JSHint,但其中一些有一些嵌入的 Django 模板标记。JSHint 在这个标记上抛出了大量错误。
有没有办法...
我想我可以写一堆代码来做#2,但我想知道是否有更简单的方法。
根据标记,您可以使用 JavaScript 注释“隐藏”Django 标记。我们这样做,例如:
// {% if cond %}
someJavaScriptCode();
// {% else %}
somethingElse();
// {% endif %}
// {% include "script.js" %}
唯一的问题是您在 script.js 中添加了一个空行——否则//
会占用您那里的第一行合法的 JavaScript 代码。我写了一个简单的助手{% includejs %}
来自动为我做这件事。
实际上有一种规范的方法可以从 JSHint 中隐藏 Django 标记(或任何其他内容):
/* 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*/
你也可以使用这个丑陋的解决方案。jslint 认为“stuff =”是评论的一部分。
var stuff;
/* {{ '*' + '/' }}
stuff = {{ variable_containing_json_object_or_list }};
// */
我发现使用 --extract 标志往往会起作用。它还消除了模板中可能包含的任何 html 代码。
jshint --extract=always your_template_file.html
就个人而言,我在通过 jslint 工具传递 django javascript 模板时遇到了 3 个问题:
正如 Anton Kovalyov 建议的那样,它们可以很容易地隐藏在 javascript 注释中:
// {{ if some_flag }}
console.log("Conditional log");
// {{ endif }}
显而易见的解决方案是将 django 标签括在双引号中。然而值得记住的是,如果变量内容没有正确转义,生成的代码可能无效:
var javascript_var = "{{ context_var|escapejs }}";
埃德温的伎俩有效:
var javascript_var;
/* {{ '*' + '/' }}
javascript_var = {{ context_json_string_var }};
// */
如果您在 html 模板中包含 javascript 源模板,则可以在其中声明一个“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();