วิธีตั้งค่า NODE_ENV เป็นผลิต / พัฒนาใน OS X


322

สำหรับใช้ในสภาพแวดล้อม express.js ข้อเสนอแนะใด ๆ


สำหรับโซลูชันที่มีหลายแพลตฟอร์มคุณสามารถค้นหาคำตอบstackoverflow.com/a/57509175/11127383
Daniel Danielecki

คำตอบ:


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ได้อย่างน่าเชื่อถือจากแอพเอง ควรตั้งค่าตัวแปรสภาพแวดล้อมให้ถูกต้องตามที่ Daniel เชื่อมโยงด้านล่าง
MK Safi

15
ฉันเป็นแฟนของการตั้งค่าNODE_ENVอย่างชัดเจนทุกครั้งที่คุณเรียกใช้แอปดังตัวอย่างที่สอง ( NODE_ENV=production node app.js) วิธีการที่คุณอาจช่วยตัวเองจากอนาคตผมดึงในกรณีที่คุณลืมที่จะตั้งในท้องถิ่นของคุณกลับไปNODE_ENV development
Jon

ไม่ยอดเยี่ยมเลย ทุกครั้งที่คุณเรียกใช้แอพคุณจะต้องเพิ่ม env var ที่ดูด โพสต์ทางออกที่ดีกว่าด้านล่าง
Lukas Liesis

2
อ้างถึงnpmjs.com/package/cross-envสำหรับโซลูชันข้ามแพลตฟอร์มที่เรียบง่าย cross-env NODE_ENV=productionทำงานบน windows และ linux / mac
AntonB

1
@Gleb NODE_ENV=production forever app.jsควรทำงาน
Farid Nouri Neshat

102

ใน package.json:

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

จากนั้นเรียกใช้ใน terminal:

npm start

1
อย่าเริ่มวางสคริปต์จำนวนมากไว้ใน package.json มันเป็นการปฏิบัติที่ไม่ดีเพราะคุณแนะนำความไม่สอดคล้องกันและทำให้โครงการของคุณไม่สามารถฆ่าได้ ฉันรู้ว่าผู้คนจำนวนมากสร้างสคริปต์เพื่อทำเสียงฮึดฮัดหรืออึก แต่ไม่ทำอย่างนั้น
PositiveGuy

38
@ WeDoTDD คุณกำลังพูดถึงอะไร สคริปต์เหล่านี้มีจุดประสงค์เพื่อใช้คล้ายกับวิธีการทำงานของ makefile การใช้มันเป็นตัวอย่างนี้หรือตามที่คุณบอกว่าใช้ gulp เป็นกรณีการใช้งานที่สมเหตุสมผล สำหรับงานง่าย ๆ ตอนนี้ฉันไม่ได้ใช้อึกและทำทุกอย่างภายในสคริปต์มันเร็วกว่ามากในการทำให้สิ่งต่าง ๆ ทำงานได้และฉันปล่อยให้ webpack ทำงานซึ่งเคยทำโดยอึก
Marko Grešak

15
@WTF - คุณหมายถึง "การปฏิบัติที่ไม่ดี" ในการใช้สคริปต์ใน package.json หมายความว่าอย่างไร นั่นคือจุดของสคริปต์: ส่วนเพื่อใส่สคริปต์! มันถูกต้องสมบูรณ์และไม่จำเป็นต้องอึกหรือเสียงฮึดฮัด ทำผ่านคำสั่งและ webpack
TetraDev

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
แปลกไม่มีใครพูดถึงมันทางออกที่ดีที่สุดในความคิดของฉัน ใส่ชื่อสภาพแวดล้อมในไฟล์เดียวกันพร้อมกับตัวแปรที่เหลือ
Asinus Rex

2
การตั้งค่า NODE_ENV ในไฟล์. env จะไม่ทำงาน ดูสิ่งนี้: github.com/motdotla/dotenv/issues/328
Michael Zelensky

สำหรับฉันการตั้งค่า"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
การบำรุงรักษาฝันร้าย แล้วกล่องที่คุณไม่มีสิทธิ์ให้ / etc ล่ะ?
โทมัส McCabe

1
ฉันเองใช้NODE_ENV=production gulp bundle-production-appเพื่อรวมสคริปต์พร้อมใช้งานการผลิตในเซิร์ฟเวอร์ NODE_ENV อยู่ในสภาพแวดล้อมของเซิร์ฟเวอร์และในเครื่อง dev ไม่มีอยู่ในนั้น ในเครื่องบางอย่างมันเป็นฝันร้ายถ้ามันไม่ได้ตั้งค่าและคุณคาดว่าจะมีมันติดตั้งเสมอ ในบางครั้งคุณคาดหวังว่าจะไม่ได้รับมันดังนั้นคุณจะไม่เพิ่ม อย่างไรก็ตามในขณะที่ทำ UIs ฉันจะทำให้ชัดเจนถ้าอยู่ในโหมดการพัฒนาดังนั้นคุณไม่เคยมีคำถามว่ามันเป็นหรือปิด หาก NODE_ENV คือ! == การผลิตอยู่ในใบหน้าของคุณว่าคุณอยู่ในโหมดอื่นดังนั้นจึงไม่ต้องฝันร้ายเลย ชัดเจนดีทั้งหมด
Lukas Liesis

