¿Cómo hago una cadena de varias líneas en node.js?

128

Con el surgimiento de node.js, las cadenas de varias líneas se están volviendo más necesarias en JavaScript.

  1. ¿Hay alguna forma especial de hacer esto en Node.JS, incluso si no funciona en los navegadores?
  2. ¿Hay algún plan o al menos una solicitud de función para hacer esto que pueda apoyar?

Ya sé que puedes usar \n\al final de cada línea, eso no es lo que quiero.

Bryan Field
fuente
1
¿Por qué necesitaría insertar retornos de línea dura? Nada en el DOM lo admite (excepto "pre"), y a todos los demás tipos de devolución comunes no les importa.
jcolebrand
Así que no termino con pestañas a la izquierda sin retornos a la derecha. Me gusta tener ambos o ninguno. En este momento estoy usando print( '<div>')para imprimir mi HTML. No tiene pestañas ni retornos, lo cual es "ordenado", pero sería más fácil usar una <<EOF..EOFcadena de estilo Perl o un archivo JSP de estilo Java. De todos modos, necesito poder ingresar variables en la cadena de varias líneas cuando se trata. Lo haré sin por ahora.
Bryan Field
9
@jcolebrand: Node.JS no se ocupa principalmente de la manipulación DOM. Es un entorno completo de desarrollo de aplicaciones. Ver nodejs.org
Roy Tinker
@RoyTinker sí, pero llamó a los navegadores en ese momento, y además llamó a las no \nimplementaciones, así que ... eso está bastante bien solo a los navegadores.
jcolebrand
@GeorgeBailey Si todavía usa el desbordamiento de pila, ¿podría arreglar la respuesta correcta aquí?
mikemaccana

Respuestas:

164

nodo v4 y versiones actuales del nodo

A partir de ES6 (y, por lo tanto, de las versiones de Node mayores que v4), se agregó un nuevo tipo intrínseco de "plantilla literal" a Javascript (denotado por las marcas de retroceso "` ") que también se puede usar para construir cadenas de varias líneas, como en :

`this is a 
single string`

que evalúa a: 'this is a\nsingle string'.

Tenga en cuenta que la nueva línea al final de la primera línea se incluye en la cadena resultante.

Los literales de plantilla se agregaron para permitir a los programadores construir cadenas donde los valores o el código podrían inyectarse directamente en un literal de cadena sin tener que usar util.formatu otros templaters, como en:

let num=10;

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

que imprimirá "el resultado de 10 más 10 es 20." a la consola

Versiones anteriores de nodo

La versión anterior del nodo puede usar un carácter de "continuación de línea" que le permite escribir cadenas de varias líneas como:

'this is a \
single string'

que evalúa a: 'this is a single string'.

Tenga en cuenta que la nueva línea al final de la primera línea no se incluye en la cadena resultante.

