Cara mengatur NODE_ENV ke produksi / pengembangan di OS X

Jawaban:

664

Sebelum menjalankan aplikasi Anda, Anda dapat melakukan ini di konsol,

export NODE_ENV=production

Atau jika Anda berada di windows Anda dapat mencoba ini:

SET NODE_ENV=production

atau Anda dapat menjalankan aplikasi Anda seperti ini:

NODE_ENV=production node app.js

Anda juga dapat mengaturnya di file js Anda:

process.env.NODE_ENV = 'production';

Tetapi saya tidak menyarankan untuk melakukannya di file runtime Anda, karena tidak mudah untuk membuka VIM di server Anda dan mengubahnya menjadi produksi. Anda dapat membuat file config.json di direktori Anda dan setiap kali aplikasi Anda berjalan, ia membaca dari situ dan mengatur konfigurasi.

Farid Nouri Neshat
sumber
12
Ini saran yang buruk. Ini akan menjadi pengaturan yang sulit process.env.NODE_ENVandal dari aplikasi itu sendiri. Paling baik setel variabel lingkungan Anda dengan benar seperti yang ditautkan Daniel di bawah.
MK Safi
15
Saya penggemar pengaturan NODE_ENVsecara eksplisit setiap kali Anda menjalankan aplikasi, seperti pada contoh kedua ( NODE_ENV=production node app.js). Dengan cara itu Anda berpotensi menyelamatkan diri dari beberapa penarik rambut di masa depan jika Anda lupa mengatur NODE_ENVkembali ke daerah Anda development.
Jon
Sama sekali tidak cemerlang. Setiap kali Anda menjalankan aplikasi, Anda harus menambahkan env var itu. Itu menyebalkan. Diposting solusi yang lebih baik di bawah ini.
Lukas Liesis
2
Lihat npmjs.com/package/cross-env untuk solusi lintas platform sederhana. cross-env NODE_ENV=productionbekerja di windows dan linux / mac.
AntonB
1
@ Gleb NODE_ENV=production forever app.jsharus bekerja.
Farid Nouri Neshat
102

di package.json:

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

kemudian jalankan di terminal:

npm start
Taro Alan
sumber
1
jangan mulai memasukkan banyak skrip ke dalam package.json, ini praktik buruk karena Anda memperkenalkan ketidakkonsistenan dan membunuh ketidakberdayaan dalam proyek Anda. Saya tahu banyak orang membuat skrip untuk menjalankan grunt atau tegukan tetapi jangan lakukan itu
PositiveGuy
38
@ WeDoTDD apa yang kamu bicarakan? Script ini dimaksudkan untuk digunakan mirip dengan cara makefile bekerja. Menggunakannya sebagai contoh ini atau seperti yang Anda sebutkan untuk menjalankan tegukan adalah kasus penggunaan yang sangat masuk akal. Untuk tugas-tugas sederhana sekarang saya bahkan tidak menggunakan tegukan dan melakukan semuanya di dalam skrip, itu jauh lebih cepat untuk mendapatkan pekerjaan dan saya membiarkan webpack melakukan pekerjaan yang dulu dilakukan oleh tegukan.
Marko Grešak
15
@ WPF - Apa maksudmu itu "praktik buruk" untuk menggunakan skrip di package.json? Itulah inti dari skrip: bagian, untuk meletakkan skrip! Ini sangat valid dan menghilangkan kebutuhan untuk menelan atau menggerutu. Semua dilakukan melalui perintah dan paket web.
TetraDev
6
@WTF Menggunakan skrip sebenarnya sangat meningkatkan konsistensi. Anda dapat mengatur seperangkat perintah standar yang akan digunakan di beberapa proyek yang mungkin tidak menggunakan skrip, pustaka, dan dasar bangunan yang sama. Anda setidaknya bisa mencoba mendukung pendapat Anda dengan fakta dan contoh.
Lewis Diamond
4
Menempatkan NODE_ENV=productiondi package.json tidak masuk akal. Menjalankan npm startdalam pengembangan akan menjalankannya dalam produksi. Anda mungkin menulis kode Anda seolah-olah itu selalu produksi, karena Anda selalu menjalankannya seperti itu. Salah satu alasan saya melihat hal ini adalah untuk memaksa modul lain (misalnya Express) untuk berjalan dalam mode produksi. Mengapa menggunakan variabel lingkungan sama sekali jika mereka tidak pernah berubah?
Nateowami
65

Belum ada yang menyebutkan .envdi sini? Buat .envfile di root aplikasi Anda, lalu require('dotenv').config()baca nilainya. Mudah diubah, mudah dibaca, lintas platform.

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

Thomas McCabe
sumber
1
Aneh tidak ada yang menyebutkannya, solusi terbaik menurut saya. Masukkan nama lingkungan ke file yang sama dengan variabel lainnya.
Asinus Rex
2
Mengatur NODE_ENV dalam file .env tidak akan berfungsi. Lihat ini: github.com/motdotla/dotenv/issues/328
Michael Zelensky
Bagi saya pengaturan "mode": "production"dalam .envfile berhasil.
DarkLite1
46

export NODE_ENV=production adalah solusi buruk, hilang setelah restart.

jika Anda tidak ingin khawatir tentang variabel itu lagi - tambahkan ke file ini:

/etc/environment

jangan gunakan sintaks ekspor, cukup tulis (di baris baru jika beberapa konten sudah ada di sana):

NODE_ENV=production

ini bekerja setelah restart. Anda tidak perlu memasukkan kembali ekspor NODE_ENV = perintah produksi lagi di mana saja dan cukup gunakan simpul dengan apa pun yang Anda inginkan - selamanya, pm2 ...

