Come si crea una stringa multilinea in node.js?


128

Con l'ascesa di node.js, le stringhe multilinea stanno diventando sempre più necessarie in JavaScript.

  1. C'è un modo speciale per farlo in Node.JS, anche se non funziona nei browser?
  2. Ci sono piani o almeno una richiesta di funzionalità per farlo che posso supportare?

So già che puoi usare \n\alla fine di ogni riga, non è quello che voglio.


1
Perché diavolo dovresti inserire i ritorni in linea dura? Niente nel DOM lo supporta (eccetto "pre") e tutti gli altri tipi di restituzione comuni non si preoccupano.
jcolebrand

Quindi non finisco con le schede a sinistra senza ritorni a destra. Mi piace avere entrambi o nessuno. In questo momento sto usando print( '<div>')per stampare il mio HTML. Non ha né tabulazioni né ritorni che è "pulito", ma sarebbe più facile usare una <<EOF..EOFstringa in stile Perl o un file JSP in stile Java. Ad ogni modo, devo essere in grado di inserire variabili nella stringa multilinea quando arriva. Per ora ne farò a meno.
Bryan Field

9
@jcolebrand: Node.JS non si occupa principalmente della manipolazione DOM. È un ambiente di sviluppo di applicazioni completo. Vedi nodejs.org
Roy Tinker

@RoyTinker sì, ma ha chiamato i browser in quel momento, e per di più ha chiamato non \nimplementazioni, quindi ... è abbastanza bene solo i browser.
jcolebrand

@GeorgeBailey Se usi ancora lo stack overflow, potresti correggere la risposta corretta qui?
mikemaccana

Risposte:


165

node v4 e le versioni correnti di node

