Як упакувати та розгорнути веб-додаток Node.js + express?


83

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

Я з світу Java, і там ми створюємо банки для багаторазових бібліотек та пакетів war / ear для веб-додатків, які розгортаються в контейнері сервлетів. Тепер у цьому випадку, оскільки сам node.js також виступає як веб-контейнер, як упакувати свій веб-додаток?

  1. Чи існує якийсь стандартний формат / вказівки щодо веб-сайтів пакувальних вузлів, побудованих за допомогою Express? (Чи існують подібні системи упаковки jar / war для додатків вузлів?)
  2. Як розгорнути його після упаковки? Чи стане він exe, оскільки це також власний контейнер?

PS: На даний момент я думаю просто скопіювати всі необхідні вихідні файли у проміжне середовище та запустити команди npm, щоб завантажити всі залежності на цій машині, а потім використовувати 'назавжди' або інший механізм для запуску мого server.js. (Крім того, додайте якийсь моніторинг, на всякий випадок, якщо додаток аварійно завершить роботу і назавжди вийде з ладу). Я не впевнений, що це правильний шлях? Я впевнений, що повинен бути якийсь стандартизований спосіб вирішення цієї проблеми.


Для моїх java-проектів ми використовуємо Maven як інструмент побудови / розгортання. У минулому я маю досвід роботи навіть з мурахою. Я дивився на Grunt для Node.js, але все, що я міг зрозуміти з його завдань, було те, що він виконує завдання попередньої обробки (наприклад, мініфікація, concat, JSHint тощо), він нічого не згадував про упаковку програми, а потім сказав встановити у сховище (наприклад, як це робить maven).
KBJ

Відповіді:


44

Не існує стандартизованого шляху, але ви на правильному шляху. Якщо ви package.jsonоновлені та доглянуті, ви можете просто скопіювати / заархівувати / клонувати каталог вашої програми у виробничу систему, за винятком node_modules.

У вашій виробничій системі запустіть, npm installщоб встановити свої залежності, npm testякщо у вас є тести та, нарештіNODE_ENV=production node server.js

Деякі нещодавні слайди, які я вважав цілком корисними, які також включають тему обгортки, як назавжди, можна знайти тут .


Вибачте за таку затримку відповіді. Я закінчив із вищезазначеною пропозицією, спробувавши всі можливі комбінації. Дякую!
KBJ

4
Що робити, якщо я не хочу, щоб npm завантажував модулі з Інтернету. Натомість я хочу відправити все, що знаходиться в упаковці. Чи можна також доставити папку node_modules? Це працює? Причиною, з якою я запитую, є: Моя програма може працювати в середовищі інтрамережі без підключення до Інтернету.
Стефан

2
@Stefan Залежить від модулів, які ви з ним постачаєте. Оскільки спочатку потрібно побудувати деякі модулі, які не є чистою JS, можливо, переміщення їх в інше середовище може їх зламати. Мені ще не доводилося з цим стикатися, але, можливо, використання кешу npm забезпечує життєздатне рішення, заповнюючи кеш повним списком пакетів, а потім встановлюючи (та будуючи) з нього.
MildlySerious

89

Розгортання Node.jsпрограм - це дуже проста справа. У Maven є pom.xml. Пов'язане поняття в Node.jsis package.json. Ви можете вказати свої залежності на package.json. Ви також можете зробити налаштування навколишнього середовища на package.json. Наприклад, у середовищі dev ви можете це сказати

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

але на виробництві;

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

У вас є локальні сховища для 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. .m2folder => 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, звичайно, ви можете вказати версію для модулів (залежностей). Семантичне керування версіями використовується в
пакеті.json,

Хороша Java - Порівняння вузлів. Чудово !! Дякую!!
Alejandro Teixeira Muñoz

Чудово. !! Чи є щось еквівалентне файлу війни в Java? Оскільки ми розгортали б лише файли класів замість вихідного файлу, чи є щось подібне у node замість того, щоб розгортати цілі файли JS.
Мдуманой

@ HüseyinBABAL Ваша аналогія не зовсім правильна. оскільки mvn clean installстворює пакетний .war-файл, який можна легко розгорнути на будь-якому сервері світу та виконати java -jar *.warна сервері. Але як я можу створити пакетний файл для мого проекту вузла !! і як я можу це виконати на сервері !!
KNDheeraj

6
  1. Чи існує якийсь стандартний формат / вказівки щодо веб-сайтів пакувальних вузлів, побудованих за допомогою Express? (Чи існують подібні системи упаковки jar / war для додатків вузлів?)

Так, специфікація пакетів 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
Дякуємо, що не зробили нічого іншого, як просто відповісти на даггонне питання.
монсто

6

Сподіваюся, це може бути корисним для тих, хто шукає рішення. Упаковка програм Node js може бути виконана за допомогою команди "npm pack". Це створює zip-файл вашої програми, який можна запустити у виробничому / проміжному середовищі.


5

кілька способів підійти до цього:

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

  • створити з нього пакет NPM, встановити його npmу своєму проміжному середовищі (це також повинно подбати про всі залежності)

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


2

Я використовував модуль Zeit pkg. Він може створювати крос-платформні результати для Linux / win / macos. Насправді використовував його у виробництві і працює без проблем.

Він приймає всі скрипти js і упаковує їх в один файл.

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

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

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

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