Структура папок для проекту Node.js


346

Я помічаю, що проекти Node.js часто містять такі папки:

/ libs, / vendor, / support, / spec, / тести

Що саме це означають? Що між ними різниться, і куди мені слід включити посилається код?

Відповіді:


439

Щодо згаданих вами папок:

  • /libs зазвичай використовується на замовлення classes/functions/modules
  • /vendorабо /supportмістить сторонні бібліотеки (додається як підмодуль git при використанні git як керування джерелом)
  • /spec містить технічні характеристики для тестів на BDD.
  • /testsмістить одиничні тести для програми (використовуючи рамки тестування, дивіться тут )

ПРИМІТКА: обидва /vendorта /supportзастарілі з моменту запровадження чистого управління пакетом NPM. Рекомендується обробляти всі сторонні залежності, використовуючи NPM та файл package.json

Створюючи досить великий додаток, я рекомендую такі додаткові папки (особливо, якщо ви використовуєте якусь MVC- / ORM-Framework, наприклад експрес чи мангусту ):

  • /modelsмістить усі ваші моделі ORM (звані Schemasмангустами)
  • /views містить ваші шаблони перегляду (використовуючи будь-яку мову шаблонів, підтримувану в експресі)
  • /public містить увесь статичний вміст (зображення, таблиці стилів, JavaScript на стороні клієнта)
    • /assets/images містить файли зображень
    • /assets/pdf містить статичні PDF-файли
    • /css містить таблиці стилів (або складений вихід двигуном css)
    • /js містить клієнтський JavaScript
  • /controllersмістять усі ваші експрес-маршрути, розділені модулем / областю вашої програми (зауважте: при використанні функції завантаження Express, ця папка називається /routes)

Я звик організовувати свої проекти таким чином, і я думаю, що це працює досить добре.

Оновлення програм Express Express на основі CoffeeScript (з використанням підключення-активів ):

  • /app містить ваш складений JavaScript
  • /assets/ містить усі активи клієнта, які потребують компіляції
    • /assets/js містить файли CoffeeScript на стороні клієнта
    • /assets/css містить усі ваші ТАБЛИЦІ стилів менше
  • /public/(js|css|img) містить ваші статичні файли, якими не обробляє жоден компілятор
  • /src містить усі файли CoffeeScript, які стосуються вашого сервера
  • /test містить усі сценарії тестування одиниць (реалізовані за допомогою тестової рамки на ваш вибір)
  • /views містить усі ваші експрес-погляди (будь то нефрит, ейс чи будь-який інший механізм шаблону)

5
куди б ви розмістили ваші клієнтські js, css, зображення? Ви б запропонували подібну структуру папок у загальнодоступній папці: ?
ezmilhouse

2
expressjs створює каталог ./routes, це те саме, що ./controllers у вашому прикладі?
chovy

2
Чому б не створити генератор Yeoman з цією пропозицією? Це може стати стандартом.
Джейр Мотта

+1 Походить з ASP.NET MVC, називати папку "маршрути" "контролерами" для мене набагато більше сенсу.
adam0101

Питання, чи не є структури каталогів, що зазвичай генеруються рамкою (тобто Symfony для PHP)? Наприклад, за допомогою Express, жодна структура каталогів не створена правильно? розробники повинні вручну створювати та підтримувати MVC-дизайн та маршрути? Я ціную будь-які відгуки, я новачок у Express
AnchovyLegend

49

На GitHub йде дискусія через подібне до цього питання: https://gist.github.com/1398757

Ви можете використовувати інші проекти для керівництва, шукайте в GitHub для:

  • ThreeNodes.js - на мою думку, схоже, має конкретну структуру, не підходить для кожного проекту;
  • легший - більш проста структура, але не вистачає трохи організації;