+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
อ่านี่คือสิ่งที่ฉันต้องการ คุณยอดเยี่ยม
คอนเนอร์ปลิง

5
NODE_ENV=productionตอนนี้เป็นค่าเริ่มต้นใน Heroku node.js ปรับใช้
ฌอน

1
heroku ไม่ได้เป็นสถานที่เดียวที่จะปรับใช้
Pavan Katepalli


6

ใน OSX ฉันขอแนะนำให้เพิ่มexport NODE_ENV=developmentที่คุณ~/.bash_profileและ / หรือและ~/.bashrc / หรือ~/.profile

ส่วนตัวฉันเพิ่มรายการนั้นลงในของฉัน~/.bashrcแล้วมี~/.bash_profile ~/.profileการนำเข้าเนื้อหาของไฟล์นั้นดังนั้นจึงสอดคล้องกับสภาพแวดล้อม

หลังจากทำการเพิ่มเติมเหล่านี้แล้วให้แน่ใจว่าได้รีสตาร์ทเครื่องของคุณเพื่อรับการตั้งค่า


2

หากคุณอยู่บน windows เปิด cmd ของคุณที่โฟลเดอร์ด้านขวาจากนั้นก่อน

set node_env={your env name here}

กด Enter จากนั้นคุณสามารถเริ่มโหนดของคุณด้วย

node app.js

มันจะเริ่มต้นด้วยการตั้งค่า env ของคุณ


1
จะไม่หายไปหลังจากรีสตาร์ทหรือไม่ ไม่มี windows ลองด้วยตัวเองไม่ได้
Lukas Liesis

หากคุณกำลังถามเกี่ยวกับการรีสตาร์ทโหนดจะไม่หายไปจนกว่าคุณจะปิดพรอมต์คำสั่งโดยสมบูรณ์ แต่ถ้า Windows Server รีสตาร์ท ofc มันจะหายไป
garenyondem

2
พูดคุยเกี่ยวกับระบบปฏิบัติการรีสตาร์ท นั่นเป็นเหตุผลที่ฉันควรหาวิธีอื่นที่ดีกว่าที่จะหยุดสงสัยว่าทุกครั้งที่มีการติดตั้งการอัปเดต windows หรือเพียงแค่รีสตาร์ทใด ๆ เกี่ยวกับปัญหานี้ซ้ำแล้วซ้ำอีก
Lukas Liesis

2

หากคุณใช้webpackในแอปพลิเคชันของคุณคุณสามารถตั้งค่าได้โดยใช้DefinePlugin...

ดังนั้นในpluginส่วนของคุณให้ตั้งค่าNODE_ENVเป็นproduction:

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

1

เพื่อให้มีหลายสภาพแวดล้อมคุณต้องการคำตอบทั้งหมดก่อนหน้า (พารามิเตอร์ NODE_ENV และส่งออก) แต่ฉันใช้วิธีการที่ง่ายมากโดยไม่จำเป็นต้องติดตั้งอะไร ใน package.json ของคุณเพียงแค่ใส่สคริปต์สำหรับแต่ละ env ที่คุณต้องการเช่นนี้

...
"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 startnpm run script-prod

process.env.NODE_ENVในรหัสคุณสามารถเข้าถึงสภาพแวดล้อมในปัจจุบันด้วย

voila


NODE_ENV ควรเป็น "การพัฒนา" หรือ "การผลิต" ข้างต้นไม่ได้รับการยอมรับโดยรหัสบุคคลที่สาม (แม้ว่าคุณอาจกำลังมองหาที่กระบวนการนี้เพื่อมัน)
John Culviner


0

Daniel มีคำตอบที่ยอดเยี่ยมซึ่งเป็นวิธีที่ดีกว่าสำหรับกระบวนการปรับใช้ (ตั้งค่าและลืม) ที่ถูกต้อง

สำหรับผู้ที่ใช้ด่วน คุณสามารถใช้ grunt-express-server ซึ่งยอดเยี่ยมเช่นกัน https://www.npmjs.org/package/grunt-express-server


0

อาจเป็นโอกาสที่คุณได้สร้างอินสแตนซ์ของวัตถุสองครั้ง

ตัวอย่างเช่น: var con1 = new Sequelize (); var con2 = ใหม่ Sequelize ();

กว่าข้อผิดพลาดเดียวกันก็จะเกิดขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.