Как организовать крупные проекты Node.js
Каковы хорошие способы организации больших проектов Node.js?
Например, приложение, использующее как express.js, так и socket.io? Это будет включать как логическую структуру приложения, так и файловую систему.
В настоящее время я нахожу, что я собираю тонну кода в один главный файл js и помещаю код в гигантский глобальный объект, и он чувствует себя непослушным.
Ответы
Ответ 1
Пример для начинающих
Мне нравится первоначально проверенный от @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
Создайте файл внутри "/контроллеров" с именем "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 действительно действует как русская кукла в том, как ее код может быть организовано.
Внутри "/контроллеров" добавьте еще один файл "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 очень приятен для программирования с помощью.
Управляемый экспресс 4 Пример маршрутизации
Вот еще одно сообщение, на которое я ответил, чтобы выразить 4 маршрута, которые относятся к этому.
Отдых с вложенным маршрутизатором Express.js
Ответ 2
Я бы рекомендовал вам подумать о библиотеках. npm
- отличный инструмент для захвата библиотек, и ваш код, вероятно, делает это все время. Так почему бы не взглянуть на то, что вы пишете, и подумать: "Какими частями этого я бы предпочел быть require
- вместо библиотеки вместо этого?
Затем вы можете сначала найти такую библиотеку, и вы внезапно сократили код, который вам нужно написать. Если вы не можете найти такую библиотеку, вы можете написать свой собственный, а затем решить, хотите ли вы опубликовать ее как библиотеку с открытым исходным кодом или оставить ее закрытой.
Если у вас есть, скажем, довольно сложный объект, который вы хотите использовать в своем коде, но считайте его слишком обычным для конкретного сайта, над которым вы работаете, чтобы квалифицироваться как библиотека, помните, что вы всегда можете var myObj = require('./relative/path/to/javascript/file');
и переместить его в свой отдельный файл для работы, позволяя вам упорядочить свой код аналогично C/С++/Java-коду.
Но опять-таки проблема, решаемая как можно более общим образом, лучше, потому что она стимулирует повторное использование кода и лучшее тестирование вашего кода (особенно если он открывает исходный код, а другие могут его использовать).
Ответ 3
Я написал сообщение блога об этом самом предмете несколько дней назад, и хотя статья написана на французском языке, я создал a GitHub repo (на английском языке), чтобы показать рабочий пример используемой структуры.
Очевидно, что окончательного ответа на этот вопрос нет, но интересно посмотреть, что делают другие, и все мои уши для других мнений по этому вопросу (что также было обсуждено здесь, где вы можете увидеть резюме того, что я предлагаю).
Ответ 4
Как и в других блогах, я написал один из них об организации приложений Express
. Это метод, который я использовал около полутора лет. В принципе, организуйте свои приложения вокруг своих объектов данных или любых других основных элементов. Поместите логику для каждого из этих элементов в свои собственные каталоги. Я пытался много заимствовать у Python.
http://rycole.com/2013/01/28/organizing-nodejs-express.html
Ответ 5
Я понимаю, что этот вопрос довольно старый, однако я нашел серию Eric Satterwhite Node невероятно полезной, когда я впервые начал разрабатывать Node по шкале.
http://www.codedependant.net/2015/01/19/production-ready-node-structure-packaging/
В этой статье вы найдете большой пакет положительных героев и структуру, которая выглядит следующим образом:
# Project
.
|-- packages/
| |-- proejct-core
| | |-- lib/
| | |-- commands/
| | |-- startup/
| | |-- conf/
| | |-- test/
| | |-- package.json
| | |-- README.md
| | |-- events.js
| | |-- .npmignore
| | `-- index.js
|-- package.json
`-- index.js
Когда папка packages/
превращается в ваш источник для модульности.