Node.js có phải là khung không? [đóng cửa]


35

Tôi liên tục thấy các nhà tuyển dụng, nhà phát triển, v.v. tham khảo Node.js như một khung. Theo tôi, điều này là không biết gì về Node.js thực sự là gì.

Thông thường, trong các mô tả công việc, Node.js được nhóm thành một thư viện trong số AngularJS , React , v.v. Nói chung, tôi thấy nó được nhập bởi một người không biết sự khác biệt (HR, một nhà tuyển dụng, v.v.).

Theo tôi, Node.js là một nền tảng hoặc môi trường thời gian chạy; nó chuyển API DOM (JavaScript trong trình duyệt) cho nhiều API khác, như hệ thống tệp (vì nó chạy như một máy chủ chứ không phải trong trình duyệt).

Tại sao mọi người nghĩ Node.js là một khung công tác; Tôi có lầm không? Có thực sự là một khuôn khổ?



5
Không đặc biệt, nhưng tôi có thể thấy sự nhầm lẫn.
ndugger

1
Cách đây rất lâu, khi nút đầu tiên xuất hiện, tôi đã đăng một câu trả lời trên SO nói rằng nút đó không phải là một khung. Câu trả lời đó đã vô cùng bị đánh giá thấp sau đó. Ngày nay, rất ít người sử dụng nút tin rằng đó là một khung. Đó là một khung theo cùng nghĩa rằng Swift là một khung hoặc Go là một khung hoặc Rust là một khung. Các ngôn ngữ lập trình hiện đại chỉ đơn giản là có các API cấp độ cao đã từng được triển khai như các khung công tác. "Nền tảng" là một từ tốt. Tôi muốn nói rằng đó là bản thân một thông dịch viên (sử dụng ý nghĩa unix truyền thống của từ đó)
slebetman

Lưu ý rằng nút không tắt API DOM và mọi thứ bạn có thể chạy bằng javascript vẫn có sẵn cho bạn, có hoặc không có nút.
Cướp

@slebetman Ý nghĩa "khác" của phiên dịch viên là gì? Tôi đã không nhận ra rằng có một cuộc tranh luận ở đó quá! : S
J. Abrahamson

Câu trả lời:


44

Thật khó để nói vì những từ này không được xác định rõ. Theo cách nói thông thường, tôi nghĩ rằng sẽ hơi không điển hình khi gọi Node.js là một khung, chắc chắn, nhưng tôi có một thời gian khó để tranh luận về lý do tại sao chính xác thì không.

Tất cả điều này trở nên tồi tệ, và tôi thường thấy việc sử dụng ngôn ngữ rất kém, vì vậy tôi sẽ nói rõ và bắt đầu từ phía dưới


JavaScript là một ngôn ngữ máy tính, nghĩa là, một cách hẹp, một tập hợp các quy ước cho phép chúng ta đọc và giải thích một loạt các văn bản như có ngữ nghĩa thực thi Từ ngữ ưa thích cho "cách diễn giải ngôn ngữ như một bộ hướng dẫn". Lớp học của các chương trình được gọi là thông dịch viên , biên dịch , transpilers , , tô màu chữ , vv tất cả văn bản mất và cố gắng làm điều gì đó với sự hiểu biết thông thường này làm thế nào để thực thi mã.

  • Thông dịch viên thực sự thực hiện ngữ nghĩa thực thi bằng cách vận hành một số máy thường là máy tính của bạn. Bạn có thể nghĩ về họ như một người đàn ông nhỏ bé bên trong máy tính lật các công tắc như "in ký tự này" dựa trên hướng dẫn được viết trong chương trình JavaScript của bạn.
  • Trình biên dịch cố gắng chuyển đổi văn bản JavaScript thành một bộ văn bản mới có ngữ nghĩa thực thi cho một ngôn ngữ khác có lẽ là ngôn ngữ có thuộc tính đặc biệt mà máy tính có thể trực tiếp thực hiện.
  • Transpilers là một dạng trình biên dịch tổng quát ở chỗ chúng lấy văn bản JavaScript trong và xuất văn bản của một số ngôn ngữ khác. Do đó, sự khác biệt là một chút chủ quan, nhưng thông thường người ta nghĩ về một trình biên dịch là xuất ra mã mức rất thấp và bộ chuyển như xuất ra mã cấp cao .
  • Linters , tô sáng , kiểm tra loại , v.v. , tất cả đều lấy văn bản JavaScript và xuất ra một số loại sản phẩm phân tích, văn bản được tô sáng, ví dụ, bị ảnh hưởng bởi ngữ nghĩa thực thi, nhưng không thực sự đại diện cho nó.

