Jak zrobić wieloliniowy ciąg w node.js?

128

Wraz z pojawieniem się node.js, ciągi wieloliniowe stają się coraz bardziej potrzebne w JavaScript.

  1. Czy istnieje specjalny sposób na zrobienie tego w Node.JS, nawet jeśli nie działa w przeglądarkach?
  2. Czy są jakieś plany lub przynajmniej prośba o dodanie funkcji, którą mogę wesprzeć?

Wiem już, że możesz użyć \n\na końcu każdego wiersza, nie tego chcę.

Bryan Field
źródło
1
Dlaczego, u licha, miałbyś wstawiać twarde zwroty liniowe? Nic w DOM tego nie obsługuje (z wyjątkiem „pre”), a wszystkie inne popularne typy zwracane nie przejmują się tym.
jcolebrand
Więc nie kończę z zakładkami po lewej stronie bez powrotu po prawej. Lubię mieć jedno lub drugie. W tej chwili używam print( '<div>')do drukowania mojego HTML. Nie ma ani tabulatorów, ani zwrotów, co jest „schludne”, ale łatwiej byłoby użyć ciągu <<EOF..EOFznaków w stylu Perla lub pliku JSP w stylu Java. W każdym razie muszę mieć możliwość wprowadzania zmiennych w ciągu wielowierszowym, gdy nadejdzie. Na razie obejdę się bez.
Bryan Field
9
@jcolebrand: Node.JS nie zajmuje się głównie manipulowaniem DOM. To pełne środowisko programistyczne. Zobacz nodejs.org
Roy Tinker,
@RoyTinker tak, ale w tym czasie wywoływał przeglądarki, a do tego odwoływał się do braku \nimplementacji, więc ... to całkiem dobrze tylko przeglądarki.
jcolebrand
@GeorgeBailey Jeśli nadal używasz przepełnienia stosu, czy możesz poprawić tutaj poprawną odpowiedź?
mikemaccana

Odpowiedzi:

164

node v4 i aktualne wersje node

Począwszy od ES6 (a więc wersji Node większych niż v4), nowy typ wewnętrzny „literał szablonu” został dodany do JavaScript (oznaczony znakami wstecznymi „„ ”), który może być również używany do tworzenia wieloliniowych ciągów, jak w :

`this is a 
single string`

rozpoznawaną: 'this is a\nsingle string'.

Zauważ, że znak nowej linii na końcu pierwszej linii jest zawarty w wynikowym ciągu.

Dodano literały szablonów, aby umożliwić programistom konstruowanie ciągów, w których wartości lub kod mogą być bezpośrednio wstrzykiwane do literału ciągu bez konieczności używania util.formatlub innych szablonów, jak w:

let num=10;

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

co spowoduje wyświetlenie "wynik 10 plus 10 to 20." do konsoli.

Starsze wersje node

Starsza wersja węzła może używać znaku „kontynuacji linii”, który umożliwia pisanie wieloliniowych ciągów, takich jak:

'this is a \
single string'

rozpoznawaną: 'this is a single string'.

Zwróć uwagę, że znak nowej linii na końcu pierwszej linii nie jest zawarty w wynikowym ciągu.

