Node.js có gì độc đáo? [đóng cửa]


48

Gần đây đã có rất nhiều lời khen ngợi cho Node.js. Tôi không phải là nhà phát triển đã tiếp xúc nhiều với ứng dụng mạng. Từ hiểu biết trần trụi của tôi về Nodes.js, điểm mạnh của nó là: chúng tôi chỉ có một luồng xử lý nhiều kết nối, cung cấp kiến ​​trúc dựa trên sự kiện.

Tuy nhiên, ví dụ trong Java, tôi chỉ có thể tạo một luồng bằng NIO / AIO (đó là các API không chặn từ hiểu biết của tôi) và xử lý nhiều kết nối bằng cách sử dụng luồng đó và tôi cung cấp kiến ​​trúc dựa trên sự kiện để triển khai dữ liệu xử lý logic (không nên khó khăn bằng cách cung cấp một số cuộc gọi lại, v.v.)?

Do JVM là một VM thậm chí còn trưởng thành hơn cả V8 (tôi hy vọng nó cũng chạy nhanh hơn) và kiến ​​trúc xử lý dựa trên sự kiện dường như không phải là thứ gì đó khó tạo ra, tôi không chắc tại sao Node.js lại thu hút nhiều sự chú ý đến vậy. Tôi đã bỏ lỡ một số điểm quan trọng?


3
Tôi tự hỏi tại sao nó bị hạ cấp ... Tôi cảm thấy câu hỏi này là một cuộc thảo luận về lập trình nhiều hơn nên tôi đã không đưa vào stackoverflow. Tôi cũng đã cố gắng tìm kiếm các chủ đề tương tự nhưng tôi chỉ tìm thấy thông tin về sức mạnh của Nodes.js nhưng vấn đề của tôi là tôi không thực sự hiểu tại sao "sức mạnh" lại độc đáo đến vậy (mà tôi vẫn không thể tìm thấy)
Adrian Shum

6
Hãy thử triển khai mẫu đó trong Java. Nó hoạt động, tất nhiên. Nhưng bạn sẽ thấy một điều: Sẽ rất, rất dài dòng trong Java: bạn cần hàng tấn cuộc gọi lại, điều này hầu như luôn có nghĩa là tạo các lớp mới. Điều đó nghe có vẻ giống như một cú đánh nhỏ, nhưng trong một chương trình lớn, nó có thể trở nên xấu xí và khó sử dụng khá nhanh.
Joachim Sauer

6
Các cuộc gọi lại Javascript dễ trở nên khó sử dụng - và spaghetti như vậy dễ dàng hơn để gỡ lỗi và tái cấu trúc trong Java so với Javascript IMO.
funkybro

5
@AdrianShum: đó là hiệu ứng slashdot, bất cứ điều gì không phù hợp với suy nghĩ của nhóm sẽ bị hạ thấp - như ca ngợi Microsoft trên /.
gbjbaanb

3
Tôi ngạc nhiên khi không thấy ai nhắc đến sự cường điệu.
deadalnix

Câu trả lời:


33

Mặc dù khái niệm đó thực sự có thể được triển khai bằng nhiều ngôn ngữ (và như dodgy_coder đã đề cập, ít nhất nó đã được triển khai trong Ruby và Python), nhưng nó không hoàn toàn tầm thường như bạn nêu.

Đúng, Java có các API IO không chặn. Vì vậy, bạn có thể thực hiện IO đĩa / mạng thô theo cách không chặn. Tuy nhiên, mọi API bằng cách nào đó kết thúc hoặc xử lý IO cũng cần được triển khai theo cách không chặn. Mọi trình phân tích cú pháp XML, mọi trình điều khiển cơ sở dữ liệu, mọi trình chuyển đổi định dạng tệp cần được viết để hỗ trợ IO không chặn. Bởi vì nếu một thư viện duy nhất đang chặn trong mẫu này, thì điều đó sẽ làm giảm hiệu suất máy chủ của bạn xuống các giá trị thời đồ đá.

Node.js có cơ sở hạ tầng thư viện đó, bởi vì nó luôn được thiết kế theo cách đó: mọi thư viện cố gắng trở nên phổ biến đều phải cung cấp API không đồng bộ nếu không sẽ không được sử dụng.


18
Vâng. Nói cách khác: Điểm mạnh quan trọng nhất của Node.js là điểm yếu quan trọng nhất của ECMAScript: thư viện tiêu chuẩn ECMAScript cực kỳ nhảm nhí. Vì các nhà phát triển Node.js dù sao cũng phải phát minh lại từng bánh xe, nên họ có cơ hội phát minh lại nó đúng cách.
Jörg W Mittag

4
Chà, theo như tôi biết thì ECMAScript luôn được thiết kế như một ngôn ngữ nhúng, do đó, không cần API cấp độ hệ điều hành dưới bất kỳ hình thức nào (ngay cả IO mạng hầu như bị trừu tượng hóa). Sự thiếu thốn đó thực sự là một lợi thế cho Node.js.
Joachim Sauer

