【问题标题】:Prevent line breaks in ES6 template string防止 ES6 模板字符串中的换行符
【发布时间】:2018-03-04 21:11:34
【问题描述】:

ESLint:403行超过最大行长120(max-len)

我有一个长字符串,我使用 ES6 模板字符串构建,但我希望它没有换行符:

var string = `Let me be the 'throws Exception’ to your 'public static void 
              main (String[] args)’. I will accept whatever you give me my ${love}.`
console.log(string);

结果:

 Let me be the 'throws Exception’ to your 'public static void 
 main (String[] args)’. I will accept whatever you give me xxx.

我的期望:

Let me be the 'throws Exception’ to your 'public static void main (String[] args)’. I will accept whatever you give me xxx.

要求

  1. 我无法禁用 eslint 规则,因为必须强制执行。

  2. 我不能将数据放在单独的文件中,因为数据是动态的。

  3. 我无法连接多个较短的字符串,因为那工作量太大。

【问题讨论】:

  • 不想换行就不要写了?
  • ESLint:第403行超过最大行长120(max-len)
  • myStr.replace("\n","");
  • Ragarding c,它很可爱,但并不像你期望的那样工作。可以使用自定义标记功能使其转换字符串。查看更新。
  • 你能改一下规则吗?它有eslint.org/docs/rules/max-len#ignoretemplateliterals 作为选项。

标签: javascript ecmascript-6 template-strings


【解决方案1】:

这是预期的行为。模板文字解决的重要问题之一是multiline strings

在源代码中插入的任何换行符都是模板文字的一部分。

如果字符串需要进一步处理,可以通过其他 JS 特性来完成,比如正则表达式:

var string = `Let me be the 'throws Exception’ to your 'public static void 
              main (String[] args)’. I will accept whatever you give me.`
              .replace(/[\n\r]+ */g, ' ');

String.raw 是用于转换模板文字的内置函数。可以使用标签函数为模板文字提供自定义行为。应该注意的是,String.raw 在处理special characters 的方式上与默认模板转换器不同。如果它们在字符串中使用,则应使用unescape-js 或类似的辅助函数对其进行额外处理。

function singleLine(strsObj, ...values) {
  const strs = strsObj.raw
  .map(str => str.replace(/[\n\r]+ */g, ' '))
  .map(unescapeSpecialChars);
  return String.raw(
    {raw: strs },
    ...values
  );
}


var string = singleLine`Let me be the 'throws Exception’ to your 'public static void 
              main (String[] args)’. I will accept whatever you give me.`;

【讨论】:

  • 不,String.raw 有别的意思。考虑`\"`String.raw`\"` 之间的区别。
  • @torazaburo 感谢您注意到这一点。我知道它与模板字符串的工作方式类似,所以是的,在直接调用时它的行为也是如此是有道理的。您是否知道如何偶然可靠地重新创建默认转换器?
  • @LokeshAgrawal 是的,oneLine 非常接近答案中列出的那个。这取决于是否需要进一步定制,例如应该如何处理多个换行符。
【解决方案2】:

达到目的的一个好方法是加入一个字符串数组:

var string = [
  `Let me be the 'throws Exception’ to your 'public static void`,
  `main (String[] args)’. I will accept whatever you give me my ${love}.`
].join(' ');

【讨论】:

    【解决方案3】:

    如果您的问题只是 EsLint 错误,您可以使用此功能忽略此特定行:/* eslint-disable max-len */

    老实说,这是最好的方法,因为您不会增加额外的复杂性。

    如果您开始使用正则表达式或连接,则您正在通过不使用连接来更改模板字符串的用途...

    【讨论】:

    • 我怎样才能只为一行启用它?
    • /* eslint-disable max-len / Line / eslint-enable max-len */ ??
    • 每当我需要做这样的事情时,这看起来就像增加了两行
    • @LokeshAgrawal 我怎样才能为一行启用它通过阅读文档?语法是// eslint-disable-line max-len
    【解决方案4】:

    也使用字符串连接:

    var string=`abc`+`def`;
    console.log(string);
    

    产量:

    abcdef

    【讨论】:

      猜你喜欢
      • 2016-10-26
      • 2015-09-14
      • 2016-09-19
      • 1970-01-01
      • 2018-01-23
      • 2015-02-18
      • 1970-01-01
      相关资源
      最近更新 更多