Wie mache ich eine mehrzeilige Zeichenfolge in node.js?

128

Mit dem Aufstieg von node.js werden mehrzeilige Zeichenfolgen in JavaScript immer notwendiger.

  1. Gibt es eine spezielle Möglichkeit, dies in Node.JS zu tun, auch wenn es in Browsern nicht funktioniert?
  2. Gibt es Pläne oder zumindest eine Funktionsanforderung, die ich unterstützen kann?

Ich weiß bereits, dass Sie \n\am Ende jeder Zeile verwenden können, das ist nicht was ich will.

Bryan Field
quelle
1
Warum um alles in der Welt müssten Sie Hardline-Retouren einfügen? Nichts im DOM unterstützt dies (außer "pre"), und alle anderen gängigen Rückgabetypen kümmern sich nicht darum.
Jcolebrand
Ich habe also keine Tabs auf der linken Seite ohne Rückgaben auf der rechten Seite. Ich mag entweder beides oder keines. Im Moment drucke ich print( '<div>')mein HTML. Es hat weder Registerkarten noch Rückgaben, was "ordentlich" ist, aber es wäre einfacher, eine <<EOF..EOFZeichenfolge im Perl- Stil oder eine JSP-Datei im Java-Stil zu verwenden. Wie auch immer, ich muss in der Lage sein, Variablen in die mehrzeilige Zeichenfolge einzugeben, wenn es darum geht. Ich werde vorerst darauf verzichten.
Bryan Field
9
@jcolebrand: Node.JS befasst sich nicht primär mit der DOM-Manipulation. Es ist eine vollständige Anwendungsentwicklungsumgebung. Siehe nodejs.org
Roy Tinker
@ RoyTinker ja, aber er hat damals Browser aufgerufen, und außerdem hat er Nicht- \nImplementierungen aufgerufen , also ... das sind ziemlich gut nur Browser.
Jcolebrand
@GeorgeBailey Wenn Sie immer noch einen Stapelüberlauf verwenden, können Sie hier die richtige Antwort finden?
Mikemaccana

Antworten:

164

Knoten v4 und aktuelle Versionen des Knotens

Ab ES6 (und damit Versionen von Node größer als v4) wurde Javascript ein neuer "Template-Literal" -Typ hinzugefügt (gekennzeichnet durch Back-Ticks "` "), der auch zum Erstellen mehrzeiliger Zeichenfolgen wie in verwendet werden kann ::

`this is a 
single string`

welches ergibt : 'this is a\nsingle string'.

Beachten Sie, dass die Neue - Zeile am Ende der ersten Zeile wird in dem resultierenden String enthalten.

Vorlagenliterale wurden hinzugefügt, damit Programmierer Zeichenfolgen erstellen können, bei denen Werte oder Code direkt in ein Zeichenfolgenliteral eingefügt werden können, ohne dass util.formatandere Vorlagen verwendet werden müssen, wie in:

let num=10;

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

was druckt "das Ergebnis von 10 plus 10 ist 20." zur Konsole.

Ältere Versionen des Knotens

In älteren Versionen des Knotens kann ein "Zeilenfortsetzungszeichen" verwendet werden, mit dem Sie mehrzeilige Zeichenfolgen schreiben können, z.

'this is a \
single string'

welches ergibt : 'this is a single string'.

Beachten Sie, dass die neue Zeile am Ende der ersten Zeile nicht in der resultierenden Zeichenfolge enthalten ist.

