Konwencje nazewnictwa projektów Node.js dla plików i folderów


117

Jakie są konwencje nazewnictwa plików i folderów w dużym projekcie Node.js?

Powinienem używać wielkich liter, camelCase czy zaniżać punkty?

To znaczy. czy to jest uważane za ważne?

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

3
Twoja struktura katalogów jest wysoce subiektywna. Osobiście lubię camelCase, ponieważ to właśnie robię w JS
Chad

@Chad - w Node.js requireprzyjmuje ciąg katalogu jako parametr, dlatego nie jest on całkowicie Twoim własnym. to znaczy. require('../app/controllers/someThings');
Rudiger,

3
Węzeł nie określa żadnych sugestii ani standardów dotyczących nazewnictwa modułów, o ile są to prawidłowe nazwy plików / katalogów i nie próbują nadpisywać podstawowych nazw modułów . We własnych modułach używa kombinacji skrótów abbreviated ( fs), single-word ( events), underscored ( child_process) i smallcase ( querystring).
Jonathan Lonowski

1
@Rudiger So? Możesz określić dowolny ciąg znaków i strukturę katalogów, jaką chcesz (pod warunkiem, że twoje nazwy są oczywiście prawidłowymi nazwami plików).
Czad

Z tego, co mogę powiedzieć, przeglądając bardziej kluczowe projekty, takie jak nazwy plików mocha , takie jak captain-awesome-file.js, wydają się być dość powszechne. Przynajmniej tego będę używał!
Charles Ferentchak,

Odpowiedzi:


154

Po kilku latach z node, mogę powiedzieć, że nie ma żadnych konwencji dotyczących struktury katalogów / plików. Jednak większość (profesjonalnych) aplikacji ekspresowych używa konfiguracji takiej jak:

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

Przykładem używającym tej konfiguracji jest nodejs-starter .

Osobiście zmieniłem tę konfigurację na:

/
  /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

Moim zdaniem ten drugi lepiej pasuje do struktury katalogów w stylu uniksowym (podczas gdy ten pierwszy trochę to miesza).

Podoba mi się też ten wzorzec do oddzielania plików:

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));

};

Pozwala to na dokładne oddzielenie całego kodu źródłowego bez konieczności przejmowania się zależnościami. Naprawdę dobre rozwiązanie do walki z okropnym Javascriptem. W pobliżu znajduje się przykład ze świata rzeczywistego, który korzysta z tej konfiguracji.

Aktualizacja (nazwy plików):

Dotyczące nazwy plików są najczęściej krótkie , małe nazwy plików. Jeśli plik można opisać tylko dwoma słowami, większość projektów JavaScript używa znaku podkreślenia jako separatora.

Aktualizacja (zmienne):

W odniesieniu do zmiennych obowiązują te same „zasady”, jak w przypadku nazw plików. Prototypy lub klasy powinny jednak używać camelCase .

Aktualizacja (przewodniki stylistyczne):


27
Jak interesująca i dobrze zrobiona jest twoja odpowiedź, jest poza tematem, twórca tematu specjalnie poprosił o konwencję nazewnictwa, a nie o struktury katalogów. Kiedy przejdziemy do tego tematu, spodziewamy się wiedzieć, czy pliki są lepiej nazywane z myślnikami, podkreśleniami lub camelCase. Zagłosuję za, jeśli zostanie to dodane do tej odpowiedzi.
Tronix117,

3
@ Tronix117 na czym polega problem? Pytanie dotyczy „konwencji nazewnictwa projektów dla plików i folderów?” nazewnictwo nie ogranicza się do nazwy pliku, ponieważ zawiera również pełną nazwę ścieżki.
bodokaiser,

24
oczywiście, ale autor specjalnie pyta: „Czy powinienem używać wielkich liter, camelCase czy zaniżać?”. Pisząc swój przykład, wyraźnie umieścił „niektóre rzeczy” i „niektóre rzeczy” tylko po to, aby wiedzieć, czy można je uznać za ważne. Kiedy przeszedłem do tego tematu, spodziewałem się odpowiedzi na to konkretne pytanie i wiedzieć, co jest zwykle używane jako nazewnictwo plików. Nie mówię, że twoja odpowiedź jest błędna, jest idealna do swojego celu, ale w moim umyśle jest niepełna, ponieważ tak naprawdę nie odpowiada na główne pytanie.
Tronix117

5
Chyba mnie źle zrozumiałeś;). Po prostu szukałem czegoś, czego nie znalazłem w zaakceptowanej odpowiedzi, ale zostałem konkretnie zapytany, nie szerząc żadnej nienawiści, posuwasz się trochę za daleko. Chciałem tylko, żebyś dodał do odpowiedzi kilka informacji na ten temat, aby osoby, które będą tego szukały w przyszłości, nie znalazły się w ślepej uliczce.
Tronix117

3
@ Tronix117 Właściwie to właśnie dlatego znalazłem się na tej stronie, czytając tę ​​odpowiedź. Liczyłem nie tylko na strukturę katalogów, ale przede wszystkim na konwencje nazw (myślniki, podkreślenia, camelCase, TitleCase, itp ...). Niestety, odpowiedź nadal nie zawiera go i wydaje się, bodokaiserbierze rzeczy zbyt osobiście mi się wskoczyć i wniosek, że jego opinia na temat tego należy doliczyć do jego odpowiedź (jak PO początkowo zapytał w swoim pytaniu) ( kaszel kaszel ).
Obróć

98

Użyj kebab-casedla wszystkich nazw pakietów, folderów i plików.

Czemu?

Powinieneś sobie wyobrazić, że dowolny folder lub plik może pewnego dnia zostać rozpakowany do własnego pakietu. Pakiety nie mogą zawierać wielkich liter.

