Comment créer une chaîne multiligne dans node.js?

128

Avec la montée en puissance de node.js, les chaînes multilignes deviennent de plus en plus nécessaires en JavaScript.

  1. Existe-t-il un moyen spécial de le faire dans Node.JS, même si cela ne fonctionne pas dans les navigateurs?
  2. Existe-t-il des plans ou au moins une demande de fonctionnalité pour ce faire que je peux prendre en charge?

Je sais déjà que vous pouvez utiliser \n\à la fin de chaque ligne, ce n'est pas ce que je veux.

Champ Bryan
la source
1
Pourquoi diable auriez-vous besoin d'insérer des retours en ligne dure? Rien dans le DOM ne prend en charge cela (à l'exception de "pre"), et tous les autres types de retour courants s'en moquent.
jcolebrand
Donc je ne me retrouve pas avec des onglets à gauche sans retours à droite. J'aime avoir les deux ou aucun. En ce moment, j'utilise print( '<div>')pour imprimer mon HTML. Il n'a ni tabulations ni retours, ce qui est "soigné", mais il serait plus facile d'utiliser une <<EOF..EOFchaîne de style Perl ou un fichier JSP de style Java. Quoi qu'il en soit, je dois être capable de saisir des variables dans la chaîne multiligne quand il s'agit. Je vais m'en passer pour l'instant.
Bryan Field
9
@jcolebrand: Node.JS n'est pas principalement concerné par la manipulation DOM. C'est un environnement de développement d'applications complet. Voir nodejs.org
Roy Tinker
@RoyTinker oui, mais il a appelé les navigateurs à l'époque, et en plus de cela, il a appelé les non- \nimplémentations, donc ... ce sont plutôt des navigateurs.
jcolebrand
@GeorgeBailey Si vous utilisez toujours le débordement de pile, pourriez-vous corriger la bonne réponse ici?
mikemaccana

Réponses:

165

node v4 et versions actuelles de node

Depuis ES6 (et donc les versions de Node supérieures à v4), un nouveau type intrinsèque "template literal" a été ajouté à Javascript (indiqué par back-ticks "` ") qui peut également être utilisé pour construire des chaînes multilignes, comme dans :

`this is a 
single string`

qui évalue à: 'this is a\nsingle string'.

Notez que la nouvelle ligne à la fin de la première ligne est incluse dans la chaîne résultante.

Des modèles de littéraux ont été ajoutés pour permettre aux programmeurs de construire des chaînes dans lesquelles des valeurs ou du code pourraient être directement injectés dans un littéral de chaîne sans avoir à utiliser util.formatou d'autres modèles, comme dans:

let num=10;

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

qui affichera "le résultat de 10 plus 10 est 20." à la console.

Anciennes versions de node

La version plus ancienne de node peut utiliser un caractère de "continuation de ligne" vous permettant d'écrire des chaînes multilignes telles que:

'this is a \
single string'

qui évalue à: 'this is a single string'.

Notez que la nouvelle ligne à la fin de la première ligne n'est pas incluse dans la chaîne résultante.

