Como eu faço uma string de várias linhas no node.js?

128

Com o surgimento do node.js, as seqüências de várias linhas estão se tornando mais necessárias no JavaScript.

  1. Existe uma maneira especial de fazer isso no Node.JS, mesmo que não funcione nos navegadores?
  2. Existem planos ou pelo menos uma solicitação de recurso para fazer isso que eu possa suportar?

Eu já sei que você pode usar \n\no final de cada linha, não é isso que eu quero.

Bryan Field
fonte
1
Por que diabos você precisaria inserir retornos de linha rígida? Nada no DOM suporta isso (exceto "pre"), e todos os outros tipos de retorno comuns não se importam.
precisa saber é o seguinte
Portanto, não termino com guias à esquerda sem retornos à direita. Eu gosto de ter ambos ou nenhum. No momento, estou usando print( '<div>')para imprimir meu HTML. Ele não possui guias nem retornos que são "legais", mas seria mais fácil usar uma <<EOF..EOFsequência de caracteres Perl ou um arquivo JSP no estilo Java. De qualquer forma, eu preciso ser capaz de inserir variáveis ​​na string de várias linhas quando se trata. Vou ficar sem por agora.
Bryan Campo
9
@jcolebrand: O Node.JS não se preocupa principalmente com a manipulação do DOM. É um ambiente completo de desenvolvimento de aplicativos. Veja nodejs.org
Roy Tinker
@RoyTinker sim, mas ele chamou navegadores na época e, além disso, chamou não \nimplementações, então ... isso é muito bom apenas para navegadores.
jcolebrand
@GeorgeBailey Se você ainda usa o estouro de pilha, pode corrigir a resposta correta aqui?
Mikemaccana 27/05

Respostas:

164

nó v4 e versões atuais do nó

No ES6 (e, portanto, nas versões do Nó superiores à v4), um novo tipo intrínseco "literal de modelo" foi adicionado ao Javascript (indicado por back-ticks "` "), que também pode ser usado para construir sequências de várias linhas, como em :

`this is a 
single string`

que avalia como: 'this is a\nsingle string' .

Observe que a nova linha no final da primeira linha é incluída na sequência resultante.

Literais de modelo foram adicionados para permitir que os programadores construíssem cadeias onde valores ou códigos poderiam ser injetados diretamente em uma literal de cadeia sem ter que usar util.formatou outros modelos de modelo, como em:

let num=10;

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

que imprimirá "o resultado de 10 mais 10 é 20." para o console.

Versões mais antigas do nó

A versão mais antiga do nó pode usar um caractere "continuação de linha", permitindo que você escreva seqüências de várias linhas, como:

'this is a \
single string'

que avalia a: 'this is a single string'.

Observe que a nova linha no final da primeira linha não está incluída na sequência resultante.

