Соглашения об именах проектов Node.js для файлов и папок

119

Каковы соглашения об именах файлов и папок в большом проекте Node.js?

Должен ли я использовать заглавные буквы, верблюжий случай или занижение?

Т.е. это считается действительным?

project-name
    app
        controllers
            someThings.js
            users.js
        models
                someThing.js
                user.js
        views
            some-things
                index.jade
            users
                logIn.jade
                signUp.jade
    ...
Рудигер
источник
3
Очень субъективно, ваша структура каталогов принадлежит вам. Лично мне нравится camelCase, потому что именно этим я и занимаюсь в JS
Чад
@Chad - в Node.js requireпринимает строку каталога в качестве параметра, поэтому она не полностью ваша. т.е. require('../app/controllers/someThings');
Rudiger
3
Node не указывает никаких предложений или стандартов для именования модулей, при условии, что они являются действительными именами файлов / каталогов и не пытаются переопределить имена основных модулей . Для собственных модулей он использует сочетание сокращенного ( fs), однословного ( events), подчеркнутого ( child_process) и строчного ( querystring).
Джонатан Лоновски
1
@Rudiger Итак? Вы можете указать любую строку, которую хотите, и структуру каталогов, которую вы можете иметь (при условии, что ваши имена являются допустимыми именами файлов).
Чад
Из того, что я могу судить по большему количеству ключевых проектов, таких как имена файлов мокко, такие как captain-awesome-file.js, кажется, достаточно распространенным. По крайней мере, это то, что я собираюсь использовать!
Чарльз Ферентчак 03

Ответы:

156

После нескольких лет работы с node я могу сказать, что нет никаких соглашений о структуре каталогов / файлов. Однако большинство (профессиональных) экспресс-приложений используют такие настройки, как:

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

Примером, который использует эту настройку, является nodejs-starter .

Я лично изменил эту настройку на:

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

На мой взгляд, последний лучше соответствует структуре каталогов в стиле Unix (тогда как первый немного смешивает это).

Мне также нравится этот шаблон для разделения файлов:

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;

Библиотека / статический / index.js

var express = require('express');

module.exports = function(app) {

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

};

Это позволяет аккуратно отделить весь исходный код, не беспокоясь о зависимостях. Действительно хорошее решение для борьбы с неприятным Javascript. Реальный пример рядом , который использует эту установку.

Обновление (имена файлов):

Что касается имен файлов наиболее распространенных являются короткими , в нижнем регистре имен файлов. Если ваш файл можно описать только двумя словами, в большинстве проектов JavaScript в качестве разделителя используется символ подчеркивания.

Обновление (переменные):

Что касается переменных, применяются те же «правила», что и для имен файлов. Однако прототипы или классы должны использовать camelCase .

Обновление (руководства по стилям):

bodokaiser
источник
27
Насколько интересен и хорошо сделан ваш ответ, это не по теме, создатель темы специально попросил соглашение об именах, а не для структур каталогов. Когда мы переходим к этой теме, мы ожидаем узнать, лучше ли называть файлы тире, подчеркивания или camelCase. Я буду поддерживать, если это будет добавлено к этому ответу.
Tronix117,
3
@ Tronix117 в чем проблема? Вопрос спрашивает "соглашения об именах проектов для файлов и папок?" и именование не ограничивается именем файла, так как оно также включает полное имя пути.
bodokaiser 05
24
конечно, но автор конкретно спрашивает: «Следует ли использовать заглавные буквы, верблюжий случай или занижение?». Когда он пишет свой пример, он явно помещает «someThings» и «some-things», чтобы знать, можно ли его считать действительным. Когда я перешел к этой теме, я ожидал получить ответ на этот конкретный вопрос и узнать, что обычно используется в качестве именования файлов. Я не говорю, что ваш ответ неправильный, он идеально подходит для своей цели, но, на мой взгляд, неполный, потому что он не отвечает на главный вопрос.
Tronix117 05
5
Думаю, вы меня неправильно поняли;). Я просто искал что-то, чего я не нашел в принятом ответе, но меня конкретно спросили, не сеять ненависть ни в каком виде, вы зашли немного далеко в этом. Я просто хотел, чтобы вы добавили некоторую информацию об этом в ответ, чтобы люди, которые будут искать это в будущем, не попали в тупик.
Tronix117
3
@ Tronix117 Собственно, именно поэтому я оказался на этой странице, читая этот ответ. Я надеялся не только на структуру каталогов, но и, что более важно, на соглашения об именах (тире, подчеркивания, camelCase, TitleCase и т. Д.). К сожалению, ответ все еще не содержит этого, и, похоже bodokaiser, я слишком лично принимаю это, чтобы вмешаться и попросить, чтобы его мнение по этому поводу было добавлено к его ответу (как ОП первоначально задал в своем вопросе) ( кашель, кашель ).
Swivel
101

Используйте kebab-caseдля всех имен пакетов, папок и файлов.

Зачем?

Вы должны представить, что когда-нибудь любая папка или файл могут быть извлечены в отдельный пакет. Пакеты не могут содержать заглавные буквы.

