Cấu trúc thư mục cho dự án Node.js


346

Tôi nhận thấy rằng các dự án Node.js thường bao gồm các thư mục như sau:

/ libs, / nhà cung cấp, / hỗ trợ, / spec, / tests

Chính xác những gì có nghĩa là gì? Có gì khác nhau giữa chúng và tôi nên bao gồm mã tham chiếu ở đâu?

Câu trả lời:


439

Liên quan đến các thư mục bạn đã đề cập:

  • /libs thường được sử dụng để tùy chỉnh classes/functions/modules
  • /vendorhoặc /supportchứa các thư viện bên thứ 3 (được thêm dưới dạng mô đun con git khi sử dụng git làm kiểm soát nguồn)
  • /spec chứa thông số kỹ thuật cho các xét nghiệm BDD.
  • /testschứa các bài kiểm tra đơn vị cho một ứng dụng (sử dụng khung kiểm tra, xem tại đây )

LƯU Ý: cả hai /vendor/supportkhông được chấp nhận kể từ khi NPM giới thiệu quản lý gói sạch. Bạn nên xử lý tất cả các phụ thuộc của bên thứ 3 bằng cách sử dụng NPM và tệp pack.json

Khi xây dựng một ứng dụng khá lớn, tôi khuyên dùng các thư mục bổ sung sau (đặc biệt nếu bạn đang sử dụng một số loại MVC- / ORM-Framework như express hoặc mongoose ):

  • /modelschứa tất cả các mô hình ORM của bạn (được gọi Schemastrong mongoose)
  • /views chứa các mẫu xem của bạn (sử dụng bất kỳ ngôn ngữ tạo khuôn mẫu nào được hỗ trợ trong express)
  • /public chứa tất cả nội dung tĩnh (hình ảnh, biểu định kiểu, JavaScript phía máy khách)
    • /assets/images chứa các tập tin hình ảnh
    • /assets/pdf chứa các tệp pdf tĩnh
    • /css chứa biểu định kiểu (hoặc đầu ra được biên dịch bởi công cụ css)
    • /js chứa JavaScript phía máy khách
  • /controllerschứa tất cả các tuyến tốc hành của bạn, được phân tách bằng mô-đun / khu vực của ứng dụng của bạn (lưu ý: khi sử dụng chức năng bootstrapping của express, thư mục này được gọi /routes)

Tôi đã quen với việc tổ chức các dự án của mình theo cách này và tôi nghĩ nó hoạt động khá tốt.

Cập nhật cho các ứng dụng Express dựa trên CoffeeScript (sử dụng tài sản kết nối ):

  • /app chứa JavaScript đã biên dịch của bạn
  • /assets/ chứa tất cả các tài sản phía khách hàng yêu cầu biên dịch
    • /assets/js chứa các tệp CoffeeScript phía máy khách của bạn
    • /assets/css chứa tất cả các tờ kiểu LESS / Stylus của bạn
  • /public/(js|css|img) chứa các tệp tĩnh của bạn không được xử lý bởi bất kỳ trình biên dịch nào
  • /src chứa tất cả các tệp CoffeeScript cụ thể phía máy chủ của bạn
  • /test chứa tất cả các tập lệnh kiểm thử đơn vị (được triển khai bằng khung kiểm tra mà bạn chọn)
  • /views chứa tất cả các chế độ xem nhanh của bạn (có thể là ngọc bích, ejs hoặc bất kỳ công cụ tạo khuôn nào khác)

5
bạn sẽ đặt js, css, hình ảnh phía khách hàng của bạn ở đâu? bạn có đề xuất cấu trúc thư mục tương tự trong thư mục chung không, như: công khai / tài sản công khai / tài sản / css công khai / tài sản / hình ảnh công cộng / tài sản / tài liệu công khai / libs công khai / hỗ trợ công cộng / kiểm tra công khai / mô hình công khai / lượt xem công khai / kiểm soát ?
ezmilhouse

