211

在 es6 模板文字中,如何将长模板文字包装到多行而不在字符串中创建新行?

例如,如果您这样做:

const text = `a very long string that just continues
and continues and continues`

然后它将为字符串创建一个新行符号,将其解释为有一个新行。如何在不创建换行符的情况下将长模板文字包装到多行?

4

11 回答 11

275

如果在文字中的换行符处引入行符( \),则不会在输出中创建换行符:

const text = `a very long string that just continues\
and continues and continues`;
console.log(text); // a very long string that just continuesand continues and continues
于 2016-05-19T10:56:04.207 回答
81

这是一个旧的。但它出现了。如果您在编辑器中留下任何空格,它会将它们放在那里。

if
  const text = `a very long string that just continues\
  and continues and continues`;

只需执行正常的 + 符号

if
  const text = `a very long string that just continues` +
  `and continues and continues`;
于 2017-07-17T20:54:19.387 回答
30

您可以只吃模板文字中的换行符。

// Thanks to https://twitter.com/awbjs for introducing me to the idea
// here: https://esdiscuss.org/topic/multiline-template-strings-that-don-t-break-indentation

const printLongLine = continues => {
    const text = `a very long string that just ${continues}${''
                 } and ${continues} and ${continues}`;
    return text;
}
console.log(printLongLine('continues'));

于 2018-05-13T19:07:22.560 回答
19

另一种选择是使用Array.join,如下所示:

[
    'This is a very long string. ',
    'It just keeps going ',
    'and going ',
    'and going ',
    'and going ',
    'and going ',
    'and going ',
    'and going',
].join('')
于 2020-01-05T16:10:44.817 回答
14

编辑:我用这个实用程序制作了一个小型 NPM 模块。它适用于 web 和 Node,我强烈推荐它而不是我下面答案中的代码,因为它更加健壮。如果您手动将换行符输入为 ,它还允许在结果中保留换行符\n,并在您已经将模板文字标签用于其他内容时提供功能:https ://github.com/iansan5653/compress-tag


我知道我在这里回答迟了,但接受的答案仍然有一个缺点,即在换行后不允许缩进,这意味着你仍然不能仅仅通过转义换行来编写非常漂亮的代码。

相反,为什么不使用标记的模板文字函数

function noWhiteSpace(strings, ...placeholders) {
  // Build the string as normal, combining all the strings and placeholders:
  let withSpace = strings.reduce((result, string, i) => (result + placeholders[i - 1] + string));
  let withoutSpace = withSpace.replace(/\s\s+/g, ' ');
  return withoutSpace;
}

然后你可以标记任何你想要换行的模板文字:

let myString = noWhiteSpace`This is a really long string, that needs to wrap over
    several lines. With a normal template literal you can't do that, but you can 
    use a template literal tag to allow line breaks and indents.`;

如果未来的开发人员不习惯标记模板语法或者您不使用描述性函数名称,这确实有可能出现意外行为的缺点,但它现在感觉是最干净的解决方案。

于 2018-08-01T14:46:32.537 回答
6

使用旧的和新的。模板文字很棒,但如果你想避免冗长的文字以便拥有紧凑的代码行,请将它们连接起来,ESLint 不会引起大惊小怪。

const text = `a very long string that just continues`
  +` and continues and continues`;
console.log(text);
于 2019-05-11T09:47:22.490 回答
1

Doug 的回答类似,我的 TSLint 配置接受了这一点,并且我的 IntelliJ 自动格式化程序保持不变:

const text = `a very long string that just ${
  continues
} and ${continues} and ${continues}`
于 2019-10-17T14:07:03.233 回答
1

我参加聚会有点晚了,但是对于以后对这个问题的任何访问,我发现这个灵魂对我的用例来说是最优化的。

我正在运行 Node.js 服务器并希望以字符串格式返回 html,这就是我解决它的方法:


我的响应对象:

const httpResponse = {
    message: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent ultrices et odio eget blandit. Donec non tellus diam. Duis massa augue, cursus a ornare vel, pharetra ac turpis.',
    html: `
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
        <p>Praesent ultrices et odio eget blandit.</p>
        <ul>
            <li>Donec non tellus diam</li>
            <li>Duis massa augue</li>
        </ul>
    `,
}

发送 http 请求时,这将转换为以下内容:

{
    "message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent ultrices et odio eget blandit. Donec non tellus diam. Duis massa augue, cursus a ornare vel, pharetra ac turpis.",
    "html": "\n\t\t<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>\n\t\t<p>Praesent ultrices et odio eget blandit.</p>\n\t\t<ul>\n\t\t\t<li>Donec non tellus diam</li>\n\t\t\t<li>Duis massa augue</li>\n\t\t</ul>\n\t"
}

这当然是丑陋且难以处理的。因此,在我发送 http 之前,我会修剪字符串的每一行。

httpResponse.html = httpResponse.html.split('\n').map(line => line.trim()).join('')

这就是简单的代码行之后的结果。

{
    "message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent ultrices et odio eget blandit. Donec non tellus diam. Duis massa augue, cursus a ornare vel, pharetra ac turpis.",
    "html": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p><p>Praesent ultrices et odio eget blandit.</p><ul><li>Donec non tellus diam</li><li>Duis massa augue</li></ul>"
}
于 2020-11-26T12:41:29.793 回答
0

如果您的问题是相反的,并且您需要保留换行符,但由于某种原因,它们没有被尊重,只需在文本容器中添加 css 属性:

#yourTextContainer {
  white-space: pre-line;
}
于 2021-04-03T15:28:56.010 回答
0

The solution proposed by @CodingIntrigue is not working for me on node 7. Well, it works if I do not use a line continuation on the first line, it fails otherwise.

This is probably not the best solution, but it works without problems:

(`
    border:1px solid blue;
    border-radius:10px;
    padding: 14px 25px;
    text-decoration:none;
    display: inline-block;
    text-align: center;`).replace(/\n/g,'').trim();
于 2017-02-06T10:57:16.477 回答
0

这个npm包允许您执行以下操作...

import { oneLine } from 'common-tags';

const foo = oneLine`foo
bar
baz`;

console.log(foo); // foo bar baz
于 2021-04-13T11:49:49.523 回答