Quy ước đặt tên dự án Node.js cho tệp & thư mục


115

Quy ước đặt tên cho các tệp và thư mục trong một dự án Node.js lớn là gì?

Tôi nên viết hoa, camelCase, hay điểm dưới?

I E. điều này có được coi là hợp lệ không?

project-name
    app
        controllers
            someThings.js
            users.js
        models
                someThing.js
                user.js
        views
            some-things
                index.jade
            users
                logIn.jade
                signUp.jade
    ...

3
Mang tính chủ quan cao, cấu trúc thư mục của bạn là của riêng bạn. Cá nhân tôi thích camelCase vì đó là những gì tôi làm trong JS
Chad

@Chad - trong Node.js, requirelấy chuỗi thư mục làm tham số, đó là lý do tại sao nó không hoàn toàn là của bạn. I E. require('../app/controllers/someThings');
Rudiger

3
Node không chỉ định bất kỳ đề xuất hoặc tiêu chuẩn nào để đặt tên mô-đun, miễn là chúng là tên tệp / thư mục hợp lệ và không cố gắng ghi đè tên mô-đun cốt lõi . Đối với các mô-đun riêng, nó sử dụng hỗn hợp các từ viết tắt ( fs), một từ đơn ( events), gạch dưới ( child_process) và chữ thường ( querystring).
Jonathan Lonowski,

1
@Rudiger Vậy? Bạn có thể chỉ định bất kỳ chuỗi nào bạn muốn và cấu trúc thư mục bạn muốn bạn có thể có (tất nhiên miễn là tên của bạn là tên tệp hợp lệ).
Chad

Từ những gì tôi có thể biết khi xem xét các dự án then chốt hơn như tên tệp mocha như Captain-awesome-file.js dường như đã đủ phổ biến. Đó là những gì tôi sẽ sử dụng ít nhất!
Charles Ferentchak

Câu trả lời:


153

Sau một số năm sử dụng nút, tôi có thể nói rằng không có quy ước nào cho cấu trúc thư mục / tệp. Tuy nhiên, hầu hết các ứng dụng express (chuyên nghiệp) sử dụng thiết lập như:

/
  /bin - scripts, helpers, binaries
  /lib - your application
  /config - your configuration
  /public - your public files
  /test - your tests

Một ví dụ sử dụng thiết lập này là nodejs-starter .

Cá nhân tôi đã thay đổi thiết lập này thành:

/
  /etc - contains configuration
  /app - front-end javascript files
    /config - loads config
    /models - loads models
  /bin - helper scripts
  /lib - back-end express files
    /config - loads config to app.settings
    /models - loads mongoose models
    /routes - sets up app.get('..')...
  /srv - contains public files
  /usr - contains templates
  /test - contains test files

Theo ý kiến ​​của tôi, cái sau phù hợp hơn với cấu trúc thư mục kiểu Unix (trong khi cái trước kết hợp điều này một chút).

Tôi cũng thích mẫu này để tách các tệp:

lib / index.js

var http = require('http');
var express = require('express');

var app = express();

app.server = http.createServer(app);

require('./config')(app);

require('./models')(app);

require('./routes')(app);

app.server.listen(app.settings.port);

module.exports = app;

lib / static / index.js

var express = require('express');

module.exports = function(app) {

  app.use(express.static(app.settings.static.path));

};

Điều này cho phép phân tách gọn gàng tất cả mã nguồn mà không phải bận tâm đến các phần phụ thuộc. Một giải pháp thực sự tốt để chống lại Javascript khó chịu. Một ví dụ trong thế giới thực ở gần đây đó sử dụng thiết lập này.

Cập nhật (tên tệp):

Về tên tệp, thông thường nhất là viết thường , ngắn tên tệp . Nếu tệp của bạn chỉ có thể được mô tả bằng hai từ, hầu hết các dự án JavaScript sử dụng dấu gạch dưới làm dấu phân cách.

Cập nhật (biến):

Về các biến, các "quy tắc" tương tự cũng được áp dụng như đối với tên tệp. Tuy nhiên, các nguyên mẫu hoặc lớp nên sử dụng camelCase .

Cập nhật (styleguides):


26
Câu trả lời của bạn thú vị và được thực hiện tốt như thế nào, nó lạc đề, người tạo chủ đề đã yêu cầu cụ thể về quy ước đặt tên không phải cho cấu trúc thư mục. Khi chúng tôi đến chủ đề này, chúng tôi mong muốn biết liệu các tệp được đặt tên tốt hơn bằng dấu gạch ngang, dấu gạch dưới hay camelCase. Tôi sẽ ủng hộ, nếu điều này được thêm vào câu trả lời này.
Tronix117

