Làm cách nào để thực hiện một chuỗi nhiều dòng trong node.js?


128

Với sự gia tăng của node.js, các chuỗi nhiều dòng đang trở nên cần thiết hơn trong JavaScript.

  1. Có cách nào đặc biệt để làm điều này trong Node.JS, ngay cả khi nó không hoạt động trong trình duyệt?
  2. Có bất kỳ kế hoạch hoặc ít nhất là một yêu cầu tính năng để làm điều này mà tôi có thể hỗ trợ?

Tôi đã biết rằng bạn có thể sử dụng \n\ở cuối mỗi dòng, đó không phải là điều tôi muốn.


1
Tại sao trên trái đất bạn sẽ cần phải chèn trả lại dòng cứng? Không có gì trong DOM hỗ trợ điều đó (ngoại trừ "trước") và tất cả các loại trả lại phổ biến khác không quan tâm.
jcolebrand

Vì vậy, tôi không kết thúc với các tab ở bên trái mà không trả về bên phải. Tôi muốn có cả hai hoặc không có. Ngay bây giờ tôi đang sử dụng print( '<div>')để in HTML của mình. Nó không có các tab cũng không trả về "gọn gàng", nhưng sẽ dễ dàng hơn khi sử dụng <<EOF..EOFchuỗi kiểu Perl hoặc tệp JSP kiểu Java. Dù sao, tôi cần phải có khả năng nhập các biến trong chuỗi nhiều dòng khi nó đến. Tôi sẽ làm mà không cần bây giờ.
Bryan Field

9
@jcolebrand: Node.JS không liên quan chủ yếu đến thao tác DOM. Đó là một môi trường phát triển ứng dụng đầy đủ. Xem nodejs.org
Roy Tinker

@RoyTinker có, nhưng anh ấy đã gọi các trình duyệt vào thời điểm đó, và trên hết, anh ấy đã gọi ra các \ntriển khai không thực hiện, vì vậy ... đó chỉ là các trình duyệt khá tốt.
jcolebrand

@GeorgeBailey Nếu bạn vẫn sử dụng stack stack, bạn có thể sửa câu trả lời đúng ở đây không?
mikemaccana

Câu trả lời:


164

nút v4 và các phiên bản hiện tại của nút

Kể từ ES6 (và vì vậy các phiên bản của Node lớn hơn v4), một loại nội tại "mẫu bằng chữ" mới đã được thêm vào Javascript (ký hiệu là back-ticks "` ") cũng có thể được sử dụng để xây dựng các chuỗi nhiều dòng, như trong :

`this is a 
single string`

mà đánh giá để : 'this is a\nsingle string'.

Lưu ý rằng dòng mới ở cuối dòng đầu tiên được bao gồm trong chuỗi kết quả.

Các mẫu chữ đã được thêm vào để cho phép các lập trình viên xây dựng các chuỗi trong đó các giá trị hoặc mã có thể được chèn trực tiếp vào một chuỗi ký tự mà không phải sử dụng util.formathoặc các templaters khác, như trong:

let num=10;

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

sẽ in "kết quả của 10 cộng 10 là 20." đến bàn điều khiển.

Các phiên bản cũ hơn của nút

Phiên bản cũ hơn của nút có thể sử dụng ký tự "tiếp tục dòng" cho phép bạn viết các chuỗi nhiều dòng như:

'this is a \
single string'

mà đánh giá để : 'this is a single string'.

Lưu ý rằng dòng mới ở cuối dòng đầu tiên không được bao gồm trong chuỗi kết quả.


Tôi nghĩ rằng tôi sẽ kết thúc bằng stackoverflow.com/questions/805107/ . Tôi có thể mở rộng trên nó để tôi có thể sử dụng các biến. Chắc chắn nó sẽ sáng tạo! Nhưng vì đây là Node.JS, tôi không phải lo lắng về khả năng tương thích trình duyệt và trong trường hợp của tôi, thậm chí không tương thích phiên bản.
Bryan Field

