Как мне сделать многострочную строку в node.js?

128

С появлением node.js многострочные строки становятся все более необходимыми в JavaScript.

  1. Есть ли особый способ сделать это в Node.JS, даже если он не работает в браузерах?
  2. Есть ли какие-то планы или, по крайней мере, запрос функции, который я могу поддержать?

Я уже знаю, что ты можешь использовать \n\ в конце каждой строки, это не то, что я хочу.

Брайан Филд
источник
1
Зачем вам нужно вставлять жесткие возвратные линии? Ничто в DOM не поддерживает это (кроме «pre»), и все другие распространенные типы возвращаемого значения не заботятся.
jcolebrand 02
Так что я не получаю вкладки слева без возврата справа. Мне нравится либо то, и другое, либо ничего. Прямо сейчас я использую print( '<div>')для печати свой HTML. У него нет ни вкладок, ни возврата, что «изящно», но было бы проще использовать <<EOF..EOFстроку в стиле Perl или файл JSP в стиле Java. В любом случае мне нужно иметь возможность вводить переменные в многострочную строку, когда она появляется. Я пока обойдусь без него.
Bryan Field
9
@jcolebrand: Node.JS в первую очередь не занимается манипуляциями с DOM. Это полноценная среда разработки приложений. См. Nodejs.org
Рой Тинкер
@RoyTinker: да, но в то время он называл браузеры и вдобавок отмечал \nнереализацию, так что ... это хорошо только браузеры.
jcolebrand
@GeorgeBailey Если вы все еще используете переполнение стека, не могли бы вы исправить здесь правильный ответ?
mikemaccana

Ответы:

165

узел v4 и текущие версии узла

