Javascript 如何在带有Django模板标记的文件上运行JSHint?
我想在我所有的Javascript源文件上运行JSHint,但其中有几个有一些嵌入的Django模板标记。JSHint在这个标记上抛出大量错误 有没有一种方法可以Javascript 如何在带有Django模板标记的文件上运行JSHint?,javascript,django,jshint,Javascript,Django,Jshint,我想在我所有的Javascript源文件上运行JSHint,但其中有几个有一些嵌入的Django模板标记。JSHint在这个标记上抛出大量错误 有没有一种方法可以 告诉JSHint忽略此标记 使用一些伪数据运行Djnago模板解析器,以生成呈现的js文件的所有排列,然后对其运行JSHint 我想我可以编写一堆代码来完成#2,但我想知道是否有更简单的方法。根据标记,您可以通过JavaScript注释“隐藏”Django标记。我们这样做,例如: // {% if cond %} someJavaSc
我想我可以编写一堆代码来完成#2,但我想知道是否有更简单的方法。根据标记,您可以通过JavaScript注释“隐藏”Django标记。我们这样做,例如:
// {% if cond %}
someJavaScriptCode();
// {% else %}
somethingElse();
// {% endif %}
// {% include "script.js" %}
唯一的问题是,您必须以一个空行启动script.js,否则
/
将吃掉您在那里的第一行合法JavaScript代码。我写了一个简单的助手,可以自动帮我完成这个任务。你也可以使用这个丑陋的解决方案。jslint认为“stuff=”是评论的一部分
var stuff;
/* {{ '*' + '/' }}
stuff = {{ variable_containing_json_object_or_list }};
// */
就我个人而言,我在通过jslint工具传递django javascript模板时遇到了3个问题: 控制结构 它们可以很容易地隐藏在javascript注释中,正如Anton Kovalyov提出的:
// {{ 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>
我发现使用--extract标志会起作用。它还可以删除模板中可能包含的任何html代码
jshint --extract=always your_template_file.html
实际上,有一种规范的方法可以从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*/
所以,这让我克服了95%的问题,这是一个很好的简单解决方案,但现在我担心错误,或者更恰当地说是遗漏错误,因为我正在测试IF的两个分支。你在实践中发现过这个问题吗?是的,我确实有这个问题。但最终避免了它,因为我以Django模板仅用于获取动态数据的方式重构了我们的应用程序。其他一切都是CDN上的原始JavaScript。对不起,我不知道这是否有用-\在本例中,如何处理单个变量include,例如,
{{variable\u name}}
?我们仅在字符串中使用Django变量。我们有一个更复杂的对象(只有一个),它实际上包含了我们需要的所有东西,我们将其字符串化,然后对其进行解析。类似这样:var data=“{{jsonData|parse}”代码>
/*ignore jslint start*/
javascript_var = {{ context_json_string_var }};
/*ignore jslint end*/