6
"Javascript không hỗ trợ các chuỗi nhiều dòng ..." Nó hoạt động như ES5 và nó ở dạng V8 (công cụ JavaScript của Google), do đó, có lẽ là trong NodeJS (sử dụng V8). Xem LineContininating trong [Phần 7.8.4] * ( es5.github.com/#x7.8.4 ). Công cụ hỗ trợ có thể sơ sài trong một thời gian.
TJ Crowder

Nó có trong io.js nhưng chưa có Node.JS - Tôi đã thêm một câu trả lời với một vài liên kết nữa
Simon D

1
Node 4.0+ hiện hỗ trợ các chuỗi multiline về bản chất.
Rob Raisch

46

Chuỗi nhiều dòng là một phần hiện tại của JavaScript (kể từ ES6) và được hỗ trợ trong node.js v4.0.0 và mới hơn.

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

console.log(text);

2
Câu trả lời này nên được bình chọn lên đầu ngay lập tức! Xem developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Khăn để biết chi tiết về chuỗi mẫu.
dùng3413723

2
Có thể muốn lưu ý rằng bạn có thể dễ dàng thêm các biến bằng cách thêm cú pháp $ {biến số} bên trong khuôn mẫu (`` ticks)
Joseph Astrahan

40

Chính xác những gì bạn đang tìm kiếm khi bạn có nghĩa là chuỗi multiline.

Bạn đang tìm kiếm một cái gì đó như:

var str = "Some \
    String \
    Here";

Mà sẽ in là "Một số chuỗi ở đây"?

Nếu vậy, hãy nhớ rằng ở trên là Javascript hợp lệ, nhưng đây không phải là:

var str = "Some \ 
    String \
    Here";

Có gì khác biệt? Một không gian sau \. Hãy vui vẻ gỡ lỗi đó.


cũng tốt đó. Nó sẽ không cho phép tôi hiển thị không gian sau \ mà không đặt một ký tự ở đó.
jcolebrand

1
@jcolebrand: Vâng, khá vui phải không: P
Robert


1
Đây là một hack bẩn. Xin đừng!
Raynos

1
Cảm ơn @Robert, không gian sau cái nhìn sâu sắc '\' đã giúp tôi tiết kiệm thời gian!
gpestana

8

Hãy nhìn vào các mstring mô-đun cho node.js.

Đây là một mô-đun nhỏ đơn giản cho phép bạn có các chuỗi nhiều dòng trong JavaScript.

Chỉ cần làm điều này:

var M = require('mstring')

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

để có được

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

Và đó là khá nhiều đó.

Cách thức hoạt động
trong Node.js, bạn có thể gọi.toString phương thức của hàm và nó sẽ cung cấp cho bạn mã nguồn của định nghĩa hàm, bao gồm mọi nhận xét. Một biểu thức thông thường lấy nội dung của bình luận.

Vâng, đó là một hack. Lấy cảm hứng từ một bình luận vứt đi từ Dominic Tarr .


lưu ý: Mô-đun (kể từ 2012/13/11) không cho phép khoảng trắng trước khi đóng ***/, vì vậy bạn sẽ cần tự hack nó.


1
Hoặc sử dụng nhánh dây của bạn có chứa bản sửa lỗi khoảng trắng. Cảm ơn! github.com/davidmurdoch/mopes
Druska

6

Bên cạnh những gì mọi người đã đăng ở đây, tôi đã nghe nói rằng việc ghép nối có thể nhanh hơn nhiều so với việc tham gia vào các vms javascript hiện đại. Ý nghĩa:

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

Sẽ chậm hơn:

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

Trong tình huống nhất định. http://jsperf.com/opes-concat-versus-array-join/3

Mặt khác, tôi thấy đây là một trong những tính năng hấp dẫn hơn trong Coffeescript . Vâng, vâng, tôi biết, những người ghét sẽ ghét.

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

Nó đặc biệt tốt cho đoạn mã html. Tôi không nói lý do để sử dụng nó, nhưng tôi ước nó sẽ hạ cánh xuống đất ecma :-(.

Josh


1
Điều duy nhất sai với CoffeeScript đối với tôi, là điều tương tự sai với Groovy lần trước tôi đã kiểm tra. Khi một tệp được chuyển đổi từ .coffeesang .js, số dòng bị xáo trộn. Tôi chưa thử CoffeeScript, nhưng khi tôi thử Groovy, tôi thấy khá khó để gỡ lỗi mà không nhận được các .javatệp được tạo .
Bryan Field

Tôi đã viết một số dự án hợp lý lớn trong cà phê. Bạn cuối cùng phải xem mã được biên dịch. Nó là, tuy nhiên, dễ đọc. Imo vẫn còn một sự kỳ thị không thể chấp nhận được với coffeescript trong cộng đồng nút, mặc dù một số dự án lớn được viết trong đó (zombie.js, pow, riak-js). Tôi hiện đang chuyển một số OSS nhỏ hơn của mình, vì mọi người nói 'oh, cà phê, ú òa' và ngay lập tức tiếp tục, mặc dù thực tế là bạn không phải sử dụng cà phê để sử dụng thư viện.
Josh

Tôi là một người ghét Coffeescript. : P Nhưng, tôi chắc chắn là một fan hâm mộ của chuỗi khối '' '! Hoặc ... cú pháp heredoc PHP.
BMiner

Mẫu mảng (sử dụng phép nối ('\ n')) sẽ chậm hơn so với nối chuỗi cũ đơn giản trong hầu hết các trường hợp.
BMiner

1
Ngoại trừ IE7 trở xuống, điều này là đúng. Và bạn sẽ lưu ý, tôi đã nói điều đó và liên kết với jsperf.
Josh



1

Ngoài câu trả lời được chấp nhận:

`this is a 
single string`

ước tính: 'đây là chuỗi \ nsingle'.

Nếu bạn muốn sử dụng phép nội suy chuỗi nhưng không có dòng mới, chỉ cần thêm dấu gạch chéo ngược như trong chuỗi bình thường:

`this is a \
single string`

=> 'đây là một chuỗi đơn'.

Ghi nhớ khoảng trắng thủ công là cần thiết mặc dù:

`this is a\
single string`

=> 'đây là chuỗi ký tự'


0

Vanilla Javascipt không hỗ trợ chuỗi nhiều dòng. Những bộ xử lý ngôn ngữ đang trở nên khả thi trong những ngày này.

CoffeeScript, phổ biến nhất trong số này có tính năng này, nhưng nó không phải là tối thiểu, đó là một ngôn ngữ mới. Trình biên dịch theo dõi của Google bổ sung các tính năng mới cho ngôn ngữ dưới dạng superset, nhưng tôi không nghĩ các chuỗi nhiều dòng là một trong những tính năng được thêm vào.

Tôi đang tìm cách tạo ra một siêu javascript tối thiểu hỗ trợ các chuỗi đa dòng và một vài tính năng khác. Tôi đã bắt đầu ngôn ngữ nhỏ này một thời gian trước khi viết trình biên dịch ban đầu cho coffeescript. Tôi dự định hoàn thành nó vào mùa hè này.

Nếu trình biên dịch trước không phải là một tùy chọn, thì cũng có hack thẻ script nơi bạn lưu trữ dữ liệu nhiều dòng của mình trong thẻ script trong html, nhưng cung cấp cho nó một loại tùy chỉnh để nó không bị loại bỏ. Sau đó, sử dụng javascript, bạn có thể trích xuất nội dung của thẻ script.

Ngoài ra, nếu bạn đặt \ ở cuối bất kỳ dòng nào trong mã nguồn, nó sẽ khiến dòng mới bị bỏ qua như thể nó không có ở đó. Nếu bạn muốn dòng mới, thì bạn phải kết thúc dòng bằng "\ n \".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.