Bagaimana cara melakukan string multi-baris di node.js?

128

Dengan munculnya node.js, string multi-baris menjadi lebih diperlukan di JavaScript.

  1. Apakah ada cara khusus untuk melakukan ini di Node.JS, meskipun tidak berfungsi di browser?
  2. Apakah ada rencana atau setidaknya permintaan fitur untuk melakukan ini yang dapat saya dukung?

Saya sudah tahu bahwa Anda dapat menggunakan \n\di akhir setiap baris, bukan itu yang saya inginkan.

Bryan Field
sumber
1
Mengapa Anda perlu memasukkan pengembalian garis keras? Tidak ada di DOM yang mendukung itu (kecuali "pre"), dan semua tipe pengembalian umum lainnya tidak peduli.
jcolebrand
Jadi saya tidak berakhir dengan tab di sebelah kiri tanpa pengembalian di sebelah kanan. Saya suka memiliki keduanya atau tidak sama sekali. Sekarang saya menggunakan print( '<div>')untuk mencetak HTML saya. Ia tidak memiliki tab atau pun hasil yang "rapi", tetapi akan lebih mudah untuk menggunakan <<EOF..EOFstring gaya Perl atau file JSP gaya Java. Bagaimanapun, saya harus bisa memasukkan variabel dalam string multi-baris saat itu datang. Saya akan melakukannya untuk saat ini.
Bryan Field
9
@jcolebrand: Node.JS tidak terlalu peduli dengan manipulasi DOM. Ini adalah lingkungan pengembangan aplikasi lengkap. Lihat nodejs.org
Roy Tinker
@RoyTinker ya, tapi dia memanggil browser pada saat itu, dan di atas itu dia menyebut non- \nimplementasi, jadi ... itu hanya browser yang cukup baik.
jcolebrand
@GeorgeBailey Jika Anda masih menggunakan stack overflow, dapatkah Anda memperbaiki jawaban yang benar di sini?
mikemaccana

Jawaban:

165

node v4 dan versi node saat ini

Sejak ES6 (dan versi Node yang lebih besar dari v4), jenis intrinsik "template literal" baru telah ditambahkan ke Javascript (dilambangkan dengan tanda centang "` ") yang juga dapat digunakan untuk membuat string multi-baris, seperti pada :

`this is a 
single string`

yang mengevaluasi ke: 'this is a\nsingle string'.

Perhatikan bahwa baris baru pada akhir baris pertama adalah termasuk dalam string yang dihasilkan.

Literal templat ditambahkan untuk memungkinkan pemrogram membuat string di mana nilai atau kode dapat langsung dimasukkan ke dalam literal string tanpa harus menggunakan util.formatatau templater lainnya, seperti di:

let num=10;

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

yang akan mencetak "hasil dari 10 ditambah 10 adalah 20." ke konsol.

Versi node yang lebih lama

Versi node yang lebih lama dapat menggunakan karakter "baris lanjutan" yang memungkinkan Anda menulis string multi-baris seperti:

'this is a \
single string'

yang mengevaluasi ke: 'this is a single string'.

Perhatikan bahwa baris baru di akhir baris pertama tidak disertakan dalam string yang dihasilkan.