Rob Raisch
fonte
Eu acho que vou acabar usando stackoverflow.com/questions/805107/… . Eu posso expandir para poder usar variáveis. Será criativo, com certeza! Mas como esse é o Node.JS, não preciso me preocupar com a compatibilidade do navegador e, no meu caso, nem com a versão.
Bryan Campo
6
"O Javascript não suporta seqüências de várias linhas ..." É a partir do ES5 e está no V8 (mecanismo JavaScript do Google), presumivelmente no NodeJS (que usa o V8). Consulte LineContinuation em [Seção 7.8.4] * ( es5.github.com/#x7.8.4 ). O suporte às ferramentas pode ser superficial por um tempo.
TJ Crowder
Ele está no io.js, mas ainda não no Node.JS - eu adicionei uma resposta com mais alguns links
Simon D
1
O nó 4.0 ou superior agora oferece suporte a seqüências multilinhas intrinsecamente.
Rob Raisch
46

Cadeias de linhas múltiplas são uma parte atual do JavaScript (desde o ES6) e são suportadas no node.js v4.0.0 e mais recente.

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

console.log(text);
Vijey
fonte
2
Esta resposta deve ser votada para o topo imediatamente! Consulte developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/… para obter detalhes sobre as strings do modelo.
user3413723
2
Pode querer nota que você pode facilmente adicionar variáveis, adicionando $ {variablehere} sintaxe dentro do modelo (os `` carrapatos)
Joseph Astrahan
40

O que exatamente você está procurando quando se refere a cadeias de linhas múltiplas.

Você está procurando algo como:

var str = "Some \
    String \
    Here";

O que seria impresso como "Some String Here"?

Nesse caso, lembre-se de que o Javascript acima é válido, mas isso não é:

var str = "Some \ 
    String \
    Here";

Qual é a diferença? Um espaço após o \. Divirta-se depurando isso.

Robert
fonte
bem besteira isso. Não me permitirá mostrar o espaço após o \ sem colocar um personagem lá.
precisa saber é o seguinte
1
@jcolebrand: Sim, bastante divertido, não é: P
Robert
1
Este é um truque sujo. Por favor não!
Raynos
1
Obrigado @Robert, o espaço após o '\' insight me salvou algum tempo!
Gpestana # 13/16
8

Dê uma olhada no mstring módulo para Node.js.

Este é um pequeno módulo simples que permite que você tenha seqüências de várias linhas em JavaScript.

Apenas faça o seguinte:

var M = require('mstring')

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

para obter

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

E é isso mesmo.

Como funciona
No Node.js, você pode chamar o .toStringmétodo de uma função e fornecerá o código-fonte da definição da função, incluindo quaisquer comentários. Uma expressão regular captura o conteúdo do comentário.

Sim, é um hack. Inspirado por um comentário descartável de Dominic Tarr .


nota: o módulo (em 13/12/11) não permite espaços em branco antes do fechamento ***/, portanto, você precisará invadir você mesmo.

David Murdoch
fonte
1
Ou use seu ramo de mstring que contém a correção de espaço em branco. Obrigado! github.com/davidmurdoch/mstring
Druska
6

Como um aparte do que as pessoas estão postando aqui, ouvi dizer que a concatenação pode ser muito mais rápida do que participar de vms javascript modernos. Significado:

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

Será mais lento que:

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

Em certos casos. http://jsperf.com/string-concat-versus-array-join/3

Como outro aparte, acho esse um dos recursos mais atraentes do Coffeescript . Sim, sim, eu sei, odiadores vão odiar.

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

É especialmente bom para trechos de html. Eu não estou dizendo que é uma razão para usá-lo, mas eu gostaria que ele pousasse em ecma land :-(.

Josh

Josh
fonte
1
A única coisa errada com o CoffeeScript para mim é a mesma coisa errada com o Groovy da última vez que verifiquei. Quando um arquivo é convertido de .coffeepara .js, os números de linha são desordenados. Não experimentei o CoffeeScript, mas quando experimentei o Groovy, achei bastante difícil depurar sem obter os .javaarquivos gerados .
Bryan Campo
Eu escrevi alguns projetos razoavelmente grandes em café. Você acaba tendo que olhar para o código compilado. É, no entanto, fácil de ler. Ainda existe um estigma inaceitável com coffeescript na comunidade de nós, embora vários projetos grandes estejam escritos nele (zombie.js, pow, riak-js). Atualmente, estou transferindo alguns dos meus OSS menores, porque as pessoas dizem 'oh, café, eca' e imediatamente seguem em frente, apesar do fato de que você não precisa usar café para usar a biblioteca.
Josh
Eu sou um odiador do Coffeescript. : P Mas definitivamente sou fã do bloco de cordas '' '! Ou ... sintaxe PHP heredoc.
BMiner 13/07/11
O padrão da matriz (usando junção ('\ n')) será mais lento que a concatenação de strings simples na maioria dos casos.
BMiner
1
Exceto para o IE7 e abaixo, isso é verdade. E você notará, eu disse isso e vinculei ao jsperf.
1928 Josh
4

Dê uma olhada no CoffeeScript: http://coffeescript.org

Ele suporta strings de várias linhas, interpolação, compreensão de array e muitas outras coisas interessantes.

Ricardo Tomasi
fonte
1

Além da resposta aceita:

`this is a 
single string`

que avalia como: 'esta é uma string \ n Única'.

Se você deseja usar a interpolação de string, mas sem uma nova linha, basta adicionar barra invertida como na string normal:

`this is a \
single string`

=> 'esta é uma única string'.

Lembre-se de que o espaço em branco manual é necessário:

`this is a\
single string`

=> 'esta é uma string única'

suvtfopw
fonte
0

O Javascipt de baunilha não suporta cadeias de linhas múltiplas. Atualmente, os pré-processadores de idiomas estão se tornando viáveis.

O CoffeeScript, o mais popular deles, possui esse recurso, mas não é mínimo, é uma nova linguagem. O compilador traceur do Google adiciona novos recursos ao idioma como um superconjunto, mas não acho que as seqüências de várias linhas sejam um dos recursos adicionados.

Eu estou olhando para fazer um superconjunto mínimo de javascript que suporta seqüências de linhas múltiplas e alguns outros recursos. Comecei esse pequeno idioma um pouco antes de escrever o compilador inicial para o coffeescript. Eu pretendo terminar este verão.

Se os pré-compiladores não forem uma opção, também há a tag de script hack, na qual você armazena seus dados de várias linhas em uma tag de script no html, mas atribui a ele um tipo personalizado para que não seja avaliado. Depois, usando javascript, você pode extrair o conteúdo da tag de script.

Além disso, se você colocar um \ no final de qualquer linha no código-fonte, isso fará com que a nova linha seja ignorada como se não estivesse lá. Se você quiser a nova linha, precisará terminar a linha com "\ n \".

Tim Caswell
fonte