Rob Raisch
fuente
Creo que terminaré usando stackoverflow.com/questions/805107/… . Puedo ampliarlo para poder usar variables. ¡Será creativo seguro! Pero como se trata de Node.JS, no tengo que preocuparme por la compatibilidad del navegador y, en mi caso, ni siquiera por la compatibilidad de la versión.
Bryan Field
66
"Javascript no admite cadenas de varias líneas ..." Lo hace a partir de ES5, y está en V8 (motor JavaScript de Google), por lo que presumiblemente en NodeJS (que usa V8). Consulte Continuación de línea en [Sección 7.8.4] * ( es5.github.com/#x7.8.4 ). El soporte de herramientas puede ser incompleto por un tiempo.
TJ Crowder
Está en io.js pero no en Node.JS todavía. Agregué una respuesta con un par de enlaces más
Simon D
1
Nodo 4.0+ ahora admite cadenas multilínea intrínsecamente.
Rob Raisch
46

Las cadenas multilínea son una parte actual de JavaScript (desde ES6) y son compatibles con node.js v4.0.0 y posteriores.

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

console.log(text);
Vijey
fuente
2
¡Esta respuesta debe ser votada a la cima inmediatamente! Consulte developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… para obtener detalles sobre las cadenas de plantillas.
user3413723
2
Es posible que desee tener en cuenta que puede agregar fácilmente variables agregando la sintaxis $ {variablehere} dentro de la plantilla (los `` ticks)
Joseph Astrahan
40

¿Qué buscas exactamente cuando te refieres a cadenas multilínea?

¿Estás buscando algo como:

var str = "Some \
    String \
    Here";

¿Cuál se imprimiría como "Some String Here"?

Si es así, tenga en cuenta que lo anterior es Javascript válido, pero esto no es:

var str = "Some \ 
    String \
    Here";

¿Cual es la diferencia? Un espacio después de la \. Diviértete depurando eso.

Robert
fuente
bueno, eso no funciona. No me dejará mostrar el espacio después de \ sin poner un personaje allí.
jcolebrand
1
@jcolebrand: Sí, bastante divertido, ¿no es así? P
Robert
1
Este es un truco sucio. ¡Por favor no!
Raynos
1
¡Gracias @Robert, el espacio después de la visión '\' me ahorró algo de tiempo!
gpestana
8

Eche un vistazo al módulo mstring para node.js.

Este es un pequeño módulo simple que le permite tener cadenas de varias líneas en JavaScript.

Solo haz esto:

var M = require('mstring')

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

Llegar

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

Y eso es todo.

Cómo funciona
En Node.js, puede llamar al.toString método de una función y le dará el código fuente de la definición de la función, incluidos los comentarios. Una expresión regular toma el contenido del comentario.

Sí, es un truco. Inspirado por un comentario descartable de Dominic Tarr .


nota: el módulo (a partir del 13/12/2012) no permite espacios en blanco antes del cierre ***/, por lo que deberá hackearlo usted mismo.

David Murdoch
fuente
1
O use su rama de mstring que contiene la corrección de espacios en blanco. ¡Gracias! github.com/davidmurdoch/mstring
Druska
6

Además de lo que la gente ha estado publicando aquí, he escuchado que la concatenación puede ser mucho más rápida que unirse a javascript vms modernos. Sentido:

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

Será más lento que:

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

En algunos casos. http://jsperf.com/string-concat-versus-array-join/3

Como otro lado, encuentro esta una de las características más atractivas en Coffeescript . Sí, sí, lo sé, los que odian odiarán.

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

Es especialmente bueno para fragmentos de HTML. No digo que sea una razón para usarlo, pero desearía que aterrizara en tierra ecma :-(.

Josh

Josh
fuente
1
Lo único que está mal con CoffeeScript para mí, es lo mismo que está mal con Groovy la última vez que lo revisé. Cuando un archivo se convierte de .coffeea .js, los números de línea se mezclan. No probé CoffeeScript, pero cuando probé Groovy, me resultó bastante difícil depurar sin obtener los .javaarchivos generados .
Bryan Field
He escrito algunos proyectos razonablemente grandes en café. Acabas teniendo que mirar el código compilado. Sin embargo, es fácil de leer. En mi opinión, todavía hay un estigma inaceptable con coffeescript en la comunidad de nodos, aunque varios proyectos grandes están escritos en él (zombie.js, pow, riak-js). Actualmente estoy transfiriendo algunos de mis OSS más pequeños, porque la gente dice 'oh, coffee, yuck' e inmediatamente continúan, a pesar del hecho de que no tienes que usar café para usar la biblioteca.
Josh
Soy un enemigo de Coffeescript. : P Pero, definitivamente soy un fanático del '' 'bloque de cuerdas! O ... sintaxis PHP heredoc.
BMiner
El patrón de matriz (usando join ('\ n')) será más lento que la concatenación de cadenas simple en la mayoría de los casos.
BMiner
1
Excepto por IE7 y por debajo, esto es cierto. Y notará, dije eso y lo relacioné con jsperf.
Josh
4

Echa un vistazo a CoffeeScript: http://coffeescript.org

Admite cadenas de varias líneas, interpolación, comprensiones de matriz y muchas otras cosas buenas.

Ricardo Tomasi
fuente
1

Además de la respuesta aceptada:

`this is a 
single string`

que se evalúa como: 'esta es una \ ncadena simple'.

Si desea utilizar la interpolación de cadenas pero sin una nueva línea, simplemente agregue la barra diagonal inversa como en la cadena normal:

`this is a \
single string`

=> 'esta es una sola cadena'.

Sin embargo, tenga en cuenta que el espacio en blanco manual es necesario:

`this is a\
single string`

=> 'esta es una cadena única'

suvtfopw
fuente
0

Vanilla Javascipt no admite cadenas de varias líneas. Los preprocesadores de idiomas están resultando factibles en estos días.

CoffeeScript, el más popular de estos tiene esta característica, pero no es mínimo, es un nuevo lenguaje. El compilador traceur de Google agrega nuevas características al lenguaje como un superconjunto, pero no creo que las cadenas de líneas múltiples sean una de las características adicionales.

Estoy buscando crear un superconjunto mínimo de javascript que admita cadenas multilínea y un par de características más. Empecé este pequeño lenguaje hace un tiempo antes de escribir el compilador inicial para coffeescript. Planeo terminarlo este verano.

Si los precompiladores no son una opción, también existe el pirateo de la etiqueta de script donde almacena sus datos de varias líneas en una etiqueta de script en el html, pero le da un tipo personalizado para que no se evada. Luego, utilizando JavaScript, puede extraer el contenido de la etiqueta del script.

Además, si coloca un \ al final de cualquier línea en el código fuente, hará que la nueva línea se ignore como si no estuviera allí. Si desea la nueva línea, debe finalizar la línea con "\ n \".

Tim Caswell
fuente