Rob Raisch
sumber
Saya rasa saya akan berakhir menggunakan stackoverflow.com/questions/805107/… . Saya dapat mengembangkannya sehingga saya dapat menggunakan variabel. Pasti akan kreatif! Tetapi karena ini adalah Node.JS, saya tidak perlu khawatir tentang kompatibilitas browser, dan dalam kasus saya, bahkan kompatibilitas versi.
Bryan Field
6
"Javascript tidak mendukung string multi-baris ..." Itu berfungsi seperti ES5, dan ada di V8 (mesin JavaScript Google), jadi mungkin di NodeJS (yang menggunakan V8). Lihat LineContinuation di [Bagian 7.8.4] * ( es5.github.com/#x7.8.4 ). Dukungan alat mungkin samar untuk sementara waktu.
TJ Crowder
Ada di io.js tetapi belum Node.JS - Saya menambahkan jawaban dengan beberapa tautan lagi
Simon D
1
Node 4.0+ sekarang mendukung string multiline secara intrinsik.
Rob Raisch
46

String multiline adalah bagian JavaScript saat ini (sejak ES6) dan didukung di node.js v4.0.0 dan yang lebih baru.

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

console.log(text);
Vijey
sumber
2
Jawaban ini harus segera dipilih sebagai yang teratas! Lihat developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… untuk detail tentang string template.
pengguna3413723
2
Mungkin ingin diperhatikan bahwa Anda dapat dengan mudah menambahkan variabel dengan menambahkan sintaks $ {variablehere} di dalam template (tanda `` ticks)
Joseph Astrahan
40

Apa sebenarnya yang Anda cari saat yang Anda maksud adalah string multiline.

Apakah Anda mencari sesuatu seperti:

var str = "Some \
    String \
    Here";

Yang mana yang akan dicetak sebagai "Beberapa String Di Sini"?

Jika demikian, perlu diingat bahwa yang di atas adalah Javascript yang valid, tetapi ini bukan:

var str = "Some \ 
    String \
    Here";

Apa bedanya? Spasi setelah \. Selamat men-debug itu.

Robert
sumber
baik omong kosong itu. Itu tidak akan membiarkan saya menunjukkan spasi setelah \ tanpa meletakkan karakter di sana.
jcolebrand
1
@jcolebrand: Ya, cukup menyenangkan bukan: P
Robert
1
Ini adalah peretasan kotor. Kumohon tidak!
Raynos
1
Terima kasih @Robert, spasi setelah wawasan '\' menghemat waktu saya!
gpestana
8

Lihatlah di mstring modul untuk Node.js.

Ini adalah modul kecil sederhana yang memungkinkan Anda memiliki string multi-baris di JavaScript.

Lakukan saja ini:

var M = require('mstring')

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

mendapatkan

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

Dan itu cukup banyak.

Bagaimana Ia Bekerja
Di Node.js, Anda dapat memanggil .toStringmetode suatu fungsi, dan itu akan memberi Anda kode sumber definisi fungsi, termasuk komentar apa pun. Ekspresi reguler mengambil konten komentar.

Ya, ini hack. Terinspirasi oleh komentar sekali pakai dari Dominic Tarr .


catatan: Modul (per 2012/13/11) tidak mengizinkan spasi sebelum penutupan ***/, jadi Anda harus meretasnya sendiri.

David Murdoch
sumber
1
Atau gunakan cabang mstring Anda yang berisi perbaikan spasi putih. Terima kasih! github.com/davidmurdoch/mstring
Druska
6

Selain dari apa yang telah diposting orang-orang di sini, saya pernah mendengar bahwa penggabungan bisa jauh lebih cepat daripada bergabung di vms javascript modern. Berarti:

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

Akan lebih lambat dari:

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

Dalam kasus-kasus tertentu. http://jsperf.com/string-concat-versus-array-join/3

Selain itu, menurut saya ini salah satu fitur yang lebih menarik di Coffeescript . Ya, ya, saya tahu, pembenci akan membenci.

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

Ini sangat bagus untuk cuplikan html. Saya tidak mengatakan itu alasan untuk menggunakannya, tapi saya berharap itu akan mendarat di tanah ecma :-(.

Josh

Josh
sumber
1
Satu-satunya hal yang salah dengan CoffeeScript bagi saya, adalah hal yang salah sama dengan Groovy yang terakhir saya periksa. Ketika sebuah file diubah dari .coffeemenjadi .js, nomor barisnya campur aduk. Saya belum mencoba CoffeeScript, tetapi ketika saya mencoba Groovy, saya merasa cukup sulit untuk melakukan debug tanpa mendapatkan .javafile yang dihasilkan .
Bryan Field
Saya telah menulis beberapa proyek yang cukup besar di bidang kopi. Anda akhirnya harus melihat kode yang dikompilasi. Namun, ini mudah dibaca. imo masih ada stigma yang tidak dapat diterima dengan coffeescript di komunitas node, meskipun beberapa proyek besar ditulis di dalamnya (zombie.js, pow, riak-js). Saat ini saya sedang memindahkan beberapa OSS saya yang lebih kecil, karena orang-orang berkata 'oh, coffee, yuck' dan segera pindah, terlepas dari kenyataan bahwa Anda tidak perlu menggunakan kopi untuk menggunakan perpustakaan.
Josh
Saya pembenci Coffeescript. : P Tapi, saya pasti penggemar blok string '' '! Atau ... sintaks heredoc PHP.
BMiner
Pola array (menggunakan join ('\ n')) akan lebih lambat daripada penggabungan string biasa dalam banyak kasus.
BMiner
1
Kecuali untuk IE7 dan di bawahnya, ini benar. Dan Anda akan mencatat, saya mengatakan itu dan ditautkan ke jsperf.
Josh
4

Lihat CoffeeScript: http://coffeescript.org

Ini mendukung string multi-baris, interpolasi, pemahaman array dan banyak hal bagus lainnya.

Ricardo Tomasi
sumber
1

Selain jawaban yang diterima:

`this is a 
single string`

yang dievaluasi menjadi: 'this is a \ nsingle string'.

Jika Anda ingin menggunakan interpolasi string tetapi tanpa baris baru, cukup tambahkan garis miring terbalik seperti pada string biasa:

`this is a \
single string`

=> 'ini adalah satu string'.

Ingatlah bahwa spasi manual diperlukan:

`this is a\
single string`

=> 'ini adalah satu string'

suvtfopw.dll
sumber
0

Vanilla Javascipt tidak mendukung string multi-baris. Bahasa pra-pengolah berubah menjadi layak hari ini.

CoffeeScript, yang paling populer memiliki fitur ini, tetapi tidak minimal, ini adalah bahasa baru. Kompiler traceur Google menambahkan fitur baru ke bahasa sebagai superset, tetapi menurut saya string multi-baris bukanlah salah satu fitur tambahan.

Saya sedang mencari superset minimal javascript yang mendukung string multiline dan beberapa fitur lainnya. Saya memulai bahasa kecil ini beberapa waktu yang lalu sebelum menulis kompiler awal untuk coffeescript. Saya berencana untuk menyelesaikannya musim panas ini.

Jika pra-kompiler bukan pilihan, ada juga peretasan tag skrip di mana Anda menyimpan data multi-baris Anda dalam tag skrip di html, tetapi berikan tipe khusus sehingga tidak terevaluasi. Kemudian nantinya menggunakan javascript, Anda bisa mengekstrak isi dari tag script tersebut.

Selain itu, jika Anda meletakkan \ di akhir baris mana pun dalam kode sumber, ini akan menyebabkan baris baru diabaikan seolah-olah tidak ada. Jika Anda menginginkan baris baru, maka Anda harus mengakhiri baris dengan "\ n \".

Tim Caswell
sumber