Начиная с ES6 (и, соответственно, версий Node выше v4), в Javascript был добавлен новый внутренний тип "литерал шаблона" (обозначенный обратными галочками "" "), который также можно использовать для создания многострочных строк, как в :

`this is a 
single string`

который имеет значение: 'this is a\nsingle string'.

Обратите внимание , что перевод строки в конце первой строки будет включен в результирующую строку.

Были добавлены шаблонные литералы, позволяющие программистам создавать строки, в которых значения или код могут быть напрямую введены в строковый литерал без необходимости использования util.formatдругих шаблонов, как в:

let num=10;

console.log(`the result of ${num} plus ${num} is ${num + num}.`);

который напечатает «результат 10 плюс 10 будет 20.» к консоли.

Старые версии узла

Более старая версия узла может использовать символ "продолжения строки", позволяющий писать многострочные строки, такие как:

'this is a \
single string'

который имеет значение: 'this is a single string'.

Обратите внимание, что новая строка в конце первой строки не включается в результирующую строку.

Роб Райш
источник
Думаю, в конечном итоге я буду использовать stackoverflow.com/questions/805107/… . Я могу расширить его, чтобы использовать переменные. Это точно будет креативно! Но поскольку это Node.JS, мне не нужно беспокоиться о совместимости браузера, а в моем случае даже о совместимости версий.
Bryan Field
6
«Javascript не поддерживает многострочные строки ...» Он работает как в ES5, так и в V8 (движок Google JavaScript), так что предположительно в NodeJS (который использует V8). См. LineContinuation в [Раздел 7.8.4] * ( es5.github.com/#x7.8.4 ). Поддержка инструментов какое-то время может быть отрывочной.
TJ Crowder
Он есть в io.js, но еще не в Node.JS - я добавил ответ с еще парой ссылок
Simon D
1
Node 4.0+ теперь внутренне поддерживает многострочные строки.
Роб Райш, 03
46

Многострочные строки являются текущей частью JavaScript (начиная с ES6) и поддерживаются в node.js v4.0.0 и новее.

var text = `Lorem ipsum dolor 
sit amet, consectetur 
adipisicing 
elit.  `;

console.log(text);
Vijey
источник
2
Этот ответ должен быть немедленно поставлен на первое место! См. Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… для получения дополнительной информации о строках шаблона.
user3413723
2
Хотел бы отметить, что вы можете легко добавлять переменные, добавляя синтаксис $ {variablehere} внутри шаблона (`` галочки '')
Джозеф Астрахан,
40

Что именно вы ищете, когда имеете в виду многострочные строки?

Вы ищете что-то вроде:

var str = "Some \
    String \
    Here";

Что будет напечатано как «Some String Here»?

Если это так, имейте в виду, что приведенное выше является допустимым Javascript, но это не так:

var str = "Some \ 
    String \
    Here";

Какая разница? Пробел после \. Удачи отладки.

Роберт
источник
ну черт возьми. Он не позволит мне показать пробел после \, не помещая туда символ.
jcolebrand 02
1
@jcolebrand: Да, довольно весело, не так ли: P
Роберт
1
Это грязный прием. Пожалуйста, нет!
Raynos 02
1
Спасибо, @Robert, место после инсайта '\' сэкономило мне время!
gpestana
8

Взгляните на модуль mstring для node.js.

Это простой небольшой модуль, который позволяет вам иметь многострочные строки в JavaScript.

Просто сделай это:

var M = require('mstring')

var mystring = M(function(){/*** Ontario Mining and Forestry Group ***/})

получить

mystring === "Ontario\nMining and\nForestry\nGroup"

И это почти все.

Как это работает
В Node.js вы можете вызвать .toStringметод функции, и он предоставит вам исходный код определения функции, включая любые комментарии. Регулярное выражение захватывает содержимое комментария.

Да, это взлом. На основе однозначного комментария Доминика Тарра .


примечание: модуль (по состоянию на 13/12/11) не допускает пробелов перед закрытием ***/, поэтому вам придется взломать его самостоятельно.

Дэвид Мердок
источник
1
Или используйте свою ветку mstring, которая содержит исправление пробелов. Спасибо! github.com/davidmurdoch/mstring
Друска
6

Помимо того, что публикуют здесь, я слышал, что конкатенация может быть намного быстрее, чем присоединение в современных javascript vms. Смысл:

var a = 
[ "hey man, this is on a line",
  "and this is on another",
  "and this is on a third"
].join('\n');

Будет медленнее, чем:

var a = "hey man, this is on a line\n" + 
        "and this is on another\n" +
        "and this is on a third";    

В определенных случаях. http://jsperf.com/string-concat-versus-array-join/3

Кроме того, я считаю это одной из самых привлекательных функций в Coffeescript . Да, да, я знаю, ненавистники возненавидят.

html = '''
       <strong>
         cup of coffeescript
       </strong>
       '''

Это особенно удобно для HTML-фрагментов. Я не говорю, что это причина использовать его, но я действительно хочу, чтобы он приземлился в стране экма :-(.

мистифицировать

мистифицировать
источник
1
Единственное, что для меня не так с CoffeeScript, это то же самое, что не так с Groovy в последний раз, когда я проверял. Когда файл конвертируется из .coffeeв .js, номера строк перемешиваются. Я не пробовал CoffeeScript, но когда я попробовал Groovy, мне было довольно трудно отлаживать, не получая сгенерированные .javaфайлы.
Bryan Field
Я написал несколько достаточно крупных проектов в кофе. В конечном итоге вам придется смотреть на скомпилированный код. Однако его легко читать. imo, в сообществе node все еще существует неприемлемая стигма с coffeescript, хотя на нем написано несколько крупных проектов (zombie.js, pow, riak-js). В настоящее время я портирую некоторые из моих небольших OSS, потому что люди говорят: «О, кофе, фу!» И сразу же уходят, несмотря на то, что вам не нужно использовать кофе для использования библиотеки.
Джош
Я ненавижу Coffeescript. : P Но, я определенно фанат "" "струнного блока! Или ... Синтаксис PHP heredoc.
BMiner
Шаблон массива (с использованием join ('\ n')) в большинстве случаев будет медленнее, чем обычная конкатенация строк.
BMiner
1
За исключением IE7 и ниже, это правда. Обратите внимание, я сказал это и связался с jsperf.
Джош
4

Взгляните на CoffeeScript: http://coffeescript.org

Он поддерживает многострочные строки, интерполяцию, понимание массивов и множество других приятных вещей.

Рикардо Томази
источник
1

Если вы используете io.js, он поддерживает многострочные строки, как в ECMAScript 6.

var a =
`this is
a multi-line
string`;

См. «Новые строковые методы» на http://davidwalsh.name/es6-io для получения подробной информации и «строки шаблона» на http://kangax.github.io/compat-table/es6/ для отслеживания совместимости.

Саймон Д.
источник
1

В дополнение к принятому ответу:

`this is a 
single string`

что означает: "это \ nодна строка".

Если вы хотите использовать интерполяцию строк, но без новой строки, просто добавьте обратную косую черту, как в обычной строке:

`this is a \
single string`

=> 'это одна строка'.

Имейте в виду, что пробелы вручную необходимы:

`this is a\
single string`

=> 'это одна строка'

suvtfopw
источник
0

Vanilla Javascipt не поддерживает многострочные строки. В наши дни языковые препроцессоры становятся возможными.

CoffeeScript, самый популярный из них, имеет эту функцию, но она не минимальная, это новый язык. Компилятор трассировки Google добавляет новые функции к языку в качестве надмножества, но я не думаю, что многострочные строки являются одной из дополнительных функций.

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

Если предварительные компиляторы не подходят, есть также взлом тега сценария, при котором вы сохраняете свои многострочные данные в теге сценария в html, но даете ему настраиваемый тип, чтобы он не был исключен. Позже, используя javascript, вы можете извлечь содержимое тега скрипта.

Кроме того, если вы поместите \ в конце любой строки в исходном коде, это приведет к игнорированию новой строки, как если бы ее там не было. Если вам нужна новая строка, вы должны закончить строку "\ n \".

Тим Касвелл
источник