Я использую веб-фреймворк ExpressJS для NodeJS.
Люди, использующие ExpressJS, размещают свои среды (разработку, производство, тестирование ...), свои маршруты и т. Д. На app.js
. Я думаю, что это не очень красиво, потому что когда у вас большое приложение, app.js слишком велик!
Я хотел бы иметь эту структуру каталогов:
| my-application
| -- app.js
| -- config/
| -- environment.js
| -- routes.js
Вот мой код:
app.js
var express = require('express');
var app = module.exports = express.createServer();
require('./config/environment.js')(app, express);
require('./config/routes.js')(app);
app.listen(3000);
конфиг / environment.js
module.exports = function(app, express){
app.configure(function() {
app.use(express.logger());
});
app.configure('development', function() {
app.use(express.errorHandler({
dumpExceptions: true,
showStack: true
}));
});
app.configure('production', function() {
app.use(express.errorHandler());
});
};
конфиг / routes.js
module.exports = function(app) {
app.get('/', function(req, res) {
res.send('Hello world !');
});
};
Мой код работает хорошо, и я думаю, что структура каталогов прекрасна. Тем не менее, код должен быть адаптирован, и я не уверен, что это хорошо / красиво.
Лучше использовать мою структуру каталогов и адаптировать код или просто использовать один файл (app.js)?
Спасибо за ваши советы!
Ответы:
Хорошо, это было давно, и это популярный вопрос, поэтому я решил создать репозиторий github для скаффолдинга с кодом JavaScript и длинным README о том, как мне нравится структурировать приложение express.js среднего размера.
focusaurus / express_code_structure - это репозиторий с последним кодом для этого. Потяните запросы приветствуются.
Вот снимок README, так как stackoverflow не любит ответы типа «просто ссылка». Я сделаю некоторые обновления, так как это новый проект, который я буду продолжать обновлять, но в конечном итоге репозиторий github станет актуальным местом для получения этой информации.
Экспресс структура кода
Этот проект является примером того, как организовать веб-приложение express.js среднего размера.
Текущий как минимум экспресс v4.14 декабрь 2016
Насколько велико ваше приложение?
Веб-приложения не одинаковы, и, на мой взгляд, нет единой структуры кода, которая должна применяться ко всем приложениям express.js.
Если ваше приложение маленькое, вам не нужна такая глубокая структура каталогов, как показано здесь. Просто сделайте это просто и вставьте несколько
.js
файлов в корень вашего хранилища, и все готово. Вуаля.Если ваше приложение огромно, в какой-то момент вам нужно разбить его на отдельные пакеты npm. В целом подход node.js предпочтителен для множества небольших пакетов, по крайней мере, для библиотек, и вы должны создать свое приложение, используя несколько пакетов npm, поскольку это начинает иметь смысл и оправдывает накладные расходы. Так как ваше приложение растет, и некоторая часть кода становится многократно используемой за пределами вашего приложения или становится чистой подсистемой, переместите его в свой собственный репозиторий git и превратите в отдельный пакет npm.
Таким образом, цель этого проекта - проиллюстрировать работоспособную структуру для приложения среднего размера.
Какова ваша общая архитектура
Существует много подходов к созданию веб-приложения, таких как
Каждый из них хорошо вписывается в другую структуру каталогов. Для целей этого примера это просто строительные леса, а не полностью работающее приложение, но я предполагаю следующие ключевые моменты архитектуры:
А как насчет Ruby on Rails?
На протяжении всего проекта будет темой, что многие идеи, воплощенные в Ruby on Rails, и принятые ими решения "Convention over Configuration", хотя они широко приняты и используются, на самом деле не очень полезны, а иногда являются противоположностью тому, что в этом хранилище. рекомендую.
Здесь я хочу сказать, что существуют основополагающие принципы организации кода, и, основываясь на этих принципах, соглашения Ruby on Rails имеют смысл (в основном) для сообщества Ruby on Rails. Тем не менее, просто бездумно придерживаясь этих соглашений, теряет смысл. Как только вы освоите основные принципы, ВСЕ ваши проекты будут хорошо организованы и понятны: сценарии оболочки, игры, мобильные приложения, корпоративные проекты, даже ваш домашний каталог.
Сообщество Rails хочет иметь возможность иметь одного разработчика Rails, переключающегося с одного приложения на другое, и быть знакомым с ним каждый раз. Это имеет смысл, если у вас 37 сигналов или Pivotal Labs, и имеет свои преимущества. В мире серверного JavaScript общий идеал - это просто куда больше дикого запада, и у нас действительно нет проблем с этим. Вот так мы катимся. Мы к этому привыкли. Даже в express.js это близкий родственник Синатры, а не Rails, и получение соглашений от Rails обычно ничего не помогает. Я бы даже сказал Принципы над Конвенцией над Конфигурацией .
Основные принципы и мотивы
app/node_modules
каталог и естьpackage.json
файлы в прото-модулях каталогов , чтобы облегчить этот переход и действовать в качестве напоминания.app
каталоге, поэтому вы можетеcd
запустить find / grep / xargs / ag / ack / etc и не отвлекаться на сторонние совпаденияkebab-case
хотя имя переменной для этого должно быть в JavaScript,camelCase
потому что в JavaScript-
это знак минус.kebab-case
преобразованным вcamelCase
app/views
,app/controllers
,app/models
и т.д.routes.rb
Файл в стиле rails удобен, если вы хотите получить обзор всех маршрутов в приложении, но при создании объектов и исправлении ошибок вам важны только маршруты, относящиеся к изменяемой части.app/users
потому что нет повсюду гнезда связанной бизнес-логики, загрязняющего чистоту базы кода пользователя.app/server.js:1
и вы можете видеть все, что оно загружает и выполняет, следуя коду.magicRESTRouter.route(somecontroller, {except: 'POST'})
это большой победа для вас более 3 основныхapp.get
,app.put
,app.del
, звонки, вы , вероятно , строительство монолитного приложения , которое является слишком большим , чтобы эффективно работать. Получите фантазию для БОЛЬШИХ выигрышей, а не для преобразования 3 простых линий в 1 сложную линию.Используйте имена файлов в нижнем регистре
особенности express.js
Не используйте
app.configure
. Это почти полностью бесполезно, и вам просто не нужно это. Это в большом количестве из-за бессмысленной коппасты.app.use
для всего приложения, если вам действительно нужно это промежуточное ПО только для 2 маршрутов (я смотрю на вас,body-parser
)server.js
и будет ясно, как они упорядочены. Для приложений среднего размера разбить вещи на отдельные модули маршрутов - это хорошо, но оно представляет опасность неработающего промежуточного программного обеспеченияТрюк с символической ссылкой на приложение
Есть много подходов , изложенных и обсужденные на длину сообщества в большой сущности лучше местным требуют () пути для Node.js . Вскоре я могу предпочесть либо "просто иметь дело с большим количеством ../../../ ..", либо использовать модуль requireFrom. Тем не менее, в данный момент я использую трюк с символическими ссылками, описанный ниже.
Таким образом, один из способов избежать внутрипроектных требований с помощью раздражающих относительных путей, таких как
require("../../../config")
использование следующего трюка:.gitignore
файлеvar config = require("app/config");
var DealModel = require("app/deals/deal-model")
;конфигурация
Как правило, модули кода и классы ожидают
options
передачи только базового объекта JavaScript . Только модульapp/server.js
должен загружатьсяapp/config.js
. Оттуда он может синтезировать небольшиеoptions
объекты для настройки подсистем по мере необходимости, но соединение каждой подсистемы с большим глобальным модулем конфигурации, полным дополнительной информации, является плохой связью.Попробуйте централизовать создание соединений с БД и передавать их в подсистемы, а не передавать параметры соединений и заставлять подсистемы сами устанавливать исходящие соединения.
NODE_ENV
Это еще одна заманчивая, но ужасная идея, перенесенная с Rails. В вашем приложении должно быть ровно 1 место,
app/config.js
которое смотрит наNODE_ENV
переменную окружения. Все остальное должно принимать явную опцию в качестве аргумента конструктора класса или параметра конфигурации модуля.Если в модуле электронной почты есть опция для доставки электронной почты (SMTP, вход в stdout, очередь и т. Д.), Он должен выбрать вариант, подобный этому,
{deliver: 'stdout'}
но он абсолютно не должен проверятьNODE_ENV
.тесты
Теперь я храню свои тестовые файлы в том же каталоге, что и соответствующий им код, и использую соглашения об именах расширений файлов, чтобы отличать тесты от производственного кода.
foo.js
имеет код модуля "foo"foo.tape.js
имеет основанные на узлах тесты для foo и живет в том же каталогеfoo.btape.js
может использоваться для тестов, которые необходимо выполнить в среде браузераЯ использую глобусы файловой системы и
find . -name '*.tape.js'
команду, чтобы получить доступ ко всем моим тестам по мере необходимости.Как организовать код в каждом
.js
файле модуляОбласть действия этого проекта в основном о том, куда идут файлы и каталоги, и я не хочу добавлять много других областей, но я просто упомяну, что я организовал свой код в 3 отдельных раздела.
источник
ОБНОВЛЕНИЕ (2013-10-29) : Пожалуйста, ознакомьтесь с моим другим ответом, в котором есть популярный спрос на JavaScript вместо CoffeeScript, а также типовое репозиторий github и подробное описание README с моими последними рекомендациями по этой теме.
конфиг
То, что вы делаете, прекрасно. Мне нравится иметь свое собственное пространство имен конфигурации, настроенное в
config.coffee
файле верхнего уровня с вложенным пространством имен, подобным этому.Это удобно для редактирования системного администратора. Затем, когда мне нужно что-то, как информация о подключении к БД, это
Маршруты / Контроллеры
Мне нравится оставлять свои маршруты с контроллерами и организовывать их в
app/controllers
подкаталоге. Затем я могу загрузить их и позволить им добавлять любые маршруты, которые им нужны.В моем
app/server.coffee
файле coffeescript я делаю:Итак, у меня есть файлы вроде:
И, например, в моем контроллере доменов у меня есть такая
setup
функция.Взгляды
Ввод взглядов
app/views
становится привычным местом. Я выкладываю это так.Статические файлы
Перейти в
public
подкаталог.Github / Semver / НМП
Поместите файл уценки README.md в свой корень git-репо для github.
Поместите файл package.json с семантическим номером версии в корень вашего git-репо для NPM.
источник
app.put route, api.needId
Go
и включилbin
файл в структуру. Как вы запускаете этотgo
файлbin
?Ниже приводится дословный ответ Питера Лайонса, перенесенный на ванильный JS из Coffeescript, по просьбе нескольких других. Ответ Питера очень удачный, и любой, кто голосует за мой ответ, должен голосовать и за него.
конфиг
То, что вы делаете, прекрасно. Мне нравится иметь свое собственное пространство имен конфигурации, настроенное в
config.js
файле верхнего уровня с вложенным пространством имен, подобным этому.Это удобно для редактирования системного администратора. Затем, когда мне нужно что-то, как информация о подключении к БД, это
Маршруты / Контроллеры
Мне нравится оставлять свои маршруты с контроллерами и организовывать их в
app/controllers
подкаталоге. Затем я могу загрузить их и позволить им добавлять любые маршруты, которые им нужны.В моем
app/server.js
файле JavaScript я делаю:Итак, у меня есть файлы вроде:
И, например, в моем контроллере доменов у меня есть такая
setup
функция.Взгляды
Ввод взглядов
app/views
становится привычным местом. Я выкладываю это так.Статические файлы
Пойти в
public
подкаталог.Github / Semver / НМП
Поместите файл уценки README.md в свой корень git-репо для github.
Поместите файл package.json с семантическим номером версии в корень вашего git-репо для NPM.
источник
Мой вопрос был введен в апреле 2011 года, он тихий старый. За это время я смог улучшить свой опыт работы с Express.js и узнать, как создавать приложения, написанные с использованием этой библиотеки. Итак, я делюсь здесь своим опытом.
Вот моя структура каталогов:
App.js
Цель
app.js
файла - запустить приложение expressjs. Он загружает модуль конфигурации, модуль логгера, ожидает подключения к базе данных, ... и запускает экспресс-сервер.маршруты /
В каталоге маршрутов есть
index.js
файл. Его цель - ввести магию для загрузки всех других файлов внутриroutes/
каталога. Вот реализация:С этим модулем создание нового определения и реализации маршрута действительно легко. Например
hello.js
:Каждый модуль маршрута является автономным .
источник
Мне нравится использовать глобальное «приложение», а не экспортировать функцию и т. Д.
источник
Я думаю, что это отличный способ сделать это. Не ограничивается выражением, но я видел довольно много проектов node.js на github, делающих одно и то же. Они извлекают параметры конфигурации + меньшие модули (в некоторых случаях каждый URI) располагаются в отдельных файлах.
Я бы порекомендовал пройтись по специальным проектам на github, чтобы получить представление. ИМО, как вы делаете это правильно.
источник
сейчас конец 2015 года, и после того, как я разработал свою структуру в течение 3 лет, а также в малых и крупных проектах. Вывод?
Не делайте один большой MVC, но разделяйте его на модули
Так...
Почему?
Обычно один работает с одним модулем (например, с продуктами), который вы можете изменить самостоятельно.
Вы можете повторно использовать модули
Вы можете проверить это отдельно
Вы можете заменить его отдельно
У них есть четкие (стабильные) интерфейсы
-Последнее, если работало несколько разработчиков, разделение модулей помогает
Проект nodebootstrap похож на мою окончательную структуру. ( GitHub )
Как выглядит эта структура?
Маленькие капсулированные модули , каждый с отдельным MVC
Каждый модуль имеет package.json
Тестирование как часть структуры (в каждом модуле)
Глобальная конфигурация , библиотеки и сервисы
Интегрированный докер, кластер, навсегда
Folderoverview (см. Папку lib для модулей):
источник
Я даю структуру папок в стиле MVC, пожалуйста, найдите ниже.
Мы использовали нижнюю структуру папок для наших больших и средних веб-приложений.
Я создал один модуль npm для генерации экспресс-структуры папок mvc.
Пожалуйста, найдите ниже https://www.npmjs.com/package/express-mvc-generator
Просто простые шаги для генерации и использования этих модулей.
я) установить модуль
npm install express-mvc-generator -g
II) проверить параметры
express -h
iii) Создать экспресс-структуру MVC
express myapp
iv) Установить зависимости
npm install
::v) Откройте ваш config / database.js, пожалуйста, настройте вашу базу данных mongo.
vi) Запустите приложение
node app
илиnodemon app
vii) Проверьте URL-адрес http: // localhost: 8042 / регистрация или http: // yourip: 8042 / регистрация
источник
Прошло много времени с момента последнего ответа на этот вопрос, и Express также недавно выпустила версию 4, в которой добавлено несколько полезных вещей для организации структуры вашего приложения.
Ниже приведен длинный актуальный пост в блоге о лучших методах структурирования вашего приложения Express. http://www.terlici.com/2014/08/25/best-practices-express-structure.html
Существует также репозиторий GitHub, в котором применяются рекомендации из этой статьи. Он всегда в курсе последних версий Express.
https://github.com/terlici/base-express
источник
Я не думаю, что это хороший подход для добавления маршрутов в конфигурации. Лучшая структура может быть примерно такой:
Таким образом, products.js и users.js будут содержать все ваши маршруты, и вся логика будет внутри.
источник
Ну, я поместил мои маршруты в файл json, который я прочитал в начале, и в цикле for в app.js установил маршруты. В файле route.json указывается, какой вид следует вызвать, и ключ для значений, которые будут отправлены в маршрут.
Это работает для многих простых случаев, но мне пришлось вручную создавать некоторые маршруты для особых случаев.
источник
Я написал пост именно по этому вопросу. Он в основном использует a,
routeRegistrar
который перебирает файлы в папке,/controllers
вызывающей его функциюinit
. Функцияinit
принимаетapp
переменную Express в качестве параметра, чтобы вы могли регистрировать маршруты по своему усмотрению.источник
Это может представлять интерес:
https://github.com/flatiron/nconf
источник
1) Ваша файловая система проекта Express может выглядеть так:
app.js - ваш глобальный контейнер приложений
2) Основной файл модуля (lib / mymodule / index.js):
3) Подключите модуль в главном app.js
4) Пример логики
tj говорит / покажет на Vimeo интересную идею о том, как модулировать экспресс-приложение - модульные веб-приложения с Node.js и Express . Мощный и простой.
источник
http://locomobiljs.org/ предоставляет способ структурировать приложение, созданное с помощью Node.js и Express.
С веб-сайта:
источник
Недавно я принял модули как независимые мини-приложения.
Теперь для любого модуля маршрутизации (# .js) представления (* .ejs), js, css и assets находятся рядом друг с другом. подмодульная маршрутизация настроена в родительском # .js с двумя дополнительными строками
Таким образом, возможны даже субподмодули.
Не забудьте установить вид на каталог src
источник
Так выглядит большая часть структуры моего экспресс-проекта.
Я обычно делаю
express dirname
инициализацию проекта, прости мою лень, но он очень гибкий и расширяемый. PS - вам нужно получитьexpress-generator
за это (для тех, кто ищет егоsudo npm install -g express-generator
, sudo, потому что вы устанавливаете его глобально)Вам должно быть интересно, почему .env файлы? Потому что они работают! Я использую
dotenv
модуль в своих проектах (много недавно), и он работает! Вставьте эти 2 заявления вapp.js
илиwww
И еще одна строка, чтобы быстро установить
/bower_components
для обслуживания статического контента под ресурсом/ext
Возможно, он подойдет людям, которые хотят использовать Express и Angular вместе, или,
javascripts
конечно , просто выразить без этой иерархии.источник
Моя структура экспресс 4. https://github.com/odirleiborgert/borgert-express-boilerplate
пакеты
Структура
источник
Простой способ структурировать приложение ur express:
В main index.js должен поддерживаться следующий порядок.
источник
Лучший путь к структуре MVC для проекта ExpressJs с рулем и Passportjs
источник