Bây giờ, hãy đi sâu vào ngữ nghĩa thực thi một chút. Nói chung, ngữ nghĩa thực thi bao gồm một quá trình đọc văn bản ngôn ngữ và đi đến một mô tả về một máy trừu tượng hoặc mô tả các tác dụng phụ có thể quan sát được . Điều tôi muốn đề xuất là cả hai đều cho rằng cần phải có một loại "API cấp thấp" nào đó để vận hành máy hoặc để thực hiện các hiệu ứng có thể quan sát được. Chúng thường được coi là một phần của môi trường thời gian chạy

  • Các môi trường thời gian chạy hoặc thời gian chạy là một tập hợp các nguyên thủy cho rằng quy ước ngôn ngữ đòi hỏi để tồn tại để hoạt động. Theo như ngôn ngữ, có thể có một số giả định về hành vi của họ, nhưng chúng không thể quan sát được. Trong hình ảnh của người phiên dịch ở trên, "người đàn ông bên trong" chỉ bật các công tắc của bộ thực thi --- anh ta không thể tự mình kiểm tra những gì họ đang làm.

Thời gian chạy từ thường bị lạm dụng có nghĩa là cả tập hợp các nguyên thủy giả định một khởi tạo thực tế của chúng.


Vì vậy, bây giờ chúng ta có được một cái gì đó lông. Một ngôn ngữ là một tập hợp các quy ước giả định sự tồn tại của thời gian chạy để cung cấp ý nghĩa cho ngữ nghĩa thực thi của nó. Nó không bao giờ "thăm dò chúng" vì chúng nằm ngoài phạm vi.

Để thực sự sử dụng một ngôn ngữ bạn muốn một cái gì đó như trình biên dịch hoặc trình thông dịch cùng với việc thực hiện thời gian chạy. Trình biên dịch / trình thông dịch và thời gian chạy này đi đôi với nhau trong việc thực thi mã của bạn.

  • V8 của Chrome , thường được gọi là công cụ , là một thỏa thuận trọn gói có chứa trình thông dịch, trình biên dịch, triển khai thời gian chạy tương thích với giao diện thời gian chạy được yêu cầu bởi các quy ước JavaScript tiêu chuẩn ECMA.

Vậy Node.js phù hợp với điều này ở đâu?

Chúng ta phải chia nó thành nhiều phần:

  1. Node.js mở rộng ngôn ngữ JavaScript bằng cách cung cấp một tập hợp nguyên thủy môi trường thời gian chạy lớn hơn, những thứ nằm ngoài phạm vi của các tiêu chuẩn của ECMA. Chúng bao gồm những thứ như tập tin I / O . Điều này có nghĩa là Node.js thay đổi ngôn ngữ và theo một nghĩa nào đó là ngôn ngữ mới: "Node.js JavaScript"
  2. Node.js, dưới dạng gói, chứa trình thông dịch và trình biên dịch. Nó chỉ đánh cắp những thứ này từ V8.
  3. Node.js cung cấp một triển khai môi trường thời gian chạy Node.js cho phép "Node.js JavaScript" được thực thi.
  4. Node.js cung cấp một tập hợp các thư viện tiêu chuẩn được xây dựng trên các nguyên thủy mới giúp chúng dễ truy cập hơn đối với người dùng cuối của "Node.js JavaScript".

Vì vậy, Node.js là rất nhiều thứ!

Nhưng nó là một khuôn khổ?


Đây là nơi thuật ngữ hoàn toàn sụp đổ, không ai có một định nghĩa tốt, nhất quán, có ý nghĩa về một khung thực sự là gì.

Có những cuộc tranh luận gây phẫn nộ: "khung là gì so với thư viện" và chúng kết thúc với những điều không thỏa đáng như "thư viện là thứ bạn gọi và khung là thứ gọi bạn". Tôi thậm chí không thực sự muốn đưa ra một lời giải thích đáng buồn như vậy về ánh sáng ban ngày nhưng đặc biệt là JavaScript và JavaScript của Node.js, là một cú đánh rất lớn vào định nghĩa này vì toàn bộ kỹ thuật gọi lại có nghĩa là bạn liên tục chuyển đổi giữa các cuộc gọi và được gọi.

Theo ý kiến ​​cá nhân của tôi, có một cái gì đó đáng kể ở đây. Tôi không muốn vẽ một đường sáng, nhưng vì vậy tôi sẽ chỉ nói

  • Một bộ mã giống như thư viện nếu nó hoạt động giống như một bộ legos : chia hết và được tạo để lắp ráp. Mặc dù có thể có một số ví dụ về cách sử dụng thư viện, nhưng thông thường người dùng sẽ tự lắp ráp nó theo nhu cầu của họ.
  • Một tập hợp mã giống như khung nếu nó không chia hết và hàm ý các quy ước *: kéo các phần của nó ra có thể khiến nhiều giả định thất bại, do đó bạn phải hiểu cách sử dụng thông thường để sử dụng đúng khung.

Đây là một đường sóng chắc chắn, nhưng tôi muốn rút ra một điểm thực sự thú vị về các khung:

Các khung hàm ý một tập hợp các quy ước về cách diễn giải mã; do đó họ là một ngôn ngữ trong quyền riêng của họ.

Đây có thể là điều mà mọi người cũng muốn tranh luận, nhưng nếu bạn mua định nghĩa trước đây của tôi rằng một ngôn ngữ chỉ là một tập hợp các quy ước mang lại sự sống cho một khối văn bản, thì bất cứ khi nào bạn đặt ra một lớp quy ước mới bạn ' đã xây dựng một ngôn ngữ mới. Có lẽ với các khung công tác, các tài liệu thô là các diễn giải ngữ nghĩa của ngôn ngữ máy chủ thay vì các tệp văn bản thô, nhưng ý tưởng là như nhau!