Rob Raisch
la source
Je pense que je finirai par utiliser stackoverflow.com/questions/805107/… . Je peux développer cela pour pouvoir utiliser des variables. Ce sera créatif à coup sûr! Mais comme il s'agit de Node.JS, je n'ai pas à me soucier de la compatibilité du navigateur, et dans mon cas, pas même de la compatibilité des versions.
Bryan Field le
6
"Javascript ne prend pas en charge les chaînes multilignes ..." Il le fait à partir de l'ES5, et c'est en V8 (le moteur JavaScript de Google), donc vraisemblablement en NodeJS (qui utilise V8). Voir LineContinuation dans [Section 7.8.4] * ( es5.github.com/#x7.8.4 ). Le support des outils peut être sommaire pendant un certain temps.
TJ Crowder
Il est dans io.js mais pas encore Node.JS - J'ai ajouté une réponse avec quelques liens supplémentaires
Simon D
1
Node 4.0+ prend désormais en charge les chaînes multilignes de manière intrinsèque.
Rob Raisch
46

Les chaînes multilignes font actuellement partie de JavaScript (depuis ES6) et sont prises en charge dans node.js v4.0.0 et plus récent.

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

console.log(text);
Vijey
la source
2
Cette réponse devrait être votée en haut immédiatement! Voir developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… pour plus de détails sur les chaînes de modèles.
user3413723
2
Vous voudrez peut-être noter que vous pouvez facilement ajouter des variables en ajoutant la syntaxe $ {variablehere} à l'intérieur du modèle (les `` ticks) ''
Joseph Astrahan
40

Que recherchez-vous exactement lorsque vous parlez de chaînes multilignes.

Cherchez-vous quelque chose comme:

var str = "Some \
    String \
    Here";

Qui serait imprimé comme "Some String Here"?

Si tel est le cas, gardez à l'esprit que ce qui précède est du Javascript valide, mais ce n'est pas le cas:

var str = "Some \ 
    String \
    Here";

Quelle est la différence? Un espace après le \. Amusez-vous à déboguer cela.

Robert
la source
bien bollocks ça. Cela ne me permettra pas d'afficher l'espace après le \ sans y mettre un caractère.
jcolebrand
1
@jcolebrand: Oui, assez amusant n'est-ce pas: P
Robert
1
C'est un sale hack. Je t'en prie, non!
Raynos
1
Merci @Robert, l'espace après l'insight '\' m'a fait gagner du temps!
gpestana
8

Jetez un œil au module mstring pour node.js.

C'est un petit module simple qui vous permet d'avoir des chaînes multi-lignes en JavaScript.

Faites juste ceci:

var M = require('mstring')

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

obtenir

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

Et c'est à peu près tout.

Fonctionnement
Dans Node.js, vous pouvez appeler le.toString méthode d'une fonction, et il vous donnera le code source de la définition de fonction, y compris les commentaires. Une expression régulière saisit le contenu du commentaire.

Oui, c'est un hack. Inspiré d'un commentaire jetable de Dominic Tarr .


Remarque: le module (à partir du 2012/13/11) n'autorise pas les espaces avant la fermeture ***/, vous devrez donc le pirater vous-même.

David Murdoch
la source
1
Ou utilisez votre branche de mstring qui contient le correctif d'espace blanc. Merci! github.com/davidmurdoch/mstring
Druska
6

En plus de ce que les gens ont posté ici, j'ai entendu dire que la concaténation peut être beaucoup plus rapide que de se joindre à des vms javascript modernes. Sens:

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

Sera plus lent que:

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

Dans certains cas. http://jsperf.com/string-concat-versus-array-join/3

En passant, je trouve que c'est l'une des fonctionnalités les plus attrayantes de Coffeescript . Oui, oui, je sais, les haineux vont détester.

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

C'est particulièrement bien pour les extraits html. Je ne dis pas que c'est une raison de l'utiliser, mais je souhaite qu'il atterrisse en pays ecma :-(.

Josh

Josh
la source
1
La seule chose qui ne va pas avec CoffeeScript pour moi, c'est la même chose qui ne va pas avec Groovy la dernière fois que j'ai vérifié. Lorsqu'un fichier est converti de .coffeeà .js, les numéros de ligne sont mélangés. Je n'ai pas essayé CoffeeScript, mais quand j'ai essayé Groovy, j'ai trouvé assez difficile de déboguer sans obtenir les .javafichiers générés .
Bryan Field le
J'ai écrit des projets assez importants sur le café. Vous finissez par avoir à regarder le code compilé. Il est cependant facile à lire. imo il y a toujours une stigmatisation inacceptable avec coffeescript dans la communauté des nœuds, bien que plusieurs grands projets y soient écrits (zombie.js, pow, riak-js). Je transfère actuellement certains de mes plus petits OSS, car les gens disent «oh, café, beurk» et passent immédiatement à autre chose, malgré le fait que vous n'avez pas à utiliser de café pour utiliser la bibliothèque.
Josh
Je déteste Coffeescript. : P Mais, je suis définitivement fan du bloc de cordes '' '! Ou ... Syntaxe PHP heredoc.
BMiner
Le modèle de tableau (utilisant join ('\ n')) sera plus lent que la concaténation de chaînes à l'ancienne dans la plupart des cas.
BMiner
1
Sauf pour IE7 et ci-dessous, c'est vrai. Et vous noterez, je l'ai dit et lié à jsperf.
Josh
4

Jetez un œil à CoffeeScript: http://coffeescript.org

Il prend en charge les chaînes multi-lignes, l'interpolation, les compréhensions de tableaux et beaucoup d'autres choses intéressantes.

Ricardo Tomasi
la source
1

En plus de la réponse acceptée:

`this is a 
single string`

qui s'évalue comme suit: 'ceci est une \ nsingle string'.

Si vous souhaitez utiliser l'interpolation de chaîne mais sans nouvelle ligne, ajoutez simplement une barre oblique inverse comme dans une chaîne normale:

`this is a \
single string`

=> 'ceci est une seule chaîne'.

Gardez à l'esprit que les espaces manuels sont nécessaires:

`this is a\
single string`

=> 'ceci est une chaîne unique'

suvtfopw
la source
0

Vanilla Javascipt ne prend pas en charge les chaînes multilignes. Les pré-processeurs linguistiques s'avèrent réalisables ces jours-ci.

CoffeeScript, le plus populaire d'entre eux a cette fonctionnalité, mais ce n'est pas minime, c'est un nouveau langage. Le compilateur traceur de Google ajoute de nouvelles fonctionnalités au langage en tant que sur-ensemble, mais je ne pense pas que les chaînes multilignes soient l'une des fonctionnalités ajoutées.

Je cherche à créer un sur-ensemble minimal de javascript qui prend en charge les chaînes multilignes et quelques autres fonctionnalités. J'ai commencé ce petit langage il y a quelque temps avant d'écrire le compilateur initial pour coffeescript. J'ai l'intention de le terminer cet été.

Si les pré-compilateurs ne sont pas une option, il existe également le hack de balises de script où vous stockez vos données multilignes dans une balise de script dans le html, mais donnez-lui un type personnalisé afin qu'il ne soit pas évalué. Ensuite, en utilisant javascript, vous pouvez extraire le contenu de la balise de script.

De plus, si vous mettez un \ à la fin d'une ligne dans le code source, cela entraînera l'ignorance de la nouvelle ligne comme si elle n'était pas là. Si vous voulez la nouvelle ligne, vous devez terminer la ligne par "\ n \".

Tim Caswell
la source