В названии новых пакетов не должно быть прописных букв. https://docs.npmjs.com/files/package.json#name

Поэтому camelCaseникогда не следует использовать. Это оставляет snake_caseи kebab-case.

kebab-caseна сегодняшний день является наиболее распространенным условием. Единственное использование подчеркиваний - для пакетов внутренних узлов, и это просто соглашение с первых дней.

Vaughan
источник
2
ты забыл точку? как socket.io
Roee
1
.2c, может выполнять простую автоматизацию от kebab-case до kebabCase в любом скрипте или приложении на любом языке, используя регулярное выражение - делайте это все время 🙃
rob2d 09
63

Нет никаких условностей. Есть какая-то логическая структура.

Единственное, что я могу сказать: никогда не используйте имена файлов и каталогов camelCase. Зачем? Он работает, но на Mac и Windows нет разницы между someAction и some action. Встречался с этой проблемой, и не раз. Мне нужен такой файл:

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

Но , к сожалению , я создал файл с полным строчными буквами: lib/ishidden.js. У меня это сработало на Mac. Он отлично работал на Mac моего коллеги. Тесты проходят без ошибок. После развертывания мы получили огромную ошибку:

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

О да. Это Linux-бокс. Таким образом, структура каталогов camelCase может быть опасной. Этого достаточно для коллеги, который занимается разработкой на Windows или Mac.

Так что используйте разделитель подчеркивания (_) или тире (-), если вам нужно.

yitsushi
источник
4
+1, добавьте тот факт, что переименование папок с учетом регистра в git в системе, отличной от CS, является настоящей проблемой.
максимум
4
Я действительно не понимаю, в чем проблема с camelCase. Разве проблема не будет решена путем в первую очередь правильного имени файла (lib / isHidden.js)?
Майк
Привет, Майк, дело в том, что camelCase сломается при развертывании на некоторых системах. Я был сбит с толку, почему все мои каталоги получали ошибку 404, когда я развертывал с Mac на Linux с пакетом с именем «groupPages». Мне пришлось перейти на групповые страницы, чтобы исправить ситуацию.
tempranova
3
Что еще хуже: создайте версию имени файла в верблюжьем регистре и попросите неосторожного коллегу создать версию в нижнем регистре в том же каталоге. Теперь выполните проверку в операционной системе без учета регистра и попытайтесь выяснить, почему, черт возьми, ваше приложение не работает. И да, это случилось.
L0LN1NJ4 08
Мне нравится этот ответ, но хочу отметить, что тире (-) тоже может иметь проблемы. Например, с помощью тестовой среды Nighwatch я создал объект страницы с именем admin-login.js. Затем я попытался получить к нему доступ из тестового скрипта, используя const loginPage = browser.page.admin-login(). У меня ошибка ReferenceError: login is not defined. Использование подчеркивания (_) в имени файла решило проблему. Я также могу представить, что использование имен файлов с тире в командной строке также может привести к некоторым проблемам. Поэтому я бы сказал, что подчеркивание - самый безопасный разделитель для имен файлов в целом.
Драган Николич
15

На основе " Руководства по стилю Google JavaScript "

Имена файлов должны быть в нижнем регистре и могут включать подчеркивание (_) или дефис (-), но без дополнительных знаков препинания. Следуйте соглашению, которое использует ваш проект. Расширение имен файлов должно быть .js.

Влад Безден
источник
3

Большинство людей используют camelCaseJS. Если вы хотите что-нибудь с открытым исходным кодом, я предлагаю вам использовать это :-)

Матье Амио
источник
Некоторые проекты, такие как Locomotive.js, используются camelCaseдля файлов контроллеров. :-) Просто зависит от обстоятельств. Я обычно использую PascalCaseдля файлов класса.
Mathieu Amiot
@yitsushi, похоже, вызывает серьезную озабоченность по поводу именования кейсов верблюда (и паскаль), если вы хотите создавать портативные модули, чехол с верблюжьим модулем наверняка кажется плохой идеей?
gumaflux
0

Node.js не применяет никаких соглашений об именах файлов (кроме index.js). И язык Javascript в целом тоже. Здесь вы можете найти десятки тем, которые предлагают верблюжий регистр, дефисы и подчеркивания, любой из которых отлично работает. Так что решать вам. Выберите один и придерживайтесь его.

Субхас
источник
1
На самом деле, это не то, что «обеспечивает» узел, прочтите это: nodejs.org/api/modules.html#modules_folders_as_modules
moka
0

По моему мнению: для файлов используйте нижний регистр верблюда, если module.exports является объектом, я имею в виду одноэлементный модуль. Это также применимо к файлам JSON, поскольку они тоже в некотором смысле тонны. Используйте верхний регистр верблюда, если module.exports возвращает функцию-конструктор, где он действует как класс.

Для папок используйте короткие названия. Если необходимо использовать несколько слов, пусть они будут полностью строчными, разделенными знаком «-», чтобы это работало на всех платформах единообразно.

Арунрам
источник