将长模板文字行包装为多行而不在字符串中创建新行
Wrap long template literal line to multiline without creating a new line in the string
在 es6 模板文字中,如何在不在字符串中创建新行的情况下将长模板文字包装成多行?
例如,如果您这样做:
const text = `a very long string that just continues
and continues and continues`
然后它将为字符串创建一个新的行符号,将其解释为有一个新行。如何在不创建换行符的情况下将长模板文字包装成多行?
如果您在文字中的换行点引入 line continuation (\
),它不会在输出中创建换行符:
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
@CodingIntrigue 提出的解决方案在节点 7 上对我不起作用。好吧,如果我不在第一行使用续行,它会起作用,否则会失败。
这可能不是最好的解决方案,但可以正常工作:
(`
border:1px solid blue;
border-radius:10px;
padding: 14px 25px;
text-decoration:none;
display: inline-block;
text-align: center;`).replace(/\n/g,'').trim();
这是旧的。但它出现了。如果您在编辑器中留下任何空格,它将把它们放在那里。
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`;
您可以只吃掉模板文字中的换行符。
// 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'));
编辑:我用这个实用程序制作了一个微型 NPM 模块。它适用于 Web 和 Node,我强烈推荐它超过我下面答案中的代码,因为它更健壮。如果您手动将换行符输入为 \n
,它还允许在结果中保留换行符,并为您已经将模板文字标签用于其他内容的情况提供功能:https://github.com/iansan5653/compress-tag
我知道我来晚了,但是接受的答案仍然有换行后不允许缩进的缺点,这意味着您仍然不能仅通过转义换行符来编写非常好看的代码。
相反,为什么不使用 tagged template literal function?
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.`;
如果未来的开发人员不习惯标记的模板语法或者如果您不使用描述性函数名称,这确实有可能出现意外行为的缺点,但它感觉是目前最干净的解决方案。
旧的和新的一起使用。模板字面量很棒,但如果你想避免冗长的字面量以拥有紧凑的代码行,请将它们连接起来,ESLint 不会引起大惊小怪。
const text = `a very long string that just continues`
+` and continues and continues`;
console.log(text);
与 类似,这已被我的 TSLint 配置接受,并且未被我的 IntelliJ 自动格式化程序修改:
const text = `a very long string that just ${
continues
} and ${continues} and ${continues}`
另一种选择是使用 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('')
我参加派对有点晚了,但是对于以后对这个问题的任何访问,我发现这个解决方案最适合我的用例。
我是 运行 一个 Node.js 服务器,想要 return 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 之前,我 trim 字符串的每一行。
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>"
}
如果您的问题恰恰相反,您需要保留换行符但由于某种原因,它们没有得到尊重,只需在文本容器中添加 css 属性:
#yourTextContainer {
white-space: pre-line;
}
此 npm 软件包允许您执行以下操作...
import { oneLine } from 'common-tags';
const foo = oneLine`foo
bar
baz`;
console.log(foo); // foo bar baz
在 es6 模板文字中,如何在不在字符串中创建新行的情况下将长模板文字包装成多行?
例如,如果您这样做:
const text = `a very long string that just continues
and continues and continues`
然后它将为字符串创建一个新的行符号,将其解释为有一个新行。如何在不创建换行符的情况下将长模板文字包装成多行?
如果您在文字中的换行点引入 line continuation (\
),它不会在输出中创建换行符:
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
@CodingIntrigue 提出的解决方案在节点 7 上对我不起作用。好吧,如果我不在第一行使用续行,它会起作用,否则会失败。
这可能不是最好的解决方案,但可以正常工作:
(`
border:1px solid blue;
border-radius:10px;
padding: 14px 25px;
text-decoration:none;
display: inline-block;
text-align: center;`).replace(/\n/g,'').trim();
这是旧的。但它出现了。如果您在编辑器中留下任何空格,它将把它们放在那里。
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`;
您可以只吃掉模板文字中的换行符。
// 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'));
编辑:我用这个实用程序制作了一个微型 NPM 模块。它适用于 Web 和 Node,我强烈推荐它超过我下面答案中的代码,因为它更健壮。如果您手动将换行符输入为 \n
,它还允许在结果中保留换行符,并为您已经将模板文字标签用于其他内容的情况提供功能:https://github.com/iansan5653/compress-tag
我知道我来晚了,但是接受的答案仍然有换行后不允许缩进的缺点,这意味着您仍然不能仅通过转义换行符来编写非常好看的代码。
相反,为什么不使用 tagged template literal function?
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.`;
如果未来的开发人员不习惯标记的模板语法或者如果您不使用描述性函数名称,这确实有可能出现意外行为的缺点,但它感觉是目前最干净的解决方案。
旧的和新的一起使用。模板字面量很棒,但如果你想避免冗长的字面量以拥有紧凑的代码行,请将它们连接起来,ESLint 不会引起大惊小怪。
const text = `a very long string that just continues`
+` and continues and continues`;
console.log(text);
与
const text = `a very long string that just ${
continues
} and ${continues} and ${continues}`
另一种选择是使用 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('')
我参加派对有点晚了,但是对于以后对这个问题的任何访问,我发现这个解决方案最适合我的用例。
我是 运行 一个 Node.js 服务器,想要 return 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 之前,我 trim 字符串的每一行。
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>"
}
如果您的问题恰恰相反,您需要保留换行符但由于某种原因,它们没有得到尊重,只需在文本容器中添加 css 属性:
#yourTextContainer {
white-space: pre-line;
}
此 npm 软件包允许您执行以下操作...
import { oneLine } from 'common-tags';
const foo = oneLine`foo
bar
baz`;
console.log(foo); // foo bar baz