3
@ Tronix117 là vấn đề gì vậy? Câu hỏi yêu cầu "quy ước đặt tên dự án cho tệp & thư mục?" và việc đặt tên không giới hạn ở tên tệp vì nó cũng bao gồm tên đường dẫn đầy đủ.
bodokaiser

23
tất nhiên, nhưng tác giả hỏi cụ thể "Tôi nên viết hoa, camelCase, hay điểm dưới?". Khi anh ấy viết ví dụ của mình, anh ấy đặt rõ ràng 'someThings' và 'some-things' để biết liệu nó có thể được coi là hợp lệ hay không. Khi tôi đi đến chủ đề này, tôi đã mong đợi có câu trả lời cho câu hỏi cụ thể này và biết những gì thường được sử dụng làm tên tệp. Tôi không nói câu trả lời của bạn là sai, nó hoàn hảo cho mục đích của nó, nhưng không đầy đủ trong tâm trí tôi bởi vì anh ấy không thực sự trả lời câu hỏi chính.
Tronix117

5
Tôi nghĩ bạn đã hiểu lầm tôi ;). Tôi chỉ đang tìm kiếm điều gì đó mà tôi không tìm thấy trong câu trả lời được chấp nhận, nhưng đã được hỏi cụ thể, không truyền bá sự căm ghét dưới bất kỳ hình thức nào, bạn sẽ đi hơi xa với câu trả lời này. Tôi chỉ muốn bạn thêm một số thông tin về điều đó vào câu trả lời, để những người sẽ tìm kiếm điều đó trong tương lai sẽ không đi vào ngõ cụt.
Tronix117

2
@ Tronix117 Trên thực tế, đây là lý do cụ thể tại sao tôi thấy mình trên trang này đọc câu trả lời này. Tôi đã hy vọng không chỉ cấu trúc thư mục, mà quan trọng hơn là các quy ước tên (dấu gạch ngang, dấu gạch dưới, camelCase, TitleCase, v.v.). Thật không may, câu trả lời vẫn không có nó, và có vẻ như tôi bodokaiserđang xem xét mọi thứ quá cá nhân và yêu cầu thêm ý kiến ​​của anh ấy về điều này vào câu trả lời của anh ấy (như OP đã hỏi ban đầu trong câu hỏi của họ) ( khụ khụ ).
Swivel

97

Sử dụng kebab-casecho tất cả các gói, thư mục và tên tệp.

Tại sao?

Bạn nên tưởng tượng rằng một ngày nào đó bất kỳ thư mục hoặc tệp nào cũng có thể được giải nén vào gói của chính nó. Các gói không được chứa chữ hoa.

Các gói mới không được có chữ hoa trong tên. https://docs.npmjs.com/files/package.json#name

Do đó, camelCasekhông bao giờ được sử dụng. Điều này để lại snake_casekebab-case.

kebab-casecho đến nay là quy ước phổ biến nhất hiện nay. Việc sử dụng duy nhất của dấu gạch dưới là cho các gói nút bên trong và đây chỉ đơn giản là một quy ước từ những ngày đầu.


2
bạn quên dấu chấm? như socket.io
Roee

1
.2c, có thể làm một tự động hóa đơn giản từ kebab hợp cụ thể để kebabCase trong bất kỳ kịch bản hay ứng dụng trong bất kỳ ngôn ngữ sử dụng regex - làm điều đó tất cả các thời gian 🙃
rob2d

63

Không có quy ước. Có một số cấu trúc hợp lý.

Điều duy nhất tôi có thể nói: Không bao giờ sử dụng tên tệp và thư mục camelCase. Tại sao? Nó hoạt động nhưng trên Mac và Windows không có sự khác biệt giữa someAction và một số action. Tôi đã gặp vấn đề này, và không phải một lần. Tôi yêu cầu một tệp như thế này:

var isHidden = require('./lib/isHidden');

Nhưng thật đáng buồn tôi đã tạo ra một tập tin với đầy đủ các chữ thường: lib/ishidden.js. Nó làm việc cho tôi trên mac. Nó hoạt động tốt trên mac của đồng nghiệp của tôi. Các thử nghiệm chạy không có lỗi. Sau khi triển khai, chúng tôi gặp một lỗi lớn:

Error: Cannot find module './lib/isHidden'

Ồ vâng. Đó là một hộp linux. Vì vậy, cấu trúc thư mục camelCase có thể nguy hiểm. Nó đủ cho một đồng nghiệp đang phát triển trên Windows hoặc Mac.

Vì vậy, hãy sử dụng dấu gạch dưới (_) hoặc dấu gạch ngang (-) nếu bạn cần.


