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 , xơ , 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 mã 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 và 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:
- 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"
- 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.
- 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.
- 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ơ".