Rob Raisch
quelle
Ich denke, ich werde am Ende stackoverflow.com/questions/805107/… verwenden . Ich kann es erweitern, damit ich Variablen verwenden kann. Es wird sicher kreativ sein! Da dies jedoch Node.JS ist, muss ich mich nicht um die Browserkompatibilität kümmern, und in meinem Fall nicht einmal um die Versionskompatibilität.
Bryan Field
6
"Javascript unterstützt keine mehrzeiligen Zeichenfolgen ..." Ab ES5 und in V8 (Googles JavaScript-Engine), also vermutlich in NodeJS (das V8 verwendet). Siehe LineContinuation in [Abschnitt 7.8.4] * ( es5.github.com/#x7.8.4 ). Die Unterstützung von Werkzeugen kann für eine Weile lückenhaft sein.
TJ Crowder
Es ist in io.js, aber noch nicht in Node.JS - Ich habe eine Antwort mit ein paar weiteren Links hinzugefügt
Simon D
1
Knoten 4.0+ unterstützt jetzt mehrzeilige Zeichenfolgen.
Rob Raisch
46

Mehrzeilige Zeichenfolgen sind ein aktueller Bestandteil von JavaScript (seit ES6) und werden in node.js v4.0.0 und höher unterstützt.

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

console.log(text);
Vijey
quelle
2
Diese Antwort sollte sofort nach oben gewählt werden! Weitere Informationen zu Vorlagenzeichenfolgen finden Sie unter developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .
user3413723
2
Vielleicht möchten Sie beachten, dass Sie Variablen einfach hinzufügen können, indem Sie die Syntax $ {variablehere} in die Vorlage einfügen (die `` Ticks)
Joseph Astrahan
40

Was genau suchen Sie, wenn Sie mehrzeilige Zeichenfolgen meinen?

Suchen Sie etwas wie:

var str = "Some \
    String \
    Here";

Welches würde als "Some String Here" gedruckt werden?

Wenn ja, denken Sie daran, dass das oben genannte Javascript gültig ist, aber dies ist nicht:

var str = "Some \ 
    String \
    Here";

Was ist der Unterschied? Ein Leerzeichen nach dem \. Viel Spaß beim Debuggen.

Robert
quelle
gut blöd das. Ich kann den Raum nach dem \ nicht anzeigen, ohne dort ein Zeichen zu setzen.
Jcolebrand
1
@jcolebrand: Ja, ziemlich lustig, nicht wahr: P
Robert
1
Dies ist ein schmutziger Hack. Bitte nicht!
Raynos
1
Danke @Robert, der Platz nach '\' Einblick hat mir einige Zeit gespart!
Gpestana
8

Schauen Sie sich das mstring- Modul für node.js an.

Dies ist ein einfaches kleines Modul, mit dem Sie mehrzeilige Zeichenfolgen in JavaScript verwenden können.

Mach das einfach:

var M = require('mstring')

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

bekommen

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

Und das war's auch schon.

Funktionsweise
In Node.js können Sie die .toStringMethode einer Funktion aufrufen und erhalten den Quellcode der Funktionsdefinition einschließlich aller Kommentare. Ein regulärer Ausdruck erfasst den Inhalt des Kommentars.

Ja, es ist ein Hack. Inspiriert von einem Wegwerfkommentar von Dominic Tarr .


Hinweis: Das Modul (Stand: 13.11.2012) lässt vor dem Schließen keine Leerzeichen zu ***/, daher müssen Sie es selbst hacken.

David Murdoch
quelle
1
Oder verwenden Sie Ihren Zweig von mstring, der den Whitespace-Fix enthält. Vielen Dank! github.com/davidmurdoch/mstring
Druska
6

Abgesehen von dem, was die Leute hier gepostet haben, habe ich gehört, dass die Verkettung viel schneller sein kann als die Teilnahme an modernen Javascript-VMs. Bedeutung:

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

Wird langsamer sein als:

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

In bestimmten Fällen. http://jsperf.com/string-concat-versus-array-join/3

Abgesehen davon finde ich dies eine der ansprechenderen Funktionen in Coffeescript . Ja, ja, ich weiß, Hasser werden hassen.

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

Es ist besonders schön für HTML-Schnipsel. Ich sage nicht, dass es ein Grund ist, es zu benutzen, aber ich wünschte, es würde in Ecma Land landen :-(.

Josh

Josh
quelle
1
Das einzige, was mit CoffeeScript für mich falsch ist, ist dasselbe, was mit Groovy falsch ist, das ich zuletzt überprüft habe. Wenn eine Datei von .coffeenach konvertiert wird .js, werden die Zeilennummern durcheinander gebracht. Ich habe CoffeeScript nicht ausprobiert, aber als ich Groovy ausprobiert habe, war es ziemlich schwierig, Fehler zu beheben, ohne die generierten .javaDateien zu erhalten.
Bryan Field
Ich habe einige ziemlich große Projekte in Kaffee geschrieben. Am Ende müssen Sie sich den kompilierten Code ansehen. Es ist jedoch leicht zu lesen. Imo gibt es immer noch ein inakzeptables Stigma mit Coffeescript in der Node-Community, obwohl mehrere große Projekte darin geschrieben sind (zombie.js, pow, riak-js). Ich portiere derzeit einige meiner kleineren OSS-Dateien, weil die Leute "Oh, Kaffee, igitt" sagen und sofort weitermachen, obwohl Sie keinen Kaffee verwenden müssen, um die Bibliothek zu nutzen.
Josh
Ich bin ein Hasser von Coffeescript. : P Aber ich bin definitiv ein Fan des String-Blocks! Oder ... PHP-Heredoc-Syntax.
BMiner
Das Array-Muster (mit Join ('\ n')) ist in den meisten Fällen langsamer als die Verkettung von einfachen alten Zeichenfolgen.
BMiner
1
Mit Ausnahme von IE7 und niedriger ist dies der Fall. Und du wirst bemerken, das habe ich gesagt und mit jsperf verlinkt.
Josh
4

Schauen Sie sich CoffeeScript an: http://coffeescript.org

Es unterstützt mehrzeilige Zeichenfolgen, Interpolation, Array-Verständnis und viele andere nette Dinge.

Ricardo Tomasi
quelle
1

Zusätzlich zur akzeptierten Antwort:

`this is a 
single string`

Dies ergibt Folgendes: 'Dies ist eine einzelne Zeichenfolge'.

Wenn Sie die Zeichenfolgeninterpolation ohne neue Zeile verwenden möchten, fügen Sie einfach einen umgekehrten Schrägstrich wie in der normalen Zeichenfolge hinzu:

`this is a \
single string`

=> 'Dies ist eine einzelne Zeichenfolge'.

Beachten Sie jedoch, dass manuelle Leerzeichen erforderlich sind:

`this is a\
single string`

=> 'Dies ist eine einzelne Zeichenfolge'

suvtfopw
quelle
0

Vanilla Javascipt unterstützt keine mehrzeiligen Zeichenfolgen. Sprachvorprozessoren erweisen sich heutzutage als machbar.

CoffeeScript, das beliebteste davon, hat diese Funktion, aber es ist nicht minimal, es ist eine neue Sprache. Der Traceur-Compiler von Google fügt der Sprache neue Funktionen als Obermenge hinzu, aber ich denke nicht, dass mehrzeilige Zeichenfolgen eine der hinzugefügten Funktionen sind.

Ich möchte eine minimale Obermenge von Javascript erstellen, die mehrzeilige Zeichenfolgen und einige andere Funktionen unterstützt. Ich habe diese kleine Sprache vor einiger Zeit angefangen, bevor ich den ersten Compiler für Coffeescript geschrieben habe. Ich habe vor, es diesen Sommer zu beenden.

Wenn Pre-Compiler keine Option sind, gibt es auch den Skript-Tag-Hack, bei dem Sie Ihre mehrzeiligen Daten in einem Skript-Tag im HTML-Code speichern, ihm jedoch einen benutzerdefinierten Typ geben, damit er nicht ausgewertet wird. Später können Sie mit Javascript den Inhalt des Skript-Tags extrahieren.

Wenn Sie am Ende einer Zeile im Quellcode ein \ einfügen, wird die neue Zeile ignoriert, als wäre sie nicht vorhanden. Wenn Sie die neue Zeile möchten, müssen Sie die Zeile mit "\ n \" beenden.

Tim Caswell
quelle