Шаблоны строк ES6 предотвращают разрывы строк

У меня есть длинная строка, которую я строю, используя строки шаблона ES6, но я хочу, чтобы она была без разрывов строк:

var string = 'As all string substitutions in Template Strings are JavaScript
              expressions, we can substitute a lot more than variable names.
              For example, below we can use expression interpolation to 
              embed for some readable inline math:'

console.log(string);

Результат:

As all string substitutions in Template Strings are JavaScript
expressions, we can substitute a lot more than variable names.
For example, below we can use expression interpolation to
embed for some readable inline math:

Мои ожидания:

As all string substitutions in Template Strings are JavaScript expressions, we can substitute a lot more than variable names. For example, below we can use expression interpolation to embed for some readable inline math:

Ответ 1

Это безумие.

Почти каждый ответ здесь предлагает запустить функцию времени выполнения, чтобы правильно отформатировать, во время сборки неправильно отформатированный текст oO Я единственный, кто шокирован этим фактом, особенно влиянием на производительность???

Как заявляет @dandavis, официальное решение (которое, между прочим, также является историческим решением для сценариев оболочки Unix) заключается в том, чтобы отделить возврат каретки, ну, в общем, с символом espace: \

'foo \
bar' === 'foo bar'

Простой, производительный, официальный, читаемый и похожий на оболочку в процессе

Ответ 2

Разрыв строки - это разрыв строки... Если вы создаете их вручную, я считаю очень ожидаемым, что вы получите их во время выполнения.

Кстати, я нахожу три обходных решения:

  • Настройте ваш IDE или редактор кода, чтобы сделать перенос слов, поэтому вам не нужно добавлять разрывы строк в свой код, если они вам не нужны: ваш редактор разбивает ваш код на две или более строк, если каждый предложение кода выходит за пределы настроенных максимальных символов.

  • Удалите разрывы строк с помощью String.prototype.replace:

var string = `As all string substitutions in Template Strings are JavaScript
expressions, we can substitute a lot more than variable names.
For example, below we can use expression interpolation to
embed for some readable inline math:`.replace(/\n/gm,"");

Предостережение: здесь вы используете функцию runtime для форматирования кода buildtime, который может выглядеть как анти-шаблон и иметь влияние на производительность

  1. Выполните эти разрывы строк кода с помощью конкатенаций:
var string = `As all string substitutions in Template Strings are JavaScript`
              + `expressions, we can substitute a lot more than variable names.`
              + `For example, below we can use expression interpolation to` 
              + `embed for some readable inline math:`;

В моем случае я бы пошел с параметром # 1.

Ответ 3

Если у вас есть ES6, вы можете использовать теги. Например, тег stripIndent из библиотеки общих тегов:

Установить через:

npm install common-tags --save

Требовать через:

const stripIndent = require('common-tags/lib/stripIndent')

Использовать как:

stripIndent'
  As all string substitutions in Template Strings are JavaScript
  expressions, we can substitute a lot more than variable names.
  For example, below we can use expression interpolation to
  embed for some readable inline math:        
'

Изменить: Как уже упоминалось в комментариях, вам, вероятно, нужно выбрать const oneLine = require('common-tags/lib/oneLine'): const oneLine = require('common-tags/lib/oneLine') для желаемого результата.

Больше информации о вышеупомянутой ссылке на общие теги, а также в этом блоге

Ответ 4

Я лично предпочитаю внешний вид соединения с массивом:

var string = [
  `As all string substitutions in Template Strings are JavaScript`,
  `expressions, we can substitute a lot more than variable names.`,
  `For example, below we can use expression interpolation to`,
  `embed for some readable inline math:`
].join(' ');

Ответ 5

  • Либо сконфигурируйте IDE для создания оберток и используйте строку шаблона с 1 линией, как в первом фрагменте кода.

  • Либо используйте \ escape буквальный символ непосредственно перед разрывом строки.

    Пример:

    const string = '1st line\
    2nd line\ 
    3rd line'; 
    

    Но это не спасет вас от проблем с выравниванием пространства.

  • Либо используйте конкатенацию ES5 старой школы с "+".

    Пример:

    const string = '1st line' + 
                   '2nd line' + 
                   '3rd line'; 
    
  • Либо используйте hack с пустой строкой шаблона var $ {''}:

    Пример:

    const string = '1st line${'' 
                   }2nd line${'' 
                   }3rd line';
    

1-й способ намного лучше, потому что:

  • меньше символов (размер аспекта)
  • нет операций во время выполнения (аспект производительности)

Ответ 6

В ES6 я предпочитаю использовать комбинацию из двух лучших ответов здесь (\ в сочетании с .replace()). Преимущество комбинирования функции замены с escape-символом означает, что вы можете поддерживать постоянный формат вашего кодового блока с остальным кодом.

/\s{2}/g - это регулярное выражение, выбирающее любой экземпляр из двух или более последовательных пробелов.

const myMessage = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis id urna \
    ligula. Suspendisse lobortis ex ut vestibulum venenatis. Donec imperdiet ante odio, \
    nec malesuada diam tristique eget. Lorem ipsum dolor sit amet, consectetur adipiscing \
    elit. Cras in vulputate tellus.'
  .replace(/\s{2,}/g, "");

Это выводит простую непрерывную строку.

"Lorem ipsum dolor sit amet, consitteur adipiscing elit. Duis id urna ligula. Suspendisse lobortis ex ut vestibulum venenatis. Donec imperdiet ante odio, nec malesuada diam tristique eget. Lorem ipsum dolor sit amet, последовательный статус".