Как упаковать и развернуть веб-приложение Node.js + express?

83

Я новичок в программировании на Node.js, и недавно я создал образец рабочего веб-приложения, используя (экспресс, магистраль и другие дополнительные технологии просмотра с mongoDB). Теперь я нахожусь в точке, где я хочу развернуть то же самое в промежуточной среде, и я не уверен, как упаковать это приложение и распространить его. [Я могу позаботиться о mongoDb и настроить его отдельно]

Я из мира Java, и там мы создаем jar-файлы для многоразовых библиотек и пакеты war / ear для веб-приложений, которые развертываются в контейнере сервлетов. В этом случае, поскольку node.js сам действует как веб-контейнер, как мне упаковать свое веб-приложение?

  1. Есть ли какой-либо стандартный формат / рекомендации по упаковке веб-приложений для узлов, созданных с использованием экспресс? (Есть ли аналогичные системы упаковки jar / war для приложений node?)
  2. Как мне развернуть его после упаковки? Станет ли он exe-файлом, поскольку он также является собственным контейнером?

PS: На данный момент я думаю о том, чтобы просто вручную скопировать все необходимые исходные файлы в промежуточную среду и запустить команды npm, чтобы загрузить все зависимости на этот компьютер, а затем использовать «навсегда» или какой-либо другой механизм для запуска моего server.js. (Кроме того, добавьте своего рода мониторинг, на случай, если приложение выйдет из строя и навсегда выйдет из строя). Я не уверен, что это правильный путь? Я уверен, что должен быть какой-то стандартизированный способ решения этой проблемы.

KBJ
источник
Для моих java-проектов мы используем Maven как инструмент сборки / развертывания. В прошлом у меня был опыт даже с муравьями. Я посмотрел на Grunt для Node.js, но все, что я мог понять из его задач, это то, что он выполняет задачи предварительной обработки (такие как минификация, concat, JSHint и т. Д.), Он ничего не упоминает об упаковке приложения, а затем говорит об установке в репозиторий (например, как это делает maven).
KBJ

Ответы:

45

Стандартизированного пути не существует, но вы на правильном пути. Если ваш package.jsonкаталог обновлен и находится в хорошем состоянии, вы можете просто скопировать / zip / clone каталог вашего приложения в производственную систему, за исключением node_modules.

В производственной системе запустите, npm installчтобы установить зависимости, npm testесли у вас есть тесты и, наконец,NODE_ENV=production node server.js

Некоторые недавние слайды, которые я считаю весьма полезными, которые также включают тему оберток, например, forever, можно найти здесь .

Умеренно серьезный
источник
Извините за такую ​​задержку с ответом. Я закончил с самим предложением выше, опробовав все возможные комбинации. Благодаря!
KBJ
5
Что делать, если я не хочу, чтобы npm загружал модули из Интернета. Вместо этого я хочу отправить все в посылке. Можно ли также отправить папку node_modules? Это работает? Причина, по которой я спрашиваю: мое приложение может работать в среде интрасети без подключения к Интернету.
Стефан
2
@Stefan Зависит от модулей, которые вы поставляете с ним. Поскольку некоторые модули, которые не являются чистым JS, необходимо сначала построить, может случиться так, что их перемещение в другую среду может сломать их. Мне еще не приходилось иметь дело с этим, но, возможно, использование кеша npm обеспечивает жизнеспособное решение, заполняя кеш полным списком пакетов, а затем устанавливая (и создавая) из него.
MildlySerious
89

Развертывать Node.jsприложения очень просто. В maven есть pom.xml. Связанное понятие в Node.jsis package.json. Вы можете указать свои зависимости от package.json. Вы также можете выполнить настройку среды package.json. Например, в среде разработки вы можете сказать, что

Я хочу запустить модульные тесты.

но в производстве;

Я хочу пропустить модульные тесты.

У вас есть локальные репозитории для maven в .m2папке. В Node.js есть node_modulesпапка под вашим проектом Node.js. Вы можете увидеть папки модуля с его названием.

Перейдем к gruntчасти этого ответа. Gruntэто диспетчер задач для ваших внешних ресурсов, html, javascript, css. Например, перед развертыванием вы можете минимизировать html, css, javascript даже изображения. Вы также можете добавить gruntфункции запуска задач package.json.

Если вы хотите взглянуть на пример приложения, вы можете найти приложение блога пример здесь . Проверьте структуру папок и package.jsonдля справки.