Untuk heroku:

heroku config:set NODE_ENV="production"

yang sebenarnya default.

Lukas Liesis
sumber
2
Mimpi buruk pemeliharaan. Bagaimana dengan kotak di mana Anda tidak memiliki izin ke / etc?
Thomas McCabe
1
Saya pribadi menggunakan NODE_ENV=production gulp bundle-production-appuntuk bundel skrip siap produksi, di server NODE_ENV berada di lingkungan server dan di mesin dev itu tidak ada. Dalam beberapa mesin itu mimpi buruk jika tidak disetel dan Anda berharap untuk selalu mengaturnya . Dalam beberapa, Anda berharap tidak memilikinya, jadi Anda tidak menambahkan. Ngomong-ngomong, saat melakukan UI saya membuatnya jelas jika sedang dalam mode pengembangan sehingga Anda tidak pernah memiliki pertanyaan apakah itu hidup atau mati. Jika NODE_ENV adalah! == produksi ada di wajah Anda bahwa Anda berada dalam mode lain, jadi tidak ada mimpi buruk sama sekali. Semua jelas, semuanya baik.
Lukas Liesis
+1 untuk berbicara tentang cara membuatnya bertahan. Saya bertanya-tanya berapa banyak orang yang menetapkannya hanya pada sesi saat ini dan berpikir itu akan bertahan. Bagaimana dengan sebelum restart? Jika Anda ingin mengaturnya segera, haruskah Anda meletakkannya /etc/environment dan menjalankannya export NODE_ENV=production?
Nateowami
24

Untuk tidak perlu khawatir apakah Anda menjalankan skrip pada Windows, Mac atau Linux, instal paket cross-env . Maka Anda dapat menggunakan skrip Anda dengan mudah, seperti:

"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"
}

Alat peraga masif untuk pengembang paket ini.

npm install --save-dev cross-env
Terkenal jahat
sumber
22
heroku config:set NODE_ENV="production"
david_adler
sumber
2
ahhh inilah yang saya butuhkan. Anda hebat
Connor Leech
5
NODE_ENV=productionsekarang menjadi default di Heroku node.js deploys.
sean
1
heroku bukan satu-satunya tempat untuk menyebarkan
Pavan Katepalli
9

Untuk Windows Powershell gunakan perintah ini

$env:NODE_ENV="production" ; node app.js
Harikrishnan
sumber
6

Di OSX saya sarankan menambahkan export NODE_ENV=developmentke ~/.bash_profiledan / atau ~/.bashrcdan / atau Anda ~/.profile.

Secara pribadi saya menambahkan entri itu ke saya ~/.bashrcdan kemudian ~/.bash_profile ~/.profilemengimpor konten file itu, sehingga konsisten di seluruh lingkungan.

Setelah melakukan penambahan ini, pastikan untuk me-restart terminal Anda untuk mengambil pengaturan.

Vincil Bishop
sumber
2

Jika Anda berada di windows. Buka cmd Anda di folder kanan lalu pertama

set node_env={your env name here}

tekan enter maka Anda dapat memulai simpul Anda dengan

node app.js

itu akan mulai dengan pengaturan env Anda

garenyondem
sumber
1
bukankah itu akan hilang setelah restart? Tidak punya windows, tidak bisa mencoba sendiri.
Lukas Liesis
Jika Anda bertanya tentang simpul mulai ulang tidak, simpul itu tidak akan hilang sampai Anda benar-benar menutup command prompt. Tetapi jika Windows Server restart ofc itu akan hilang.
garenyondem
2
berbicara tentang OS restart. Itu sebabnya saya lebih baik mencari cara lain untuk berhenti bertanya-tanya setiap kali pembaruan windows diinstal, atau sembarang restart, tentang masalah ini berulang kali.
Lukas Liesis
2

Jika Anda menggunakan webpack di aplikasi Anda, Anda bisa mengaturnya di sana, menggunakan DefinePlugin...

Jadi di pluginbagian Anda , atur NODE_ENV ke production:

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

Untuk memiliki beberapa lingkungan, Anda perlu semua jawaban sebelumnya (parameter NODE_ENV dan ekspor), tetapi saya menggunakan pendekatan yang sangat sederhana tanpa perlu menginstal apa pun. Di package.json Anda cukup letakkan skrip untuk setiap env yang Anda butuhkan, seperti ini:

...
"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"
  }
 ...

Kemudian, untuk memulai aplikasi alih-alih menggunakan npm startgunakan npm run script-prod.

Dalam kode Anda dapat mengakses lingkungan saat ini process.env.NODE_ENV.

Voila.

rmpt
sumber
NODE_ENV harus berupa "pengembangan" atau "produksi" di atas tidak dikenali oleh kode pihak ke-3 (walaupun Anda mungkin sedang melihat process.env untuk itu)
John Culviner
1

Windows CMD -> set NODE_ENV=production

Windows Powershell -> $env:NODE_ENV="production"

MAC -> export NODE_ENV=production

Janith Udara
sumber
0

Daniel memiliki jawaban yang fantastis yang merupakan pendekatan yang lebih baik untuk proses penyebaran yang tepat (diatur dan lupakan).

Bagi yang menggunakan express. Anda dapat menggunakan grunt-express-server yang juga fantastis. https://www.npmjs.org/package/grunt-express-server

Jesse
sumber
0

Mungkin saja Anda membuat dua instance objek sekuel

misalnya: var con1 = new Sequelize (); var con2 = Sequelize baru ();

Selain itu kesalahan yang sama akan terjadi

Prakhar Dixit
sumber