Cách tổ chức các dự án Node.js lớn


82

Một số cách tốt để tổ chức các dự án Node.js lớn là gì?

Ví dụ: một ứng dụng sử dụng cả express.js và socket.io? Điều này sẽ bao gồm cả cấu trúc logic của ứng dụng cũng như hệ thống tệp.

Hiện tại, tôi thấy mình đang nhét một tấn mã vào một tệp js chính duy nhất và đặt mã vào một đối tượng toàn cầu khổng lồ, và nó cảm thấy thật nghịch ngợm.


2
Có thời gian để đọc một cuốn sách ?
— Straseus

Tôi có thể phải mua cuốn sách này, cảm ơn!
— Thomas Hunter II

Google "Mô-đun JavaScript" hoặc "JavaScript mô-đun" :-)
— Sri

1
Tôi đã đọc cuốn sách do Straseus gợi ý và nó đưa ra rất nhiều lời khuyên và phân tích tốt, nhưng tôi e rằng việc cấu trúc ứng dụng Node.js với express không tốt lắm. Câu trả lời của PuerkitoBio dưới đây liên kết đến một số gợi ý về cấu trúc tệp khởi đầu tốt; Tôi dự định xây dựng trên cấu trúc đó khi cần thiết.
— Aaron

Câu trả lời:


97

Một ví dụ cho người mới bắt đầu

Tôi thích kiểm tra ban đầu từ @ david-ellis và bạn nên nghiên cứu sâu về nó để hiểu nó vì nó là một thứ tốt. Tuy nhiên, tôi sẽ thích nó được đơn giản hóa hơn cho những người mới bắt đầu muốn xem một ví dụ thẳng về phía trước. Đây là những gì tôi muốn được thấy ai đó chỉ cho tôi.

Hãy đưa ra một tình huống điển hình trong đó bạn đang sử dụng express và bạn có rất nhiều tuyến đường được liệt kê trong tệp app.js của mình. Nội dung của nó sẽ giống như sau:

app.js

// ... startup code omitted above

app.get('/', function(req, res) {
  res.render('index', { title : 'home' });
});
app.get('/contactus', function(req, res) {
  res.render('contactus', { title : 'contact us' });
});
app.get('/anotherpage', function(req, res) {
  res.render('anotherpage', { title : 'another page' });
});
// and so on...

Bạn có thể tưởng tượng nếu bạn có 50 tuyến đường, tệp này có thể trở nên khó khăn. Sẽ rất tuyệt nếu loại bỏ một số thứ lộn xộn này ra khỏi tệp app.js.

Những gì bạn sẽ làm là tạo một thư mục "bộ điều khiển" trong ứng dụng của mình để cấu trúc của bạn bây giờ trông giống như sau:

app.js
/controllers

Tạo một tệp trong "/ controllers" có tên "index.js", sau đó đặt mã sau.

/controllers/index.js

module.exports.set = function(app) {
   // copy your routes listed in your app.js directly into here
}

Cắt và dán danh sách tuyến đường của bạn từ tệp "app.js" và đặt chúng vào tệp "/controllers/index.js".

Trên tệp app.js của bạn, hãy xóa các tuyến đường của bạn và thay chúng làm như sau.

app.js

// remove your routes and replace with this code
var controllers = require('./controllers');
controllers.set(app);

Bây giờ nếu bạn muốn có tệp "/controllers/index.js" của mình cũng được chia nhỏ, hãy thêm một ví dụ nữa để bạn có thể thấy cách Node.js thực sự hoạt động giống như Hình nhân Nga về cách tổ chức mã của nó.

Trong "/ controllers", hãy thêm một tệp nữa "account.js" và đặt phần sau vào trong đó.

/controllers/account.js

module.exports.set = function(app) {
    // put more app route listings here
}

Bây giờ trong tệp "/controllers/index.js của bạn, hãy đặt tham chiếu đến" account.js "

/controllers/index.js

var account = require('./account.js');

module.exports.set = function(app) {
   // your routes here

   // let "account.js" set other routes
   account.set(app);
}

Như bạn có thể tưởng tượng, bạn có thể tiếp tục chia nhỏ mọi thứ thành các phần nhỏ hơn và nhỏ hơn và đặt nhiều thư mục hơn trong các thư mục và tham chiếu với "request" nếu bạn muốn. Bạn có thể sử dụng khái niệm tương tự cho "/ lib" hoặc tệp thư viện. "node_modules" đang làm việc này.

Đó chỉ là một trong nhiều lý do khiến node.js rất thú vị khi lập trình.

Ví dụ về Định tuyến Express 4 có thể quản lý

Đây là một bài đăng khác mà tôi đã trả lời về 4 tuyến đường cao tốc liên quan đến điều này.

Nghỉ ngơi với bộ định tuyến lồng nhau Express.js


IMHO nó đã tốt hơn trước khi cập nhật, bạn có thể tránh được việc phải cung cấp cho một tên cho mỗi điều khiển bằng cách thực hiện một cơ chế răng cưa, một trong những nơi tuyến đường vào khác, điều này cũng giúp với kinh điển URL
— Timo Huovinen

Đừng bận tâm đến phần URL chuẩn, đó là một suy nghĩ sau. Bằng URL chuẩn, ý tôi là thêm một trang chuẩn <link>vào một cái gì đó như /example/pathkhi người dùng nhập vào /example/path/thanh địa chỉ (hoặc ngược lại).
— Timo Huovinen

