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