Vì vậy, với tất cả những gì đã nói, tôi hoàn toàn vui mừng khi gọi Node.js là một khung ngay cả khi nó đi ngược lại một chút so với chuẩn mực! Node.js thêm chức năng cho JavaScript thô theo cách mở rộng ngôn ngữ . Với nó mang lại những giả định và công cụ mới để làm việc trong ngôn ngữ mở rộng này. Về mặt chức năng, những ý tưởng này giống như ý tưởng của các khung được chấp nhận tốt khác như Ruby on Rails .

Tôi sẽ lập luận rằng nếu tại thời điểm này bạn cảm thấy hơi khó chịu và muốn tranh luận rằng có một sự chia rẽ lớn giữa Ruby on Rails và Node.js theo cách này thì tất nhiên tôi sẽ ở đó với bạn . Loại thế giới khái niệm mà hai người sống trong đó rất khác nhau, chỉ muốn nói rằng chúng giống nhau: các quy ước để mở rộng sức mạnh của ngôn ngữ cơ bản trong một miền cụ thể.

Tôi cũng rất vui khi đề xuất rằng miền của Node.js rất nhỏ và chặt chẽ và do đó, các quy ước mà nó thêm vào rất đơn giản để lý giải và tương đối dễ thực hiện. OTOH, Ruby on Rails sống trong một miền "ứng dụng web kinh doanh" được xác định kém, điều đó có nghĩa là các quy ước mà nó đưa ra chắc chắn mờ nhạt và bị phá vỡ.


Nhưng tất cả những điều này là một cách nói dài, vâng, các nhà tuyển dụng có thể không biết ý nghĩa của họ khi nói điều đó. Tôi đoán "khung" nghe có vẻ như là một từ tốt hơn, dễ đọc hơn "thời gian chạy" hoặc "động cơ".


này, cân bằng đáng kể! vì vậy probably have no idea: 'framework' là một từ mà bạn có thể hiểu mà không phải là một lập trình viên, một tính năng hữu ích, nếu được sử dụng khi nó thực sự sẽ tạo ra sự khác biệt.
n611x007

"Node.js thêm chức năng vào JavaScript thô theo cách mở rộng ngôn ngữ." Không đúng, nó đang mở rộng chức năng chứ không phải ngôn ngữ, nó không thay đổi cách bạn cần viết mã như nhiều khung công tác yêu cầu. Có các chức năng hoặc đối tượng khác được thêm vào như một thư viện đi kèm có thể thêm vào. Bạn có thể gọi nó hoặc sử dụng nó như bất kỳ chức năng hoặc đối tượng mới. Phong cách lập trình không thay đổi, những điều cơ bản về ngôn ngữ là 'chỉ' thêm một số chức năng. Vì vậy, nó không phải là một khung hoặc mở rộng ngôn ngữ, javascript với các thư viện nền tảng mặc định được thêm vào và do đó chức năng.
Codebeat

Chắc chắn, tôi hoàn toàn có thể làm theo phía bạn. Tôi nghĩ rằng dòng ở đây là mờ. Hoặc là cách suy nghĩ có ý nghĩa. Như một điểm nghiêm ngặt, nút sẽ mở rộng JS bằng cách cung cấp một FFI, sau đó là phần cốt lõi cho phép nút sau đó cung cấp nhiều thư viện hệ thống hơn. Mặt khác, trong khi đó, nút lõi lõi của lõi ngô chỉ là thời gian chạy (và FFI này), phần lớn thời gian khi mọi người thảo luận về nút, họ thực sự có nghĩa là thời gian chạy lõi, các phần mở rộng FFI và chức năng thư viện cơ bản được xây dựng trên nó như thế này là cách nút được đóng gói.
J. Abrahamson

20

Node.js® là thời gian chạy JavaScript được xây dựng trên công cụ JavaScript V8 của Chrome.

nguồn

Nút là một thời gian chạy hoặc môi trường. Nó không phải là một khuôn khổ. Mọi người (tôi cảm thấy) thường hiểu sai vì các khung như express rất phổ biến với nút.

đọc thêm về thời gian chạy so với khung nếu bạn quan tâm.


inb4 "nhưng trang about nói 'Là một khung điều khiển sự kiện không đồng bộ'" Tôi biết.
rlemon

3
Không phải là nhúng v8 thời gian chạy? ;-)
johannes

@johannes Tôi có khuynh hướng đồng ý với bạn về điều này. V8 là thời gian chạy và nút chỉ đơn giản là mở rộng các công cụ có sẵn cho nhà phát triển (máy chủ http, produc, v.v.) do đó tôi nghĩ nhãn khung vẫn hoạt động. Tuy nhiên, nó là một môi trường v8 được sửa đổi; nút không phải là thứ bạn chỉ "bao gồm" trong dự án của bạn. Tất cả chỉ là vấn đề về viễn cảnh.
nick

@rlemon, khung phần đã bị xóa.
ebram khalil
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.