Bạn biết đấy, với tư cách là một lập trình viên, việc muốn loại hệ thống phân cấp có tổ chức này là điều đương nhiên, nhưng nó không phù hợp với thực tế khi mở tệp hoặc đọc đăng ký. Bạn sẽ kết thúc với một số lượng lớn "index.js" mà nhanh chóng trở nên khó làm việc.
— Abhinav Gujjar

Một năm sau, một bài viết có giá trị đối với tôi. Tôi chỉ mới bắt đầu node.js để sử dụng cho một dự án cuối tuần.
— masfenix

@JasonSebring Có quá nhiều thông tin và tôi rất mới! Hiện giờ tôi rất lạc lõng. Là một sinh viên tốt nghiệp ngành toán, tôi làm rất nhiều bài toán về matlab / R / NHƯNG lần cuối cùng tôi chạm vào một khung web / máy tính để bàn là vào ngày .net 2.0.
— masfenix

10

Tôi đã viết một bài đăng trên blog về chủ đề này vài ngày trước, và mặc dù bài viết bằng tiếng Pháp, tôi đã thiết lập một repo GitHub (bằng tiếng Anh) để hiển thị một ví dụ hoạt động về cấu trúc mà tôi sử dụng.

Rõ ràng, không có câu trả lời chắc chắn cho câu hỏi này, nhưng thật thú vị khi xem những người khác đang làm gì và tôi luôn lắng nghe những ý kiến ​​khác về chủ đề này (cũng đã được thảo luận ở đây , nơi bạn có thể xem tóm tắt những gì tôi đề xuất) .


Cảm ơn liên kết đó, đây là một bài đọc hay (với sự trợ giúp của Google Dịch) và tôi chắc chắn rằng tôi sẽ làm theo một số đề xuất của bạn trong việc thiết kế tổ chức của dự án mà tôi hiện đang thực hiện.
— Aaron

Bạn có thể sửa chữa liên kết?
— Yevhenii Herasymchuk

2

Tương tự như các bài đăng trên blog khác, tôi đã viết một bài cụ thể về tổ chức Expresscác ứng dụng. Đó là phương pháp tôi đã sử dụng trong khoảng một năm rưỡi. Về cơ bản, hãy tổ chức các ứng dụng của bạn xung quanh các thực thể dữ liệu của bạn hoặc bất kỳ yếu tố cốt lõi nào khác. Đặt logic cho từng phần tử đó trong thư mục riêng của chúng. Tôi đã cố gắng vay mượn rất nhiều từ Python.

http://rycole.com/2013/01/28/organizing-nodejs-express.html


1

Các bài báo của anh ấy không còn trực tuyến nữa, nhưng loạt nút của Eric Satterwhite đã đề xuất một cấu trúc như được liệt kê bên dưới.

# Project 
. 
|-- packages/
|   |-- project-core
|   |   |-- lib/
|   |   |-- commands/
|   |   |-- startup/
|   |   |-- conf/
|   |   |-- test/
|   |   |-- package.json
|   |   |-- README.md
|   |   |-- events.js
|   |   |-- .npmignore
|   |   `-- index.js
|-- package.json
`-- index.js

Với việc packages/chuyển thư mục thành nguồn của bạn cho mô đun.


0

Nếu bạn là người mới bắt đầu trong lĩnh vực này, tôi khuyên bạn nên xem qua các dự án hiện có được các nhà phát triển yêu thích. Một số trong số đó là:

  • Sails.js - 18k sao. Bạn có thể xem cách họ tổ chức cấu trúc APP tại liên kết mà tôi đã cung cấp. Một trang web tuyệt vời có giải thích cho từng thư mục trong cấu trúc.

  • Trình tạo Express.js - 800 sao. Có một mẫu đơn giản và tuyệt vời để bắt đầu làm việc với Express.js. Tại đây, bạn có thể nhận thấy cách họ phân chia các tuyến đường khỏi ứng dụng.

Nhân tiện, rất nhiều nhà phát triển đã làm trường hợp của bạn trước đây và bạn có thể chỉ cần tách nó ra và nâng cấp.

  • Kioska . Xem cách họ tách các sự kiện thành các tệp khác nhau trong events/thư mục.

  • Ballons.io 2.3k sao. Thật không may, họ có toàn bộ máy chủ socket trong một tệp nhưng bạn có thể tìm hiểu toàn bộ cấu trúc của ứng dụng với node.js và socket.io


0

Nếu bạn không phiền, bạn luôn có thể học cách đánh chữ và truy cập https://nestjs.com/

Nếu bạn muốn gắn bó với JS, tôi thực sự khuyên bạn nên sử dụng kiến ​​trúc củ hành. Thực tiễn tốt nhất là giữ logic nghiệp vụ, bộ điều khiển, thậm chí cả thư viện được tách biệt (chúng nên được bao bọc bên trong một số lớp / trình trợ giúp) - đề phòng trường hợp bạn phải di chuyển sang thư viện khác (trình phân tích cú pháp CSV khác, v.v.).

Với kiến ​​trúc củ hành, bạn không cần quan tâm đến việc các yêu cầu đến từ đâu, sẽ không có nhiều thay đổi để thêm ngay cả một số môi giới tin nhắn.

Cũng thử cái này https://en.wikipedia.org/wiki/Domain-driven_design

ESLint có thể giúp tổ chức dự án phù hợp.

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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.