Оберніть довгий буквальний рядок шаблону на багаторядковий без створення нового рядка в рядку


142

Як у шаблоні літералів es6, як можна обернути довгий літерал шаблону до мультилінійки, не створюючи нового рядка в рядку?

Наприклад, якщо це зробити:

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

Тоді він створить новий рядок символ для рядка, як його інтерпретувати, щоб мати новий рядок. Як можна обернути довгий шаблон прямого шаблону на кілька рядків, не створюючи новий рядок?


2
FWIW продовження ліній важко читати і крихке проти несподіваних пробілів, тому я віддаю перевагу рішенням Монте-Джонса над рішенням Codingintrigue. FWIW Посібник зі стилів Google рекомендує рішення Монте-Джонс, а керівництво AirBnB рекомендує замість цього використовувати дуже довгий рядок - тобто не рекомендує продовження ліній. FWIW, я не зміг знайти цю тему у швидкій перевірці інших посібників зі стилів.
Том О'Нілл

Відповіді:


192

Якщо ви введете продовження рядка ( \) у точці нового рядка в прямому значенні, воно не створить новий рядок на виході:

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

1
Не впевнений, я розумію, що ти маєш на увазі. Чи можете ви навести приклад відповіді ?
CodingIntrigue

1
У моєму випадку це не так просто, оскільки різні змінні беруться з файлів конфігурацій coffeescript тощо. Мм .. здається, що це працює інакше, але чомусь там додається порожній простір
Ville Miekk-oja

1
Якщо ви використовуєте продовження рядка в першому рядку, це не працює для мене (вузол v7)
Danielo515,

2
Якщо ви використовуєте це в тесті, іноді він не повертає ту саму рядок. Я вирішив свої головні болі, використовуючи делін, який просто1.1k Airbnb library
iarroyo

45
Це рішення не працює добре з відступами (і відступи є поширеними в розробці). Символ після \ у новому рядку повинен бути першим символом у цьому рядку. Це означає, що and continues...на новому рядку потрібно починати з 0-ї позиції, порушуючи правило відступу.
KingJulian

54

Це стара. Але придумали. Якщо ви залишите пробіли в редакторі, він розмістить їх там.

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`;

Добре, але частиною причиною цього я є те, щоб уникнути символу "+". Це робить код важче для читання і більше дратівливо працювати.
dgo

21

Ви можете просто з'їсти розриви рядків усередині шаблону буквально.

// 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'));


3
Це дуже хороший злом, але він не вдається, якщо prettierу вашому IDE налаштований гарний формат (на зразок ). prettierзавершує це назад до однієї лінії.
Rvy Pandey

11

EDIT : Я створив крихітний модуль NPM за допомогою цієї утиліти. Він працює в Інтернеті та в 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.`;

Це має недолік, можливо, несподіваної поведінки, якщо майбутній розробник не звик до синтаксису тегів шаблону або якщо ви не використовуєте описову назву функції, але зараз це виглядає як найчистіше рішення.


8

Іншим варіантом є використання 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('')

3

Використовуйте старе і нове. Літеральні шаблони чудові, але якщо ви хочете уникнути тривалих літералів, щоб мати компактні рядки коду, об'єднайте їх і ESLint не спричинить суєту.

const text = `a very long string that just continues`
  +` and continues and continues`;
console.log(text);

1

Як і у відповіді Дуга, це прийнято моїм конфігурацією TSLint і його монітор автоформатування IntelliJ залишається недоторканим:

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

0

Рішення, запропоноване @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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.