A partire da ES6 (e così le versioni di Node maggiori di v4), un nuovo tipo intrinseco "template literal" è stato aggiunto a Javascript (indicato con back-tick "" ") che può essere utilizzato anche per costruire stringhe multilinea, come in :

`this is a 
single string`

che restituisce: 'this is a\nsingle string'.

Notare che la nuova riga alla fine della prima riga è inclusa nella stringa risultante.

I valori letterali del modello sono stati aggiunti per consentire ai programmatori di costruire stringhe in cui i valori o il codice possono essere iniettati direttamente in un valore letterale stringa senza dover utilizzare util.formato altri modelli, come in:

let num=10;

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

che stamperà "il risultato di 10 più 10 è 20." alla console.

Versioni precedenti di node

La versione precedente del nodo può utilizzare un carattere di "continuazione di riga" che consente di scrivere stringhe su più righe come:

'this is a \
single string'

che restituisce: 'this is a single string'.

Notare che la nuova riga alla fine della prima riga non è inclusa nella stringa risultante.


Penso che finirò per usare stackoverflow.com/questions/805107/… . Potrei ampliarlo in modo da poter usare le variabili. Sarà sicuramente creativo! Ma poiché questo è Node.JS, non devo preoccuparmi della compatibilità del browser e, nel mio caso, nemmeno della compatibilità della versione.
Bryan Field

6
"Javascript non supporta stringhe multilinea ..." Lo fa a partire da ES5 ed è in V8 (il motore JavaScript di Google), quindi presumibilmente in NodeJS (che utilizza V8). Vedere LineContinuation in [Sezione 7.8.4] * ( es5.github.com/#x7.8.4 ). Il supporto degli strumenti può essere impreciso per un po '.
TJ Crowder

È in io.js ma non ancora Node.JS - Ho aggiunto una risposta con un paio di link in più
Simon D

1
Il nodo 4.0+ ora supporta intrinsecamente stringhe multilinea.
Rob Raisch

46

Le stringhe multilinea sono una parte corrente di JavaScript (a partire da ES6) e sono supportate in node.js v4.0.0 e versioni successive.

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

console.log(text);

2
Questa risposta dovrebbe essere votata immediatamente in cima! Vedi developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… per i dettagli sulle stringhe dei modelli.
user3413723

2
Potrei notare che puoi facilmente aggiungere variabili aggiungendo la sintassi $ {variablehere} all'interno del modello (i `` segni di spunta)
Joseph Astrahan

40

Cosa stai cercando esattamente quando intendi stringhe multilinea.

Stai cercando qualcosa come:

var str = "Some \
    String \
    Here";

Quale verrebbe stampato come "Some String Here"?

In tal caso, tieni presente che quanto sopra è JavaScript valido, ma non lo è:

var str = "Some \ 
    String \
    Here";

Qual è la differenza? Uno spazio dopo il \. Divertiti a eseguire il debug di questo.


beh, coglioni che. Non mi permette di mostrare lo spazio dopo \ senza mettere un carattere lì.
jcolebrand

1
@jcolebrand: Sì, abbastanza divertente non è vero: P
Robert


1
Questo è un trucco sporco. Per favore no!
Raynos

1
Grazie @Robert, lo spazio dopo l'insight '\' mi ha fatto risparmiare tempo!
gpestana

8

Date un'occhiata al mstring modulo per la node.js.

Questo è un piccolo modulo semplice che ti consente di avere stringhe multilinea in JavaScript.

Basta fare questo:

var M = require('mstring')

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

ottenere

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

E questo è praticamente tutto.

Come funziona
In Node.js, puoi chiamare il .toStringmetodo di una funzione e ti fornirà il codice sorgente della definizione della funzione, inclusi eventuali commenti. Un'espressione regolare cattura il contenuto del commento.

Sì, è un trucco. Ispirato da un commento usa e getta di Dominic Tarr .


nota: il modulo (a partire dal 13/11/2012) non consente spazi bianchi prima della chiusura ***/, quindi dovrai hackerarlo da solo.


1
Oppure usa il tuo ramo di mstring che contiene la correzione degli spazi. Grazie! github.com/davidmurdoch/mstring
Druska

6

A parte ciò che la gente ha postato qui, ho sentito che la concatenazione può essere molto più veloce rispetto all'unione nei moderni vms javascript. Senso:

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

Sarà più lento di:

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

In certi casi. http://jsperf.com/string-concat-versus-array-join/3

Come altro a parte, trovo questa una delle caratteristiche più interessanti di Coffeescript . Sì, sì, lo so, gli haters odieranno.

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

È particolarmente utile per i frammenti html. Non sto dicendo che sia un motivo per usarlo, ma vorrei che atterrasse in ecma land :-(.

Josh


1
L'unica cosa che non va con CoffeeScript per me, è la stessa cosa che non va con Groovy l'ultima volta che ho controllato. Quando un file viene convertito da .coffeea .js, i numeri di riga vengono confusi. Non ho provato CoffeeScript, ma quando ho provato Groovy, ho trovato abbastanza difficile eseguire il debug senza ottenere i .javafile generati .
Bryan Field

Ho scritto alcuni progetti ragionevolmente grandi nel caffè. Finisci per dover guardare il codice compilato. Tuttavia è di facile lettura. imo c'è ancora uno stigma inaccettabile con coffeescript nella comunità del nodo, sebbene vi siano scritti diversi grandi progetti (zombie.js, pow, riak-js). Al momento sto eseguendo il porting di alcuni dei miei OSS più piccoli, perché la gente dice "oh, caffè, che schifo" e passa immediatamente avanti, nonostante il fatto che non devi usare il caffè per usare la libreria.
Josh

Odio Coffeescript. : P Ma sono decisamente un fan del blocco di stringhe '' '! Oppure ... PHP heredoc syntax.
BMiner

Il pattern dell'array (usando join ('\ n')) sarà più lento della semplice concatenazione di stringhe nella maggior parte dei casi.
BMiner

1
Ad eccezione di IE7 e versioni precedenti, questo è vero. E noterai, l'ho detto e collegato a jsperf.
Josh



1

Oltre alla risposta accettata:

`this is a 
single string`

che restituisce: "questa è una \ n stringa singola".

Se vuoi usare l'interpolazione di stringhe ma senza una nuova riga, aggiungi semplicemente il backslash come nella stringa normale:

`this is a \
single string`

=> 'questa è una singola stringa'.

Tieni presente che lo spazio bianco manuale è necessario:

`this is a\
single string`

=> 'questa è una stringa singola'


0

Vanilla Javascipt non supporta le stringhe multilinea. I pre-processori del linguaggio si stanno rivelando fattibili in questi giorni.

CoffeeScript, il più popolare di questi, ha questa caratteristica, ma non è minimale, è un nuovo linguaggio. Il compilatore traceur di Google aggiunge nuove funzionalità al linguaggio come un superset, ma non credo che le stringhe multilinea siano una delle funzionalità aggiunte.

Sto cercando di creare un superset minimo di javascript che supporti stringhe multilinea e un paio di altre funzionalità. Ho iniziato questo piccolo linguaggio qualche tempo fa prima di scrivere il compilatore iniziale per coffeescript. Ho intenzione di finirlo quest'estate.

Se i pre-compilatori non sono un'opzione, c'è anche l'hack del tag di script in cui si archiviano i dati su più righe in un tag di script nell'html, ma si assegna un tipo personalizzato in modo che non venga valutato. Successivamente, utilizzando javascript, è possibile estrarre il contenuto del tag script.

Inoltre, se metti una \ alla fine di una riga qualsiasi nel codice sorgente, la nuova riga verrà ignorata come se non fosse presente. Se vuoi la nuova riga, devi terminare la riga con "\ n \".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.