4
+1, thêm thực tế là đổi tên các thư mục phân biệt chữ hoa chữ thường trong git trên hệ thống không phải cs là một rắc rối thực sự.
tối đa

4
Tôi không thực sự hiểu vấn đề với camelCase ở đây. Vấn đề sẽ không được giải quyết bằng cách đặt tên tệp chính xác ngay từ đầu (lib / isHidden.js)?
Mike

Này Mike, vấn đề là camelCase sẽ đột phá khi triển khai trên một số hệ thống. Tôi đã bối rối về lý do tại sao các thư mục của tôi đều nhận được 404s khi tôi triển khai từ Mac lên hộp Linux với một gói có tên "groupPages". Tôi đã phải thay đổi trang nhóm để sửa chữa mọi thứ.
tempranova

3
Tệ hơn nữa: tạo một phiên bản camelcase của tên tệp và để một đồng nghiệp bất cẩn tạo một phiên bản viết thường trong cùng một thư mục. Bây giờ, hãy kiểm tra một hệ điều hành không phân biệt chữ hoa chữ thường và cố gắng tìm ra nguyên nhân tại sao ứng dụng của bạn không hoạt động. Và có, điều này đã xảy ra.
L0LN1NJ4

Tôi thích câu trả lời này, tuy nhiên tôi muốn chỉ ra rằng dấu gạch ngang (-) cũng có thể có một số vấn đề. Ví dụ: bằng cách sử dụng khung kiểm tra Nighwatch, tôi đã tạo một đối tượng trang có tên admin-login.js. Sau đó, tôi đã cố gắng truy cập nó từ tập lệnh thử nghiệm bằng cách sử dụng const loginPage = browser.page.admin-login(). Tôi có lỗi ReferenceError: login is not defined. Sử dụng dấu gạch dưới (_) cho tên tệp đã giải quyết được vấn đề. Tôi cũng có thể tưởng tượng rằng việc sử dụng tên tệp với ký tự gạch ngang trong dòng lệnh cũng có thể dẫn đến một số vấn đề. Do đó, tôi muốn nói rằng dấu gạch dưới là dấu phân cách an toàn nhất cho tên tệp nói chung.
Dragan Nikolic

15

Dựa trên ' Hướng dẫn Kiểu JavaScript của Google '

Tất cả tên tệp phải là chữ thường và có thể bao gồm dấu gạch dưới (_) hoặc dấu gạch ngang (-), nhưng không có dấu câu bổ sung. Tuân theo quy ước mà dự án của bạn sử dụng. Phần mở rộng của tên tệp phải là .js.


3

Hầu hết mọi người sử dụng camelCasetrong JS. Nếu bạn muốn mở bất cứ thứ gì nguồn mở, tôi khuyên bạn nên sử dụng cái này :-)


Một số dự án, chẳng hạn như Locomotive.js đang sử dụng camelCasecho các tệp bộ điều khiển. :-) Chỉ phụ thuộc. Tôi có xu hướng sử dụng PascalCasecho các tệp giống như lớp.
Mathieu Amiot

@yitsushi dường như đặt ra một mối quan tâm khá lớn với việc đặt tên trường hợp lạc đà (và pascal), nếu bạn muốn tạo hộp đựng mô-đun di động chắc chắn có vẻ là một ý tưởng tồi?
gumaflux

0

Node.js không thực thi bất kỳ quy ước đặt tên tệp nào (ngoại trừ index.js). Và ngôn ngữ Javascript nói chung cũng vậy. Bạn có thể tìm thấy hàng tá chủ đề ở đây đề xuất camelCase, dấu gạch ngang và dấu gạch dưới, bất kỳ chuỗi nào hoạt động hoàn toàn tốt. Vì vậy, nó vào bạn. Chọn một cái và gắn bó với nó.


1
Nó thực sự không phải là những gì nút 'thực thi', vui lòng đọc phần này: nodejs.org/api/modules.html#modules_folders_as_modules
moka

0

Theo tôi: Đối với tệp, hãy sử dụng trường hợp camel thấp hơn nếu module.exports là một đối tượng, ý tôi là một mô-đun singleton. Điều này cũng có thể áp dụng cho các tệp JSON vì chúng cũng theo một cách riêng lẻ. Sử dụng chữ hoa camel trên nếu module.exports trả về một hàm khởi tạo trong đó nó hoạt động giống như một lớp.

Đối với các thư mục sử dụng tên ngắn. Nếu cần phải có nhiều từ, hãy viết chữ thường hoàn toàn được phân tách bằng "-" để nó hoạt động nhất quán trên tất cả các nền tảng.

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.