Javascript 将eslint与模板语言结合使用

Javascript 将eslint与模板语言结合使用,javascript,jinja2,eslint,Javascript,Jinja2,Eslint,我们有一个javascript文件,它可以包含基于用户配置的各种功能组合。我想使用模板语言(可能是jinja2)来管理内容 然而,我们使用eslint来检查格式/样式,显然,jinja2标记将打破这一点 我看到两种选择: 忽略{{..}和{%..%}之间的部分(不确定这是否可行) 使用eslint有配置的模板语言(是否存在?) 我找不到关于这两个选项的信息。是否有方法执行上述任一操作,或者我是否需要同时使用不同的路径?可以包含预处理方法。此方法将脚本的内容和文件名作为参数,并将代码块数组返回

我们有一个javascript文件,它可以包含基于用户配置的各种功能组合。我想使用模板语言(可能是jinja2)来管理内容

然而,我们使用eslint来检查格式/样式,显然,jinja2标记将打破这一点

我看到两种选择:

  • 忽略
    {{
    ..
    }
    {%
    ..
    %}
    之间的部分(不确定这是否可行)
  • 使用eslint有配置的模板语言(是否存在?)
我找不到关于这两个选项的信息。是否有方法执行上述任一操作,或者我是否需要同时使用不同的路径?

可以包含
预处理方法。此方法将脚本的内容和文件名作为参数,并将代码块数组返回给lint。因此,一种选择是编写一个插件,使用
预处理
方法将脚本读入字符串,然后对与Jinja2语法匹配的模式执行字符串替换

例如,我们从中了解到默认分隔符是:

  • 语句:
    {%…%}
  • 表达式:
    {{…}
  • 注释:
    {{#…}
  • 行语句:
    ###
我们可以创建与这些分隔符匹配的正则表达式模式:

  • 语句:
    \{%(.*?%\}
  • 表达式:
    \{[{%]([\s\s]*?)[}%]\}
  • 注释:
    \{{{}([\s\s]*?)\}
  • 行语句:
    \\\([\s\s]*?)\\\\
因此,在
preprocess
方法中,我们可以将这些模式与
replace
结合使用,用有效的JavaScript替换脚本的Jinja2部分。这将导致ESLint“跳过”Jinja2部件

简而言之,这就是插件所做的@Goran.it在他上面的评论中所建议的。这个插件的唯一问题是,模式可能在一些非Jinja2事物上匹配(例如,误报),或者在一些Jinja2事物上不匹配(例如,误报)。因此,您可能需要根据您的用例稍微调整模式

下面是一个代码片段示例,它使用来自eslint插件jinja的模式来处理一个简单的Jinja2模板。然后,您可以在此输出上运行ESLint,它应该是无错误的:

let scriptString=`{#将普通jinja变量转换为字符串}
var a='这是'+{{some_variable}};
{#如果它已经在字符串中,则用空格#包装它}
var b='这是{{other_variable}}';
var c='这是{{另一个{u one['field']}}';
{#if else语句转换为(…,…)表达式#}
var d={%if something%}'这是某物{%else%}null{%endif%};
{#任何其他语句都会变成注释}
{%i在[1,2,3]}
控制台日志(a、b、c、d);
{%endfor%}`;
函数processScript(str){
常量引号=“”;
const processed=str
//用js注释替换jinja注释
.replace(/\{{{}([\s\s]*?)\}/g,(str,val)=>`/*${val}*/`)
//将if-else语句视为(…,…)
.replace(/\{%(?\s*if.*?%\}/g,(str,val)=>`(/*${val.substr(1)}*/`)
.replace(/\{%(?\s*(else | elif)。*?)%\}/g,(str,val)=>`,/*${val.substr(1)}*/`)
.replace(/\{%(?\s*endif\s*-?)%\}/g,(str,val)=>`/*${val.substr(1)}*/)`)
//用js注释替换jinja语句
.replace(/\{%(.*?%\}/g,(str,val)=>`/*${val}*/`)
//将字符串中的jinja表达式标记替换为空格
.replace(/\{[{%]([\s\s]*?)[}%]\}/g,str=>str.replace(/['''']/g',))
.replace(/(['“])(.*?\1/g,str=>str.replace(/(\{{124;\}})/g',)
//用字符串替换jinja表达式
.replace(/\{(.*?\}}}/g,(str,val)=>`${quote}${val}${quote}`);
已处理退货;
}

console.log(processScript(scriptString))
@Goran.it我确实看到了这个软件包,但在每周3次的下载中,我想我对此表示怀疑。公平地说,这确实值得更多的调查。实际上这很奇怪。你有JS文件,你想在这个文件中使用jinja2吗?我稍后会对此进行更详细的研究,但这看起来是一个很有潜力的答案-感谢你在w把它写下来!谢谢。如果我还能帮忙的话,请告诉我。