Nowe pakiety nie mogą mieć w nazwie wielkich liter. https://docs.npmjs.com/files/package.json#name

Dlatego camelCasenigdy nie należy go używać. To pozostawia snake_casei kebab-case.

kebab-casejest obecnie zdecydowanie najpowszechniejszą konwencją. Jedyne użycie podkreślenia dotyczy pakietów węzłów wewnętrznych i jest to po prostu konwencja z wczesnych dni.


2
zapomniałeś kropki? jak socket.io
Roee

1
.2c, może wykonać prostą automatyzację od kebab-case do kebabCase w dowolnym skrypcie lub aplikacji w dowolnym języku za pomocą wyrażenia regularnego - rób to cały czas 🙃
rob2d

63

Nie ma żadnych konwencji. Istnieje pewna logiczna struktura.

Jedyne, co mogę powiedzieć: nigdy nie używaj nazw plików i katalogów camelCase. Czemu? Działa, ale na komputerach Mac i Windows nie ma różnicy między niektórymi akcjami a niektórymi akcjami. Spotkałem się z tym problemem i to nie raz. Potrzebowałbym takiego pliku:

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

Ale niestety ja utworzony plik z pełnym małymi literami: lib/ishidden.js. U mnie zadziałało na Macu. Działało dobrze na komputerze Mac mojego współpracownika. Testy przebiegają bez błędów. Po wdrożeniu otrzymaliśmy ogromny błąd:

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

O tak. To linux box. Więc struktura katalogów camelCase może być niebezpieczna. To wystarczy koledze, który tworzy program na Windows lub Mac.

Więc jeśli potrzebujesz, użyj separatora podkreślenia (_) lub myślnika (-).


4
+1, dodaj fakt, że zmiana nazw folderów uwzględniających wielkość liter w git w systemie innym niż cs jest prawdziwym kłopotem.
maksymalnie

4
Naprawdę nie rozumiem problemu z camelCase tutaj. Czy problem nie zostałby rozwiązany przez prawidłowe nazwanie pliku w pierwszej kolejności (lib / isHidden.js)?
Mike

Hej Mike, chodzi o to, że camelCase zepsuje się podczas wdrażania w niektórych systemach. Byłem zdezorientowany, dlaczego wszystkie moje katalogi otrzymywały błędy 404, kiedy wdrażałem z Maca na Linux-a z pakietem o nazwie „groupPages”. Musiałem przejść na strony grupowe, aby naprawić rzeczy.
tempranova

3
Co gorsza: utwórz wersję nazwy pliku w kształcie litery Camel i poproś nieostrożnego kolegę o utworzenie wersji zapisanej małymi literami w tym samym katalogu. Teraz sprawdź w systemie operacyjnym bez rozróżniania wielkości liter i spróbuj dowiedzieć się, dlaczego do cholery Twoja aplikacja nie działa. I tak, to się stało.
L0LN1NJ4

Podoba mi się ta odpowiedź, ale chcę zwrócić uwagę, że myślnik (-) może mieć również pewne problemy. Na przykład za pomocą platformy testowej Nighwatch utworzyłem obiekt strony o nazwie admin-login.js. Następnie próbowałem uzyskać do niego dostęp ze skryptu testowego za pomocą const loginPage = browser.page.admin-login(). Mam błąd ReferenceError: login is not defined. Użycie podkreślenia (_) jako nazwy pliku rozwiązało problem. Mogę sobie również wyobrazić, że używanie nazw plików ze znakiem myślnika w linii poleceń może również prowadzić do pewnych problemów. Dlatego powiedziałbym, że podkreślenie jest ogólnie najbezpieczniejszym separatorem nazw plików.
Dragan Nikolic

15

Na podstawie „ Przewodnika po stylach Google JavaScript

Nazwy plików muszą być pisane małymi literami i mogą zawierać podkreślenia (_) lub myślniki (-), ale nie mogą zawierać dodatkowych znaków interpunkcyjnych. Postępuj zgodnie z konwencją używaną w Twoim projekcie. Nazwy plików muszą mieć rozszerzenie .js.


3

Większość ludzi używa camelCasew JS. Jeśli chcesz cokolwiek open-source, proponuję użyć tego :-)


Niektóre projekty, takie jak Locomotive.js, używają camelCaseplików kontrolera. :-) Po prostu zależy. Zwykle używam PascalCaseplików klasowych.
Mathieu Amiot,

@yitsushi wydaje się budzić spore obawy co do nazewnictwa skrzynek wielbłądów (i pascala), jeśli chcesz stworzyć przenośne moduły skrzynia wielbłąda z pewnością wydaje się złym pomysłem?
gumaflux

0

Node.js nie wymusza żadnych konwencji nazewnictwa plików (z wyjątkiem index.js). I ogólnie język Javascript też nie. Znajdziesz tutaj dziesiątki wątków sugerujących camelCase, łączniki i podkreślenia, z których każdy działa doskonale. Więc to zależy od Ciebie. Wybierz jeden i trzymaj się go.


1
Właściwie nie chodzi o to, który węzeł „wymusza”, przeczytaj to: nodejs.org/api/modules.html#modules_folders_as_modules
moka

0

Według mnie: w przypadku plików używaj małej wielkości wielbłąda, jeśli module.exports jest obiektem, mam na myśli moduł singleton. Dotyczy to również plików JSON, ponieważ są one również w pewnym sensie jedną toną. Użyj wielkich liter wielbłąda, jeśli module.exports zwraca funkcję konstruktora, w której zachowuje się jak klasa.

W przypadku folderów użyj krótkich nazw. Jeśli potrzeba wielu słów, niech będą one całkowicie małe i oddzielone znakiem „-”, aby działało spójnie na wszystkich platformach.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.