Для развертывания я предлагаю вам развертывание heroku для запускаемых приложений. Вы можете найти HOWTO здесь . Это простое развертывание на основе git.

На этапе выполнения проекта просто установите среду NODE_ENV=developmentи node app.js. Вот app.jsв вашем проекте.

Вот относительная концепция для java и nodejs;

  1. maven clean install => npm install
  2. .m2папка => node_modules(В папке проекта)
  3. mvn test=> npm test(тестовый раздел включен package.json)
  4. junit, powermock, ... => мокко , узел-блок , ...
  5. Spring MVC=> Express.JS
  6. pom.xml => package.json
  7. import package => require('module_name')
Хусейн БАБАЛ
источник
Очень полезно. Есть ли способ указать версию в package.json, чтобы свести к минимуму возможность поломки из-за изменений в зависимостях?
mikijov
2
@MikiJ, конечно, вы можете указать версию для модулей (зависимости). Семантическое управление версиями используется в package.json, вы можете увидеть здесь более подробную информацию
Hüseyin BABAL
Хорошая Java - Сравнение узлов. Большой!! Благодаря!!
Алехандро Тейшейра Муньос
Большой.!! Есть ли что-нибудь эквивалентное файлу войны на Java? Поскольку мы развернем только файлы классов вместо исходного файла, есть ли что-нибудь подобное в узле вместо развертывания целых файлов JS.
Mdumanoj 07
@ HüseyinBABAL твоя аналогия не совсем верна. потому что mvn clean installсоздает связанный файл .war, который можно легко развернуть на любом сервере в мире и java -jar *.warзапускать на нем. Но как я могу создать связанный файл для моего проекта узла !! и как я могу выполнить это на сервере !!
KNDheeraj
6
  1. Есть ли какой-либо стандартный формат / рекомендации по упаковке веб-приложений для узлов, созданных с использованием экспресс? (Есть ли аналогичные системы упаковки jar / war для приложений node?)

Да, спецификация пакетов CommonJS :

Эта спецификация описывает формат пакета CommonJS для распространения программ и библиотек CommonJS. Пакет CommonJS - это связная оболочка из набора модулей, кода и других ресурсов в единую форму. Он обеспечивает основу для удобной доставки, установки и управления компонентами CommonJS.

На ваш следующий вопрос:

2. Как мне развернуть его после упаковки? Станет ли он exe-файлом, поскольку он также является собственным контейнером?

Я поддерживаю предложение Хусейна о развертывании на Heroku для производства. Для разработки и постановки я использую Node-Appliance с VirtualBox и Amazon EC2 соответственно:

Эта программа берет машину Debian, созданную с помощью build-debian-cloud или Debian-VirtualBox-Appliance, и превращает ее в «устройство» Node.js, способное запускать приложение Node, развернутое через git.

Ваше веб-приложение не станет файлом exe.

Дэвид Браун
источник
1
Спасибо, что не сделали ничего, кроме простого ответа на вопрос Даггона.
monsto 03
6

Надеюсь, это может быть полезно для тех, кто ищет решение. Упаковка приложений Node js может быть выполнена с помощью команды "npm pack". Она создает zip-файл вашего приложения, который можно запускать в производственной / промежуточной среде.

Навин Кумар
источник
5

несколько способов приблизиться к этому:

  • Вставьте свой код в репозиторий Git, исключив все, что не является вашим кодом ( node_modules/**), затем загрузите его в свою промежуточную среду, запустите, npm installчтобы восстановить все зависимости

  • создайте из него пакет NPM, установите его через npmпромежуточную среду (это также должно позаботиться обо всех зависимостях)

  • вручную скопируйте / ssh файлы в промежуточную среду (это можно автоматизировать с помощью Grunt), чем восстановить ваши зависимости с помощьюnpm

dark_ruby
источник
2

Я использовал модуль zeit pkg. Он может создавать кроссплатформенные продукты для linux / win / macos. Фактически использовал его в продакшене и отлично работает без каких-либо проблем.

Он принимает все сценарии js и упаковывает их в один файл.

Я использовал его потому, что он помогает защитить ваш исходный код. Таким образом, в производственной среде клиента они будут иметь доступ к приложению, но не к исходному коду.

Также одним из преимуществ является то, что в производственной среде вам фактически не нужно, чтобы заказчик устанавливал node.js, поскольку двоичные файлы node также упаковываются внутри сборки.

https://www.npmjs.com/package/pkg

varad11
источник