สำหรับใช้ในสภาพแวดล้อม express.js ข้อเสนอแนะใด ๆ
สำหรับใช้ในสภาพแวดล้อม express.js ข้อเสนอแนะใด ๆ
คำตอบ:
ก่อนเรียกใช้แอปคุณสามารถทำได้ในคอนโซล
export NODE_ENV=production
หรือถ้าคุณอยู่ใน windows คุณสามารถลองนี้:
SET NODE_ENV=production
หรือคุณสามารถเรียกใช้แอปของคุณเช่นนี้:
NODE_ENV=production node app.js
คุณยังสามารถตั้งค่าในไฟล์ js ของคุณ:
process.env.NODE_ENV = 'production';
แต่ฉันไม่แนะนำให้ทำในไฟล์รันไทม์ของคุณเนื่องจากมันไม่ง่ายที่จะเปิด VIM ในเซิร์ฟเวอร์ของคุณและเปลี่ยนเป็นการใช้งานจริง คุณสามารถสร้างไฟล์ config.json ในไดเรกทอรีของคุณและทุกครั้งที่แอปของคุณรันมันจะอ่านจากมันและตั้งค่าการกำหนดค่า
process.env.NODE_ENV
ได้อย่างน่าเชื่อถือจากแอพเอง ควรตั้งค่าตัวแปรสภาพแวดล้อมให้ถูกต้องตามที่ Daniel เชื่อมโยงด้านล่าง
NODE_ENV
อย่างชัดเจนทุกครั้งที่คุณเรียกใช้แอปดังตัวอย่างที่สอง ( NODE_ENV=production node app.js
) วิธีการที่คุณอาจช่วยตัวเองจากอนาคตผมดึงในกรณีที่คุณลืมที่จะตั้งในท้องถิ่นของคุณกลับไปNODE_ENV
development
cross-env NODE_ENV=production
ทำงานบน windows และ linux / mac
NODE_ENV=production forever app.js
ควรทำงาน
ใน package.json:
{
...
"scripts": {
"start": "NODE_ENV=production node ./app"
}
...
}
จากนั้นเรียกใช้ใน terminal:
npm start
NODE_ENV=production
ใน package.json ไม่สมเหตุสมผลมาก การทำงานnpm start
ในการพัฒนาจะดำเนินการในการผลิต คุณอาจเขียนโค้ดของคุณราวกับว่ามันใช้งานได้ตลอดเวลาเนื่องจากคุณใช้งานในลักษณะนั้นเสมอ เหตุผลหนึ่งที่ฉันเห็นการทำเช่นนี้คือการบังคับให้โมดูลอื่น (เช่น Express) ทำงานในโหมดการผลิต เหตุใดจึงต้องใช้ตัวแปรสภาพแวดล้อมหากไม่เปลี่ยนแปลง
ยังไม่มีใครพูดถึง.env
ที่นี่หรือ ทำ.env
ไฟล์ในรูทแอปของคุณจากนั้นrequire('dotenv').config()
อ่านค่า เปลี่ยนแปลงได้ง่ายอ่านข้ามแพลตฟอร์มได้ง่าย
"mode": "production"
ใน.env
ไฟล์ทำงาน
export NODE_ENV=production
มันเป็นทางออกที่ไม่ดีมันจะหายไปหลังจากรีสตาร์ท
หากคุณไม่ต้องการกังวลเกี่ยวกับตัวแปรนั้นอีกต่อไป - เพิ่มลงในไฟล์นี้:
/etc/environment
อย่าใช้ไวยากรณ์การส่งออกเพียงแค่เขียน (ในบรรทัดใหม่ถ้ามีเนื้อหาอยู่แล้ว):
NODE_ENV=production
มันทำงานได้หลังจากรีสตาร์ท คุณจะไม่ต้องป้อนคำสั่งส่งออกอีกครั้งNODE_ENV =อีกต่อไปทุกที่และใช้โหนดกับสิ่งที่คุณต้องการ - ตลอดไป, pm2 ...
สำหรับ heroku:
heroku config:set NODE_ENV="production"
ซึ่งเป็นค่าเริ่มต้นจริง
NODE_ENV=production gulp bundle-production-app
เพื่อรวมสคริปต์พร้อมใช้งานการผลิตในเซิร์ฟเวอร์ NODE_ENV อยู่ในสภาพแวดล้อมของเซิร์ฟเวอร์และในเครื่อง dev ไม่มีอยู่ในนั้น ในเครื่องบางอย่างมันเป็นฝันร้ายถ้ามันไม่ได้ตั้งค่าและคุณคาดว่าจะมีมันติดตั้งเสมอ ในบางครั้งคุณคาดหวังว่าจะไม่ได้รับมันดังนั้นคุณจะไม่เพิ่ม อย่างไรก็ตามในขณะที่ทำ UIs ฉันจะทำให้ชัดเจนถ้าอยู่ในโหมดการพัฒนาดังนั้นคุณไม่เคยมีคำถามว่ามันเป็นหรือปิด หาก NODE_ENV คือ! == การผลิตอยู่ในใบหน้าของคุณว่าคุณอยู่ในโหมดอื่นดังนั้นจึงไม่ต้องฝันร้ายเลย ชัดเจนดีทั้งหมด
/etc/environment
และเรียกใช้export NODE_ENV=production
หรือไม่
เพื่อไม่ต้องกังวลว่าคุณกำลังเรียกใช้สคริปต์ของคุณบน 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
heroku config:set NODE_ENV="production"
NODE_ENV=production
ตอนนี้เป็นค่าเริ่มต้นใน Heroku node.js ปรับใช้
สำหรับ Windows Powershell ให้ใช้คำสั่งนี้
$env:NODE_ENV="production" ; node app.js
ใน OSX ฉันขอแนะนำให้เพิ่มexport NODE_ENV=development
ที่คุณ~/.bash_profile
และ / หรือและ~/.bashrc
/ หรือ~/.profile
ส่วนตัวฉันเพิ่มรายการนั้นลงในของฉัน~/.bashrc
แล้วมี~/.bash_profile
~/.profile
การนำเข้าเนื้อหาของไฟล์นั้นดังนั้นจึงสอดคล้องกับสภาพแวดล้อม
หลังจากทำการเพิ่มเติมเหล่านี้แล้วให้แน่ใจว่าได้รีสตาร์ทเครื่องของคุณเพื่อรับการตั้งค่า
หากคุณอยู่บน windows เปิด cmd ของคุณที่โฟลเดอร์ด้านขวาจากนั้นก่อน
set node_env={your env name here}
กด Enter จากนั้นคุณสามารถเริ่มโหนดของคุณด้วย
node app.js
มันจะเริ่มต้นด้วยการตั้งค่า env ของคุณ
หากคุณใช้webpackในแอปพลิเคชันของคุณคุณสามารถตั้งค่าได้โดยใช้DefinePlugin
...
ดังนั้นในplugin
ส่วนของคุณให้ตั้งค่าNODE_ENVเป็นproduction
:
plugins: [
new webpack.DefinePlugin({
'process.env.NODE_ENV': '"production"',
})
]
เพื่อให้มีหลายสภาพแวดล้อมคุณต้องการคำตอบทั้งหมดก่อนหน้า (พารามิเตอร์ 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 start
npm run script-prod
process.env.NODE_ENV
ในรหัสคุณสามารถเข้าถึงสภาพแวดล้อมในปัจจุบันด้วย
voila
Windows CMD -> set NODE_ENV=production
Windows Powershell -> $env:NODE_ENV="production"
MAC -> export NODE_ENV=production
Daniel มีคำตอบที่ยอดเยี่ยมซึ่งเป็นวิธีที่ดีกว่าสำหรับกระบวนการปรับใช้ (ตั้งค่าและลืม) ที่ถูกต้อง
สำหรับผู้ที่ใช้ด่วน คุณสามารถใช้ grunt-express-server ซึ่งยอดเยี่ยมเช่นกัน https://www.npmjs.org/package/grunt-express-server
อาจเป็นโอกาสที่คุณได้สร้างอินสแตนซ์ของวัตถุสองครั้ง
ตัวอย่างเช่น: var con1 = new Sequelize (); var con2 = ใหม่ Sequelize ();
กว่าข้อผิดพลาดเดียวกันก็จะเกิดขึ้น