Bungkus garis literal template yang panjang menjadi multiline tanpa membuat baris baru dalam string

153

Dalam literal template es6, bagaimana cara membungkus literal template yang panjang menjadi multiline tanpa membuat baris baru dalam string?

Misalnya, jika Anda melakukan ini:

const text = `a very long string that just continues
and continues and continues`

Kemudian itu akan membuat simbol baris baru ke string, sebagai interpretasinya untuk memiliki baris baru. Bagaimana cara membungkus literal template yang panjang menjadi beberapa baris tanpa membuat baris baru?

Ville Miekk-oja
sumber
2
FWIW garis lanjutan sulit dibaca dan rapuh terhadap ruang tak terduga, jadi saya lebih suka solusi Monte Jones daripada Codingintrigue. FWIW panduan gaya Google merekomendasikan solusi Monte Jones dan panduan AirBnB merekomendasikan hanya menggunakan garis yang sangat panjang sebagai gantinya - yaitu, tidak ada yang merekomendasikan kelanjutan saluran. FWIW, saya tidak dapat menemukan topik ini dalam pemeriksaan cepat panduan gaya lainnya.
Tom O'Neill

Jawaban:

210

Jika Anda memasukkan sebuah baris lanjutan ( \) pada titik baris baru secara literal, itu tidak akan membuat baris baru pada keluaran:

const text = `a very long string that just continues\
and continues and continues`;
console.log(text); // a very long string that just continuesand continues and continues
CodingIntrigue
sumber
1
Saya tidak yakin saya mengerti maksud Anda. Bisakah Anda memberikan Contoh REPL ?
CodingIntrigue
1
Tidak mudah dalam kasus saya, karena variabel yang berbeda diambil dari file konfigurasi coffeescript dll .. mm .. tampaknya berfungsi sebaliknya tetapi untuk beberapa alasan ia menambahkan ruang kosong di sana
Ville Miekk-oja
1
Jika Anda menggunakan kelanjutan baris pada baris pertama, itu tidak berfungsi untuk saya (node ​​v7)
Danielo515
2
Jika Anda menggunakan ini untuk pengujian terkadang tidak mengembalikan string yang sama. Saya telah mengatasi sakit kepala saya dengan menggunakan deline yang hanya1.1k Airbnb library
iarroyo
53
Solusi ini tidak bekerja dengan baik dengan indentasi (dan indentasi umum dalam pengembangan). Karakter setelah \ di baris baru harus menjadi karakter pertama di baris itu. Artinya, and continues...harus dimulai dari posisi 0 di baris baru, melanggar aturan indentasi.
KingJulian
59

Ini yang lama. Tapi itu muncul. Jika Anda meninggalkan spasi di editor, itu akan menempatkannya di sana.

if
  const text = `a very long string that just continues\
  and continues and continues`;

cukup lakukan simbol + normal

if
  const text = `a very long string that just continues` +
  `and continues and continues`;
Monte Jones
sumber
Bagus, tapi sebagian alasan saya menggunakan ini adalah untuk menghindari simbol '+'. Itu membuat kode lebih sulit dibaca dan lebih mengganggu untuk dikerjakan.
lakukan
23

Anda bisa memakan jeda baris di dalam template literal Anda.

// Thanks to https://twitter.com/awbjs for introducing me to the idea
// here: https://esdiscuss.org/topic/multiline-template-strings-that-don-t-break-indentation

const printLongLine = continues => {
    const text = `a very long string that just ${continues}${''
                 } and ${continues} and ${continues}`;
    return text;
}
console.log(printLongLine('continues'));

Doug Coburn
sumber
3
Ini adalah peretasan yang sangat bagus, tetapi gagal jika Anda memiliki pemformat yang cantik (seperti prettier) yang dikonfigurasi di IDE Anda. prettiermembungkus ini kembali ke satu baris.
Rvy Pandey
11

EDIT : Saya telah membuat modul NPM kecil dengan utilitas ini. Ini berfungsi di web dan di Node dan saya sangat merekomendasikannya melalui kode dalam jawaban saya di bawah ini karena jauh lebih kuat. Ini juga memungkinkan untuk mempertahankan baris baru dalam hasil jika Anda memasukkannya secara manual sebagai \n, dan menyediakan fungsi ketika Anda sudah menggunakan tag literal template untuk sesuatu yang lain: https://github.com/iansan5653/compress-tag


Saya tahu saya terlambat menjawab di sini, tetapi jawaban yang diterima masih memiliki kelemahan yaitu tidak mengizinkan indentasi setelah jeda baris, yang berarti Anda masih tidak dapat menulis kode yang tampak sangat bagus hanya dengan keluar dari baris baru.

Sebaliknya, mengapa tidak menggunakan fungsi literal template yang diberi tag ?

function noWhiteSpace(strings, ...placeholders) {
  // Build the string as normal, combining all the strings and placeholders:
  let withSpace = strings.reduce((result, string, i) => (result + placeholders[i - 1] + string));
  let withoutSpace = withSpace.replace(/\s\s+/g, ' ');
  return withoutSpace;
}

Kemudian Anda cukup memberi tag literal template apa pun yang Anda inginkan untuk memiliki jeda baris:

let myString = noWhiteSpace`This is a really long string, that needs to wrap over
    several lines. With a normal template literal you can't do that, but you can 
    use a template literal tag to allow line breaks and indents.`;

Ini memang memiliki kelemahan karena mungkin memiliki perilaku yang tidak terduga jika pengembang masa depan tidak terbiasa dengan sintaks template yang diberi tag atau jika Anda tidak menggunakan nama fungsi deskriptif, tetapi rasanya seperti solusi terbersih untuk saat ini.

Ian
sumber
9

Opsi lainnya adalah menggunakan Array.join, seperti:

[
    'This is a very long string. ',
    'It just keeps going ',
    'and going ',
    'and going ',
    'and going ',
    'and going ',
    'and going ',
    'and going',
].join('')
Liran H.
sumber
3

Gunakan yang lama dan yang baru. Literal template sangat bagus, tetapi jika Anda ingin menghindari literal yang panjang agar memiliki baris kode yang padat, gabungkan dan ESLint tidak akan menimbulkan keributan.

const text = `a very long string that just continues`
  +` and continues and continues`;
console.log(text);
Raymond Wachaga
sumber
1

Mirip dengan jawaban Doug, ini diterima oleh konfigurasi TSLint saya dan tetap tidak tersentuh oleh pemformat otomatis IntelliJ saya:

const text = `a very long string that just ${
  continues
} and ${continues} and ${continues}`
Daniel K
sumber
0

Solusi yang diusulkan oleh @CodingIntrigue tidak berfungsi untuk saya pada node 7. Nah, ini berfungsi jika saya tidak menggunakan kelanjutan baris pada baris pertama, sebaliknya gagal.

Ini mungkin bukan solusi terbaik, tetapi berfungsi tanpa masalah:

(`
    border:1px solid blue;
    border-radius:10px;
    padding: 14px 25px;
    text-decoration:none;
    display: inline-block;
    text-align: center;`).replace(/\n/g,'').trim();
Danielo515
sumber