2
expressjs tạo một thư mục ./routes, có giống như ./controllers trong ví dụ của bạn không?
chovy

2
Tại sao bạn không tạo một máy phát Yeoman với đề xuất đó? Nó có thể trở thành một tiêu chuẩn.
Jayr Motta

+1 Đến từ ASP.NET MVC, việc gọi "bộ điều khiển" thư mục "tuyến" có ý nghĩa hơn đối với tôi.
adam0101

Câu hỏi, không phải cấu trúc thư mục thường được tạo bởi khung (tức là Symfony cho PHP)? Với Express chẳng hạn, không có cấu trúc thư mục nào được tạo đúng? Nhà phát triển có tự tạo và duy trì thiết kế và tuyến đường MVC không? Tôi đánh giá cao bất kỳ phản hồi nào, tôi mới biết về Express
AnchovyLegend

49

Có một cuộc thảo luận trên GitHub vì một câu hỏi tương tự như câu hỏi này: https://gist.github.com/1398757

Bạn có thể sử dụng các dự án khác để được hướng dẫn, tìm kiếm trong GitHub cho:

  • ThreeNodes.js - theo tôi, dường như có một cấu trúc cụ thể không phù hợp với mọi dự án;
  • nhẹ hơn - một cấu trúc đơn giản hơn, nhưng thiếu một chút tổ chức;

