Як встановити NODE_ENV на виробництво / розробку в OS X


Відповіді:


663

Перш ніж запустити додаток, це можна зробити в консолі,

export NODE_ENV=production

Або якщо ви знаходитесь у Windows, ви можете спробувати це:

SET NODE_ENV=production

або ви можете запустити додаток так:

NODE_ENV=production node app.js

Ви також можете встановити його у вашому js-файлі:

process.env.NODE_ENV = 'production';

Але я не пропоную це робити у вашому файлі виконання, оскільки відкрити VIM на своєму сервері та змінити його на виробництво непросто. Ви можете створити файл config.json у своєму каталозі, і кожен раз, коли ваша програма запускається, вона читає з неї та встановлює конфігурацію.


12
Це погана порада. Це буде складне налаштування process.env.NODE_ENVнадійно від самого додатка. Найкраще встановити змінну вашого середовища належним чином, як Даніель посилається нижче.
МК Сафі

15
Я прихильник NODE_ENVявного налаштування кожного разу, коли ви запускаєте додаток, як у другому прикладі ( NODE_ENV=production node app.js). Таким чином, ви потенційно можете вберегти себе від майбутнього підтягування волосся у випадку, якщо ви забудете встановити місцеве місце NODE_ENVназад development.
Джон

Зовсім не така блискуча. Кожен раз, коли ви запускаєте додаток, ви повинні додавати цей env var. Це смокче. Розміщене краще рішення нижче.
Лукас Лейсіс

2
Зверніться до npmjs.com/package/cross-env для простого кросплатформенного рішення. cross-env NODE_ENV=productionпрацює на windows та linux / mac.
AntonB

1
@Gleb NODE_ENV=production forever app.jsповинен працювати.
Фарид Нурі Нешат

102

в package.json:

{
  ...
  "scripts": {
    "start": "NODE_ENV=production node ./app"
  }
  ...
}

потім запустіть у терміналі:

npm start

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

38
@WeDoTDD про що ти говориш? Ці сценарії покликані використовуватись аналогічно тому, як працює файл makefile. Використовувати його як цей приклад або як ви вже згадували для запуску глотків - цілком розумний випадок використання. Для простих завдань я зараз навіть не використовую gulp і роблю все це в сценарії, набагато швидше налагодити роботу, і я дозволяю webpack виконувати ту роботу, яку раніше робив gulp.
Марко Грешак

15
@WTF - Що ти означає, що використовувати сценарії в package.json "погана практика"? Ось і суть сценаріїв: розділ, щоб поставити сценарії! Він ідеально діє і виключає потребу в глотці або бурчання. Все зроблено за допомогою команд та веб-пакетів.
ТетраДев

6
@WTF Використання скриптів фактично значно покращує узгодженість. Ви можете встановити стандартний набір команд, які будуть використовуватись у кількох проектах, які можуть не використовувати одні й ті ж базові сценарії збірки, бібліотеки тощо. Ви можете принаймні спробувати підкріпити свою точку з фактами та прикладами.
Льюїс Діамант

4
Введення NODE_ENV=productionв package.json не має особливого сенсу. Запуск npm startв розвитку буде запустити його у виробництво. Ви можете так само написати свій код, як ніби це завжди виробництво, оскільки ви завжди керуєте ним таким чином. Я вважаю, що це змушує інших модулів (наприклад, Express) працювати в режимі виробництва. Навіщо взагалі використовувати змінні середовища, якщо вони ніколи не змінюються?
Nateowami

66

Тут ніхто ще не згадував .env? Створіть .envфайл у корені програми, а потім require('dotenv').config()прочитайте значення. Легко змінюється, легко читається, кросова платформа.

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


1
Дивно, про це ніхто не згадує, найкраще рішення, на мою думку. Помістіть ім’я середовища в той самий файл з рештою змінних.
Асінус Рекс

2
Встановлення NODE_ENV у .env-файл не працюватиме. Дивіться це: github.com/motdotla/dotenv/isissue/328
Михайло Зеленський

Для мене налаштування "mode": "production"у .envфайлі спрацювало.
DarkLite1

46

export NODE_ENV=production це погане рішення, воно зникає після перезавантаження.

якщо ви більше не хочете турбуватися про цю змінну - додайте її до цього файлу:

/etc/environment

не використовуйте синтаксис експорту, просто напишіть (у новому рядку, якщо якийсь вміст уже є):

NODE_ENV=production

він працює після перезавантаження. Вам більше не доведеться повторно вводити експорт NODE_ENV = команда виробництва і просто використовувати вузол із усім, що вам завгодно - назавжди, pm2 ...

Для heroku:

heroku config:set NODE_ENV="production"

що насправді за замовчуванням.


2
Кошмар технічного обслуговування. А що з вікном, де у вас немає дозволів на / тощо?
Томас МакКейб