І нарешті, у книзі ( http://shop.oreilly.com/product/0636920025344.do ) пропонується така структура:

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

Я створив модуль, щоб динамічно вимагати файли, що дозволяє структурувати проект за характеристиками, а не за типовою моделлю, переглядом, контролером. Сподіваюся, що це комусь допоможе: github.com/ssmereka/crave
Скотт

13

Більше прикладу з моєї архітектури проекту ви можете побачити тут:

├── 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

В основному логічний додаток відокремлено від папок DB і APP всередині режиму SRC.


якщо ваш додаток також містить додаток для переднього кінця, ви ставите це під srcабо передній додаток отримує власну папку (із власною package.jsonта подібною структурою папок)?
прогулянка

2
@wal Я вважаю за краще розділити проекти інтерфейсів до іншого сховища, оскільки це більш організовано
Даніель Черненков

2

Це непряма відповідь, що стосується самої структури папок, дуже пов'язаної.

Кілька років тому у мене було те саме питання, я взяв структуру папок, але мені довелося зробити багато каталогу, рухаючись згодом, тому що папка була призначена для інших цілей, ніж те, що я читав в Інтернеті, тобто те, що конкретна папка має різні значення для різних людей у ​​деяких папках.

Тепер, зробивши кілька проектів, на додаток до пояснень у всіх інших відповідях, щодо самої структури папок, я настійно пропоную дотримуватися структури самої Node.js, яку можна побачити за посиланням: https://github.com/ nodejs / вузол . У ньому є велика інформація про всі, скажімо, лінери та інші, яку структуру файлів і папок вони мають і де. Деякі папки мають README, який пояснює, що знаходиться у цій папці.

Починати з вищевказаної структури добре, тому що одного дня приходить нова вимога, але ви будете мати можливість вдосконалитись, оскільки за ним уже слідує сам Node.js, який підтримується протягом багатьох років.

Сподіваюсь, це допомагає.


1

Важливо зауважити, що немає єдиної думки щодо того, який найкращий підхід і пов'язані рамки взагалі не застосовують і не винагороджують певні структури.

Я вважаю це неприємним та величезним накладним, але не менш важливим. Це свого роду занижена версія (але IMO важливіше) проблеми стильового керівництва . Мені б хотілося вказати на це, тому що відповідь однаковий: не має значення, яку структуру ви використовуєте, доки вона чітко визначена та узгоджена .

Тож я б запропонував шукати всебічне керівництво, яке вам подобається, і давати зрозуміти, що проект базується на цьому.

Це непросто, особливо якщо ви новачок у цьому! Розраховуйте витратити години на дослідження. Ви знайдете більшість посібників, які рекомендують структуру, подібну до MVC. Хоча кілька років тому це, можливо, було грунтовним вибором, в наш час це не обов'язково. Наприклад, ось інший підхід .


1

Припустимо, що ми говоримо про веб-додатки та побудову API:

Один із підходів - класифікувати файли за особливостями , як на зразок архітектури мікро-сервісу. Найбільший виграш, на мою думку, полягає в тому, що дуже легко зрозуміти, які файли відносяться до функції програми.

Найкращий спосіб ілюстрації - це приклад:


Ми розробляємо бібліотечний додаток. У першій версії програми користувач може:

  • Шукайте книги та переглядайте метадані книг
  • Шукайте авторів і переглядайте їхні книги

У другій версії користувачі також можуть:

  • Створіть обліковий запис та увійдіть у систему
  • Позики / позики книг

У третій версії користувачі також можуть:

  • Збережіть список книг, які вони бажають прочитати, або позначте вибране

Спочатку ми маємо таку структуру:

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

Потім ми додаємо функції користувача та позики:

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

А потім вибрана функціональність:

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

Будь-який новий розробник, якому передають завдання додати, що пошук книг також повинен повертати інформацію, якщо будь-яка книга була позначена як улюблена, дуже легко зрозуміти, де в коді він / вона повинен шукати.

Потім, коли власник продукту підмітає і вигукує, що функцію обраного потрібно повністю видалити, її легко видалити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.