Và cuối cùng, trong một cuốn sách ( http://shop.oreilly.com/product/0636920025344.do ) gợi ý cấu trúc này:

├── index.html
├── js/
   ├── main.js
   ├── models/
   ├── views/
   ├── collections/
   ├── templates/
   └── libs/
       ├── backbone/
       ├── underscore/
       └── ...
├── css/
└── ...

Tôi đã tạo một mô-đun để yêu cầu các tệp động, cho phép bạn cấu trúc dự án của mình theo tính năng thay vì Mô hình, Chế độ xem, Trình điều khiển điển hình. Hy vọng nó sẽ giúp được ai đó: github.com/ss 4.0.3ka/crave
Scott

13

Ví dụ khác từ kiến ​​trúc dự án của tôi, bạn có thể thấy ở đây:

├── Dockerfile
├── README.md
├── config
   └── production.json
├── package.json
├── schema
   ├── create-db.sh
   ├── db.sql
├── scripts
   └── deploy-production.sh 
├── src
   ├── app -> Containes API routes
   ├── db -> DB Models (ORM)
   └── server.js -> the Server initlializer.
└── test

Về cơ bản, ứng dụng logic được phân tách thành các thư mục DB và APP bên trong thư mục SRC.


nếu ứng dụng của bạn cũng chứa ứng dụng giao diện người dùng, bạn có đặt ứng dụng đó ở dưới srchoặc ứng dụng giao diện người dùng có thư mục riêng (với package.jsoncấu trúc thư mục riêng và tương tự) không?
wal

2
@wal Tôi thích tách các dự án lối vào một kho lưu trữ khác vì nó có tổ chức hơn
Daniel Chernenkov

2

Đây là câu trả lời gián tiếp, trên chính cấu trúc thư mục, rất liên quan.

Vài năm trước tôi có cùng một câu hỏi, lấy một cấu trúc thư mục nhưng sau đó phải thực hiện rất nhiều thư mục, bởi vì thư mục này có mục đích khác với mục đích tôi đã đọc trên internet, đó là, một thư mục cụ thể có gì ý nghĩa khác nhau cho những người khác nhau trên một số thư mục.

Bây giờ, đã thực hiện nhiều dự án, ngoài việc giải thích trong tất cả các câu trả lời khác, trên chính cấu trúc thư mục, tôi thực sự khuyên bạn nên tuân theo cấu trúc của chính Node.js, có thể xem tại: https://github.com/ nútjs / nút . Nó có chi tiết tuyệt vời trên tất cả, nói rằng linters và những người khác, cấu trúc tập tin và thư mục họ có và ở đâu. Một số thư mục có README giải thích những gì trong thư mục đó.

Bắt đầu với cấu trúc trên là tốt bởi vì một ngày nào đó một yêu cầu mới xuất hiện và bạn sẽ có một phạm vi để cải thiện vì nó đã được theo sau bởi chính Node.js được duy trì trong nhiều năm nay.

Hi vọng điêu nay co ich.


1

Điều quan trọng cần lưu ý là không có sự đồng thuận về cách tiếp cận tốt nhất và các khung liên quan nói chung không thực thi cũng như không thưởng cho các cấu trúc nhất định.

Tôi thấy đây là một chi phí bực bội và rất lớn nhưng không kém phần quan trọng. Đây là một phiên bản bị hạ thấp (nhưng IMO quan trọng hơn) về vấn đề hướng dẫn phong cách . Tôi muốn chỉ ra điều này bởi vì câu trả lời là như nhau: không quan trọng bạn sử dụng cấu trúc nào miễn là nó được xác định rõ ràng và mạch lạc .

Vì vậy, tôi đề nghị tìm kiếm một hướng dẫn toàn diện mà bạn thích và làm rõ rằng dự án dựa trên điều này.

Thật không dễ dàng, đặc biệt nếu bạn chưa quen với điều này! Dự kiến ​​sẽ dành hàng giờ để nghiên cứu. Bạn sẽ tìm thấy hầu hết các hướng dẫn đề xuất một cấu trúc giống như MVC. Trong khi vài năm trước đây có thể là một lựa chọn vững chắc, ngày nay điều đó không nhất thiết phải như vậy. Ví dụ, đây là một cách tiếp cận khác .


1

Giả sử chúng ta đang nói về các ứng dụng web và xây dựng API:

Một cách tiếp cận là phân loại các tệp theo tính năng , giống như kiến ​​trúc của dịch vụ vi mô sẽ trông như thế nào. Chiến thắng lớn nhất theo ý kiến ​​của tôi là cực kỳ dễ dàng để xem các tệp nào liên quan đến một tính năng của ứng dụng.

Cách tốt nhất để minh họa là thông qua một ví dụ:


Chúng tôi đang phát triển một ứng dụng thư viện. Trong phiên bản đầu tiên của ứng dụng, người dùng có thể:

  • Tìm kiếm sách và xem siêu dữ liệu của sách
  • Tìm kiếm các tác giả và xem sách của họ

Trong phiên bản thứ hai, người dùng cũng có thể:

  • Tạo một tài khoản và đăng nhập
  • Vay / mượn sách

Trong phiên bản thứ ba, người dùng cũng có thể:

  • Lưu danh sách những cuốn sách họ muốn đọc / đánh dấu yêu thích

Đầu tiên chúng ta có cấu trúc như sau:

books
  ├─ controllers
     ├─ booksController.js
     └─ authorsController.js
  
  └─ entities
      ├─ book.js
      └─ author.js

Sau đó chúng tôi thêm vào các tính năng cho người dùng và cho vay:

user
  ├─ controllers
     └─ userController.js
  ├─ entities
     └─ user.js
  └─ middleware
       └─ authentication.js
loan
  ├─ controllers
     └─ loanController.js
  └─ entities
      └─ loan.js

Và sau đó là chức năng yêu thích:

favorites
  ├─ controllers
     └─ favoritesController.js
  └─ entities
      └─ favorite.js

Đối với bất kỳ nhà phát triển mới nào được giao nhiệm vụ thêm vào đó, việc tìm kiếm sách cũng sẽ trả về thông tin nếu bất kỳ cuốn sách nào được đánh dấu là yêu thích, thật dễ dàng để xem vị trí mà anh ấy / cô ấy nên tìm.

Sau đó, khi chủ sở hữu sản phẩm quét vào và nói rằng tính năng yêu thích cần được xóa hoàn toàn, thật dễ dàng để loại bỏ 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.