"Mọi thư viện phấn đấu để trở nên phổ biến đều phải cung cấp API không đồng bộ hoặc nó sẽ không được sử dụng" Tôi nghĩ đó chính xác là những gì tôi đang tìm kiếm. Có tài nguyên nào để xem xét về cách api không đồng bộ được cung cấp cho, ví dụ, phân tích cú pháp XML và truy cập DB, trong Node.js không?
Adrian Shum

1
@AdrianShum nói chung, hãy tìm các ví dụ lập trình hướng sự kiện. Triển khai cụ thể có thể được tìm thấy trong nhiều ngôn ngữ. Bên cạnh đó các module Node.js, bạn có thể nhìn vào ví dụ Twisted bằng Python, twistedmatrix.com/trac/wiki , ví dụ POE trong Perl, poe.perl.org , và Ruby có EventMachine, github.com/eventmachine/eventmachine
mghicks

19

Có lẽ lý do chính là nó sử dụng JavaScript để viết các thành phần phía máy chủ cho những thứ như máy chủ web, ứng dụng web hoặc dịch vụ web. Điều này hợp nhất JavaScript ngôn ngữ phát triển mặt trước truyền thống (phía máy khách) với ngôn ngữ phía máy chủ.

Bạn nói đúng - thực tế là nó không chặn, sử dụng mẫu lò phản ứng không phải là duy nhất - nó đã được thực hiện trước khi sử dụng các ngôn ngữ và khung khác, chẳng hạn như Ruby's EventMachine hoặc Python's Twisted.


5
rất ít công nghệ có các tính năng thực sự độc đáo, sự độc đáo đến từ sự kết hợp đặc biệt của tất cả các tính năng của chúng
jk.

1
Đồng ý, có một danh sách các thư viện hỗ trợ nó ở tất cả các ngôn ngữ chính ... Mô hình lò phản ứng trên Wikipedia
dodgy_coder

10

Ba lý do chính tôi sẽ đưa ra là:

  1. Không chặn IO / IO không đồng bộ. Điều này được băm ở khắp mọi nơi trên web và trong các áp phích trước. Một điều tôi sẽ đóng góp là việc thiết kế mã của bạn để giả định rõ ràng các hành vi không đồng bộ hỗ trợ công cụ biên dịch để tối đa hóa phần cứng. Có, nhiều trình biên dịch JIT và bộ xử lý siêu phân luồng có mã đồng bộ và giúp song song hóa việc thực thi. Tất nhiên đây là một cách tiếp cận nỗ lực tốt nhất. Ngược lại, xây dựng ứng dụng một cách rõ ràng cho async io bạn đảm bảo công cụ và phần cứng có thể tối đa hóa thời gian thực hiện cho mã của bạn. Phải thừa nhận rằng, tôi không có dữ liệu có thể định lượng để chứng minh điều này, nhưng nó khiến tôi cảm thấy ấm áp khi nghĩ theo cách này.

  2. Cơ sở mã duy nhất cho khách hàng và máy chủ. Điều này có một số lợi thế: giúp tối ưu hóa chi phí trung tâm dữ liệu bằng cách có thể di chuyển logic nghiệp vụ từ máy chủ sang máy khách; giúp sử dụng lại xác thực logic / dữ liệu kinh doanh; giảm độ phức tạp của các kỹ năng dành cho nhà phát triển cần tồn tại để hỗ trợ sản phẩm (so với Python & javascript).

  3. Rào cản thấp để vào. Theo nhiều cách, Javascirpt giống như Basic, Pascal và Perl của năm. Rất dễ dàng để bắt đầu viết mã và không đòi hỏi nhiều kiến ​​thức về tên miền để bắt đầu. Điều này cũng giúp giảm chi phí phát triển của bạn bằng cách có thể mang lại nhiều nhà phát triển jr hơn và tăng cường cho một dự án. [Tất nhiên bạn cần vượt qua những ý thức hệ tin rằng ngôn ngữ lập trình sẽ khó khăn để loại bỏ các nhà phát triển chức năng thấp]


Tôi không chắc chắn tôi khuyên bạn nên xây dựng một nhóm Node hoàn toàn với jr. Nhà phát triển JS. Kiến trúc không thực sự là điều chúng ta phải suy nghĩ trong các dự án web / UI cấp jr hơn và JS mất nhiều thời gian để thực sự giỏi về việc xây dựng đường dài như bất kỳ ngôn ngữ nào khác ngay cả khi bạn có thể nhận được kết quả tương đối nhanh ở mức độ kinh nghiệm thấp hơn trong các dự án ít phức tạp hơn là điển hình.
Erik Reppen

Tôi đồng ý với @ErikReppen; một nhóm kiến ​​trúc hoàn toàn gồm các nhà phát triển cơ sở (không phân biệt ngôn ngữ) giống như thiết kế và xây dựng một ngôi nhà hoàn toàn sử dụng những người thợ mộc giỏi xây dựng ghế, bàn và chuồng chó.
tự đại diệ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.