Как организовать большие проекты на Node.js

82

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

Например, приложение, использующее и express.js, и socket.io? Это будет включать как логическую структуру приложения, так и файловую систему.

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

Томас Хантер II
источник
2
Есть время почитать книгу ?
Straseus
Возможно, мне придется купить эту книгу, спасибо!
Thomas Hunter II
Google "Модули JavaScript" или "Модульный JavaScript" :-)
Шри
1
Я прочитал книгу, предложенную Стразеем, и она дает много хороших советов и анализов, но я боюсь, что мало что можно сделать при структурировании приложения Node.js с помощью express. Ответ PuerkitoBio ниже содержит ссылки на некоторые предложения по хорошей структуре исходного файла; Я планирую развивать эту структуру по мере необходимости.
Аарон

Ответы:

97

Пример для начинающих

Мне нравится исходная проверка от @ david-ellis, и вам следует изучить ее подробно, чтобы понять, как она хороша. Однако мне бы хотелось, чтобы он был более упрощенным для новичков, желающих увидеть простой пример. Вот что мне бы хотелось, чтобы кто-нибудь показал мне.

Приведем типичный сценарий, в котором вы используете экспресс и у вас есть много маршрутов, перечисленных в вашем файле app.js. Его содержимое будет выглядеть примерно так:

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

Вы можете себе представить, если у вас есть 50 маршрутов, этот файл может выйти из-под контроля. Было бы неплохо убрать часть этого беспорядка из файла app.js.

Что бы вы сделали, так это создать папку «контроллеры» в своем приложении, чтобы ваша структура теперь выглядела так:

app.js
/controllers

Создайте файл в "/ controllers" с именем "index.js" и вставьте следующий код.

/controllers/index.js

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

Вырежьте и вставьте списки маршрутов из файла «app.js» и поместите их в файл «/controllers/index.js».

В файле app.js удалите маршруты и вместо них выполните следующие действия.

app.js

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

Теперь, если вы хотите, чтобы ваш файл "/controllers/index.js" также был разделен, давайте добавим еще один пример, чтобы вы могли увидеть, как Node.js действительно действует как русская кукла в том, как можно организовать его код.

В «/ controllers» добавьте еще один файл «accounts.js» и поместите в него следующее.

/controllers/account.js

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

Теперь в файле "/controllers/index.js" укажите ссылку на "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);
}

Как вы понимаете, вы можете продолжать разбивать вещи на все меньшие и меньшие части и помещать больше папок в папки и ссылаться на «require», если хотите. Вы можете использовать ту же концепцию для "/ lib" или файлов библиотеки. "node_modules" уже делает это.

Это лишь одна из многих причин, по которым node.js очень приятно программировать.

Пример маршрутизации Manageable Express 4

Вот еще один пост, на который я ответил, о маршрутах Express 4, связанных с этим.

Отдых с вложенным роутером Express.js

Джейсон Себринг
источник
ИМХО было лучше до обновления, вы можете избежать необходимости давать имя для каждого контроллера, реализовав механизм псевдонима, когда один маршрут перенаправляется на другой, это также помогает с каноническими URL-
адресами
Не обращайте внимания на канонические URL-адреса, это было запоздалой мыслью. Под каноническим URL-адресом я имел в виду добавление канонического <link>к чему-то вроде /example/pathтого, что пользователь вводит /example/path/в адресную строку (или наоборот).
Тимо Хуовинен
Вы знаете, как программист естественно желать такого типа организованной иерархии, но с практической точки зрения это не очень хорошо при открытии файла или чтении проверки. В итоге вы получите большое количество index.js, работать с которыми быстро становится сложно.
Абхинав Гуджар
Год спустя ценный для меня пост. Я только начинаю использовать node.js для проекта выходного дня.
masfenix
@JasonSebring Так много информации, а я новичок! Я сейчас очень потерян. Будучи аспирантом по математике, я много занимаюсь matlab / R / mathematica, НО последний раз, когда я касался веб-фреймворка / рабочего стола, был еще в дни .net 2.0.
masfenix
10

Несколько дней назад я написал сообщение в блоге на эту тему , и, хотя статья на французском языке, я создал репозиторий GitHub (на английском языке), чтобы показать рабочий пример структуры, которую я использую.

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

mna
источник
Спасибо за эту ссылку, это было хорошее прочтение (с помощью Google Translate), и я уверен, что последую некоторым вашим предложениям при разработке организации проекта, над которым я сейчас работаю.
Аарон
Можешь ссылку поправить?
Евгений Герасимчук
2

Как и в другом сообщении в блоге, я написал его специально об организации Express приложений. Это метод, которым я пользуюсь около полутора лет. По сути, организуйте свои приложения вокруг объектов данных или любых других основных элементов. Разместите логику для каждого из этих элементов в их собственных каталогах. Я старался многое позаимствовать у Python.

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

Райан
источник
1

Его статьи больше не находятся в сети, но серия узлов Эрика Саттервайта рекомендовала структуру, указанную ниже.

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

С packages/папкой, превращающейся в ваш источник для модульности.

Devnetics
источник
0

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

  • Sails.js - 18к звезд. Вы можете посмотреть, как они организовали структуру приложения, по предоставленной мной ссылке. На отличном веб-сайте есть объяснение каждой папки в структуре.

  • Генератор Express.js - 800 звезд. Есть отличный и простой шаблон для начала работы с Express.js. Здесь вы можете заметить, как они разделяют маршруты из приложения.

Между прочим, многие разработчики уже занимались вашим делом, и вы можете просто разветвить его и обновить.

  • Киоска . Посмотрите, как они разделяют события в разные файлы в events/папке.

  • Ballons.io 2.3k звезд. К сожалению, у них есть весь сервер сокетов в одном файле, но вы можете изучить всю структуру приложения с помощью node.js и socket.io.

Евгений Герасимчук
источник
0

Если вы не против, вы всегда можете изучить машинописный текст и перейти на https://nestjs.com/

Если вы хотите придерживаться JS, я настоятельно рекомендую использовать луковичную архитектуру. Лучше всего хранить отдельные бизнес-логику, контроллеры и даже библиотеки (они должны быть заключены в некоторые классы / помощники) - на всякий случай, если вам придется перейти на другую библиотеку (другой парсер CSV и т. Д.).

С луковой архитектурой вам все равно, откуда приходят запросы, не будет много изменений, чтобы добавить даже какой-то брокер сообщений.

Также попробуйте этот https://en.wikipedia.org/wiki/Domain-driven_design

ESLint может помочь с правильной организацией проекта.

Кшиштоф Шостак
источник