5

我想在我所有的 Javascript 源文件上运行 JSHint,但其中一些有一些嵌入的 Django 模板标记。JSHint 在这个标记上抛出了大量错误。

有没有办法...

  1. 告诉 JSHint 忽略这个标记
  2. 使用一些虚拟数据运行 Djnago 模板解析器以生成呈现的 js 文件的所有排列,然后在其上运行 JSHint?

我想我可以写一堆代码来做#2,但我想知道是否有更简单的方法。

4

5 回答 5

3

根据标记,您可以使用 JavaScript 注释“隐藏”Django 标记。我们这样做,例如:

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

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

唯一的问题是您在 script.js 中添加了一个空行——否则//会占用您那里的第一行合法的 JavaScript 代码。我写了一个简单的助手{% includejs %}来自动为我做这件事。

于 2012-03-26T18:00:16.043 回答
2

实际上有一种规范的方法可以从 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*/
于 2017-04-04T04:29:33.940 回答
1

你也可以使用这个丑陋的解决方案。jslint 认为“stuff =”是评论的一部分。

var stuff;
/* {{ '*' + '/' }}
stuff = {{ variable_containing_json_object_or_list }};                      
// */
于 2012-12-21T20:35:27.907 回答
1

我发现使用 --extract 标志往往会起作用。它还消除了模板中可能包含的任何 html 代码。

jshint --extract=always your_template_file.html
于 2014-12-15T16:21:32.363 回答
0

就个人而言,我在通过 jslint 工具传递 django javascript 模板时遇到了 3 个问题:

控制结构

正如 Anton Kovalyov 建议的那样,它们可以很容易地隐藏在 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 }};                      
// */

如果您在 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();
于 2013-09-13T06:28:18.553 回答