Rob Raisch
źródło
Myślę, że skończę używając stackoverflow.com/questions/805107/… . Mogę to rozwinąć, aby móc używać zmiennych. Na pewno będzie kreatywny! Ale ponieważ jest to Node.JS, nie muszę się martwić o zgodność przeglądarki, aw moim przypadku nawet o zgodność wersji.
Bryan Field
6
„Javascript nie obsługuje ciągów wieloliniowych…” Tak jest od wersji ES5 i jest w wersji 8 (silnik JavaScript firmy Google), a więc prawdopodobnie w NodeJS (który używa V8). Zobacz LineContinuation w [Sekcja 7.8.4] * ( es5.github.com/#x7.8.4 ). Obsługa narzędzi może być przez chwilę szkicowa.
TJ Crowder
Jest w io.js, ale jeszcze nie w Node.JS - dodałem odpowiedź z kilkoma dodatkowymi linkami
Simon D
1
Węzeł 4.0+ obsługuje teraz wewnętrznie ciągi wielowierszowe.
Rob Raisch
46

Ciągi wielowierszowe są aktualną częścią JavaScript (od ES6) i są obsługiwane w node.js v4.0.0 i nowszych.

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

console.log(text);
Vijey
źródło
2
Ta odpowiedź powinna zostać natychmiast wybrana na szczyt! Zobacz developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…, aby uzyskać szczegółowe informacje na temat ciągów szablonów.
user3413723
2
Warto zauważyć, że możesz łatwo dodawać zmienne, dodając składnię $ {variablehere} wewnątrz szablonu (`` ticks)
Joseph Astrahan
40

Czego dokładnie szukasz, gdy masz na myśli ciągi wielowierszowe.

Szukasz czegoś takiego jak:

var str = "Some \
    String \
    Here";

Która z nich zostanie wydrukowana jako „Some String Here”?

Jeśli tak, pamiętaj, że powyższy kod jest prawidłowym JavaScriptem, ale to nie jest:

var str = "Some \ 
    String \
    Here";

Co za różnica? Spacja po \. Miłego debugowania.

Robert
źródło
cóż, bzdury. Nie pozwala mi pokazać spacji po \ bez umieszczania tam znaku.
jcolebrand
1
@jcolebrand: Tak, całkiem fajne, prawda: P
Robert
1
To jest brudny hack. Proszę nie!
Raynos
1
Dzięki @Robert, miejsce po wglądu „\” zaoszczędziło mi trochę czasu!
gpestana
8

Spójrz na mstring modułem do node.js.

Jest to prosty, mały moduł, który umożliwia tworzenie wieloliniowych ciągów w JavaScript.

Po prostu zrób to:

var M = require('mstring')

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

dostać

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

I to wszystko.

Jak to działa
W Node.js możesz wywołać .toStringmetodę funkcji, a otrzymasz kod źródłowy definicji funkcji, w tym wszelkie komentarze. Wyrażenie regularne przechwytuje treść komentarza.

Tak, to hack. Zainspirowany jednorazowym komentarzem Dominica Tarra .


uwaga: moduł (stan na 2012/13/11) nie zezwala na spacje przed zamknięciem ***/, więc musisz go zhakować w sobie.

David Murdoch
źródło
1
Lub użyj swojej gałęzi mstring, która zawiera poprawkę do białych znaków. Dzięki! github.com/davidmurdoch/mstring
Druska
6

Poza tym, co ludzie tutaj publikowali, słyszałem, że konkatenacja może być znacznie szybsza niż dołączanie do nowoczesnych maszyn wirtualnych javascript. Znaczenie:

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

Będzie wolniejszy niż:

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

W szczególnych przypadkach. http://jsperf.com/string-concat-versus-array-join/3

Poza tym uważam, że jest to jedna z bardziej atrakcyjnych funkcji w Coffeescript . Tak, tak, wiem, hejterzy będą nienawidzić.

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

Jest to szczególnie przyjemne w przypadku fragmentów html. Nie mówię, że to powód, aby go używać, ale chciałbym, żeby wylądował w ecma land :-(.

Josh

Josh
źródło
1
Jedyną wadą CoffeeScript jest dla mnie ten sam problem z Groovym, który ostatnio sprawdzałem. Podczas konwersji pliku z .coffeena .jsnumery wierszy są pomieszane. Nie próbowałem CoffeeScript, ale kiedy wypróbowałem Groovy, okazało się, że debugowanie bez pobierania wygenerowanych .javaplików było dość trudne .
Bryan Field
Napisałem kilka dość dużych projektów w kawie. W końcu musisz spojrzeć na skompilowany kod. Jest jednak łatwy do odczytania. imo nadal jest nie do zaakceptowania piętno Coffeescript w społeczności node, choć napisano w nim kilka dużych projektów (zombie.js, pow, riak-js). Obecnie przenoszę niektóre z moich mniejszych OSS, ponieważ ludzie mówią „och, kawa, fuj” i od razu przechodzą, mimo że nie musisz używać kawy, aby korzystać z biblioteki.
Josh
Nie znoszę Coffeescript. : P Ale zdecydowanie jestem fanem bloku strunowego '' '! Albo ... składnia heredoc PHP.
BMiner,
W większości przypadków wzorzec tablicy (przy użyciu join ('\ n')) będzie wolniejszy niż łączenie zwykłych ciągów znaków.
BMiner,
1
Z wyjątkiem IE7 i starszych, to prawda. Zauważ, że powiedziałem to i utworzyłem link do jsperf.
Josh
4

Spójrz na CoffeeScript: http://coffeescript.org

Obsługuje wieloliniowe ciągi znaków, interpolację, wyrażenia tablicowe i wiele innych fajnych rzeczy.

Ricardo Tomasi
źródło
1

Oprócz zaakceptowanej odpowiedzi:

`this is a 
single string`

co daje: „to jest \ njeden ciąg”.

Jeśli chcesz użyć interpolacji ciągów, ale bez nowej linii, po prostu dodaj ukośnik odwrotny, jak w normalnym ciągu:

`this is a \
single string`

=> „to jest pojedynczy ciąg znaków”.

Pamiętaj jednak, że ręczne spacje są konieczne:

`this is a\
single string`

=> 'to jest pojedynczy ciąg'

suvtfopw
źródło
0

Vanilla Javascipt nie obsługuje ciągów wieloliniowych. Obecnie okazuje się, że preprocesory językowe są wykonalne.

CoffeeScript, najpopularniejszy z nich, ma tę funkcję, ale nie jest to minimalna, to nowy język. Kompilator traceur Google dodaje nowe funkcje do języka jako nadzbiór, ale nie sądzę, aby ciągi wieloliniowe były jedną z dodanych funkcji.

Chcę stworzyć minimalny nadzbiór javascript, który obsługuje ciągi wielowierszowe i kilka innych funkcji. Zacząłem ten mały język jakiś czas temu, zanim napisałem początkowy kompilator dla coffeescript. Planuję to skończyć tego lata.

Jeśli prekompilatory nie są dostępne, istnieje również hack tagów skryptu, w którym przechowujesz swoje dane wielowierszowe w tagu skryptu w html, ale nadaj mu niestandardowy typ, aby nie był oceniany. Następnie za pomocą javascript możesz wyodrębnić zawartość tagu script.

Ponadto, jeśli umieścisz \ na końcu dowolnej linii w kodzie źródłowym, spowoduje to zignorowanie nowej linii, tak jakby jej tam nie było. Jeśli chcesz wprowadzić nową linię, musisz zakończyć linię znakiem „\ n \”.

Tim Caswell
źródło