1
Я особисто використовую NODE_ENV=production gulp bundle-production-appдля створення готового сценарію для виробництва, на сервері NODE_ENV знаходиться в середовищі сервера, а в машині розробників його немає. У деяких машинах це кошмар, якщо він не встановлений, і ви очікуєте, що він буде встановлений завжди . У деяких ви очікуєте, що цього не буде, тому не додаєте. У будь-якому разі, роблячи користувальницькі інтерфейси, я даю зрозуміти, чи перебуває він у режимі розробки, тому у вас ніколи не виникає питання, увімкнено чи вимкнено. Якщо NODE_ENV є! == виробництво, то за вашим обличчям ви перебуваєте в іншому режимі, тож зовсім не кошмар. Все ясно, все добре.
Лукас Ліесіс

+1 за розмову про те, як зробити це збереженим. Цікаво, скільки людей встановили це лише на поточній сесії, думаючи, що це збережеться. А як щодо перезавантаження? Якщо ви хочете встановити його одразу, ви повинні поставити його /etc/environment та запустити export NODE_ENV=production?
Nateowami

24

Щоб не турбуватися, чи встановлюєте ви сценарії в Windows, Mac або Linux, встановіть пакет cross-env . Тоді ви можете легко використовувати свої сценарії, як-от так:

"scripts": {
    "start-dev": "cross-env NODE_ENV=development nodemon --exec babel-node -- src/index.js",
    "start-prod": "cross-env NODE_ENV=production nodemon --exec babel-node -- src/index.js"
}

Масивні реквізити розробникам цього пакету.

npm install --save-dev cross-env

22
heroku config:set NODE_ENV="production"

2
ах, це те, що мені було потрібно. ти приголомшливий
Connor Leech

5
NODE_ENV=productionтепер за замовчуванням в Heroku node.js розгортається.
sean

1
heroku - не єдине місце для розгортання
Pavan Katepalli


6

На OSX я рекомендую додати export NODE_ENV=developmentдо свого ~/.bash_profileта / або ~/.bashrcта / або ~/.profile.

Особисто я додаю цей запис до свого, ~/.bashrcа потім ~/.bash_profile ~/.profileімпортую вміст цього файлу, тож він узгоджується в різних середовищах.

Після внесення цих доповнень не забудьте перезапустити свій термінал, щоб вибрати налаштування.


2

Якщо ви на вікнах. Відкрийте свою cmd в правій папці, а потім спочатку

set node_env={your env name here}

натисніть клавішу Enter, тоді ви можете запустити свій вузол

node app.js

це розпочнеться з вашого налаштування env


1
не зникне він після перезавантаження? Не маю вікон, не можу спробувати себе.
Лукас Лейсіс

Якщо ви запитуєте про перезапуск вузла ні, він не зникне, поки ви повністю не закриєте командний рядок. Але якщо Windows Server перезапустить ofc, він зникне.
garenyondem

2
говорити про перезапуск ОС. Ось чому я краще шукаю інший спосіб зупинятися на питанні цього разу щоразу, коли встановлюються оновлення Windows або будь-який перезапуск, про цю проблему.
Лукас Лієсіс

2

Якщо ви використовуєте веб- пакет у своїй програмі, ви можете просто встановити його там, використовуючи DefinePlugin...

Так що в вашому pluginрозділі, встановіть NODE_ENV на production:

plugins: [
  new webpack.DefinePlugin({
    'process.env.NODE_ENV': '"production"',
  })
]

1

Щоб мати декілька середовищ, вам потрібні всі відповіді раніше (параметр NODE_ENV та експортувати його), але я використовую дуже простий підхід без необхідності нічого встановлювати. У свій package.json просто покладіть сценарій для кожної програми, яка вам потрібна, наприклад:

...
"scripts": {
    "start-dev": "export NODE_ENV=dev && ts-node-dev --respawn --transpileOnly ./src/app.ts",
    "start-prod": "export NODE_ENV=prod && ts-node-dev --respawn --transpileOnly ./src/app.ts"
  }
 ...

Потім, щоб запустити додаток, а не npm startвикористовуватиnpm run script-prod .

У коді можна отримати доступ до поточного середовища process.env.NODE_ENV .

Вуаля.


NODE_ENV повинен бути або "розвитком", або "виробництвом", зазначене вище не розпізнається стороннім кодом (хоча ви можете дивитись на process.env для цього)
Джон Culviner


0

Даніель має фантастичну відповідь, який є кращим підходом до правильного процесу розгортання (встановити та забути).

Для тих, хто використовує експрес. Ви можете використовувати grunt-express-сервер, який також фантастично. https://www.npmjs.org/package/grunt-express-server


0

Це може бути ймовірність, що ви зробили два екземпляри об'єкта секвелювання

наприклад: var con1 = new Sequelize (); var con2 = new Sequelize ();

ніж також відбудеться та сама помилка

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