Cách đặt NODE_ENV thành sản xuất / phát triển trong OS X


Câu trả lời:


663

Trước khi chạy ứng dụng của bạn, bạn có thể làm điều này trong bảng điều khiển,

export NODE_ENV=production

Hoặc nếu bạn đang ở trong windows, bạn có thể thử điều này:

SET NODE_ENV=production

hoặc bạn có thể chạy ứng dụng của mình như thế này:

NODE_ENV=production node app.js

Bạn cũng có thể đặt nó trong tệp js của mình:

process.env.NODE_ENV = 'production';

Nhưng tôi không khuyên bạn nên làm điều đó trong tệp thời gian chạy của bạn, vì không dễ để mở VIM trong máy chủ của bạn và thay đổi nó thành sản xuất. Bạn có thể tạo một tệp config.json trong thư mục của mình và mỗi khi ứng dụng của bạn chạy, nó sẽ đọc từ đó và đặt cấu hình.


12
Đây là lời khuyên tồi. Nó sẽ là thiết lập khó khăn process.env.NODE_ENVđáng tin cậy từ chính ứng dụng. Tốt nhất đặt biến môi trường của bạn đúng như Daniel liên kết dưới đây.
MK Safi

15
Tôi là người hâm mộ cài đặt NODE_ENVrõ ràng mỗi khi bạn chạy ứng dụng, như trong ví dụ thứ hai ( NODE_ENV=production node app.js). Bằng cách đó bạn có khả năng tiết kiệm cho mình từ một số tương lai tóc kéo trong trường hợp bạn quên đặt địa phương của bạn NODE_ENVtrở lại development.
Jon

Không quá rực rỡ chút nào. Mỗi khi bạn chạy ứng dụng của mình, bạn phải thêm var đó. Đó là hút. Đăng giải pháp tốt hơn dưới đây.
Lukas Liesis

2
Tham khảo npmjs.com/package/cross-env để biết giải pháp đa nền tảng đơn giản. cross-env NODE_ENV=productionhoạt động trên windows và linux / mac.
AntonB

1
@Gleb NODE_ENV=production forever app.jsnên làm việc.
Farid Nouri Neshat

102

trong gói.json:

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

sau đó chạy trong terminal:

npm start

1
đừng bắt đầu đặt một loạt các tập lệnh trong gói.json, đó là một thực tế tồi vì bạn đưa ra sự không nhất quán và nó sẽ giết chết tính bất biến trong các dự án của bạn. Tôi biết rất nhiều người tạo ra các kịch bản để chạy grunt hoặc gulp nhưng không làm điều đó
positiveGuy

38
@WeDoTDD bạn đang nói về cái gì vậy? Các tập lệnh này được sử dụng tương tự như cách thức hoạt động của makefile. Sử dụng nó như ví dụ này hoặc như bạn đã đề cập để chạy gulp là trường hợp sử dụng hoàn toàn hợp lý. Đối với các tác vụ đơn giản, bây giờ tôi thậm chí không sử dụng gulp và thực hiện tất cả trong tập lệnh, nhanh hơn nhiều để mọi thứ hoạt động và tôi để webpack thực hiện công việc thường được thực hiện bởi gulp.
Marko Grešak

15
@WTF - Ý bạn là gì khi "sử dụng tập lệnh xấu" trong gói.json? Đó là điểm của các kịch bản: phần, để đặt các kịch bản! Nó hoàn toàn hợp lệ và loại bỏ sự cần thiết của gulp hoặc grunt. Tất cả được thực hiện thông qua lệnh và webpack.
TetraDev

6
@WTF Sử dụng tập lệnh thực sự cải thiện đáng kể tính nhất quán. Bạn có thể thiết lập một bộ lệnh tiêu chuẩn sẽ được sử dụng trên nhiều dự án có thể không sử dụng cùng một tập lệnh xây dựng cơ bản, thư viện, v.v. Ít nhất bạn có thể cố gắng sao lưu quan điểm của mình bằng các sự kiện và ví dụ.
Kim cương Lewis

4
Đưa NODE_ENV=productionvào gói.json không có ý nghĩa nhiều. Chạy npm starttrong phát triển sẽ chạy nó trong sản xuất. Bạn có thể viết mã của mình như thể nó luôn luôn sản xuất, vì bạn luôn chạy nó theo cách đó. Một lý do tôi thấy để làm điều này là buộc các mô-đun khác (ví dụ Express) chạy trong chế độ sản xuất. Tại sao lại sử dụng biến môi trường nếu chúng không bao giờ thay đổi?
Nateowami

65

Không ai đề cập .envở đây chưa? Tạo một .envtệp trong ứng dụng gốc của bạn, sau đó require('dotenv').config()và đọc các giá trị. Dễ dàng thay đổi, dễ đọc, đa nền tảng.

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


1
Lạ không ai nhắc đến nó, giải pháp tốt nhất theo ý kiến ​​của tôi. Đặt tên môi trường trong cùng một tệp với phần còn lại của các biến.
Asinus Rex

2
Đặt NODE_ENV trong tệp .env sẽ không hoạt động. Xem điều này: github.com/motdotla/dotenv/issues/328
Michael Zelensky

Đối với tôi thiết lập "mode": "production"trong các .envtập tin làm việc.
DarkLite1

46

export NODE_ENV=production là giải pháp xấu, nó biến mất sau khi khởi động lại.

nếu bạn không muốn lo lắng về biến đó nữa - hãy thêm nó vào tệp này:

/etc/environment

không sử dụng cú pháp xuất, chỉ viết (trong dòng mới nếu đã có sẵn một số nội dung):

NODE_ENV=production

nó hoạt động sau khi khởi động lại. Bạn sẽ không phải nhập lại xuất NODE_ENV = sản xuất lệnh nữa ở bất cứ đâu và chỉ cần sử dụng nút với bất cứ thứ gì bạn thích - mãi mãi, pm2 ...

Đối với heroku:

heroku config:set NODE_ENV="production"

mà thực sự là mặc định.


2
Cơn ác mộng bảo trì. Còn một hộp nơi bạn không có quyền / etc thì sao?
Thomas McCabe

1
Cá nhân tôi sử dụng NODE_ENV=production gulp bundle-production-appđể đóng gói kịch bản sẵn sàng sản xuất, trong máy chủ NODE_ENV nằm trong môi trường của máy chủ và trong máy dev thì không có ở đó. Trong một số máy, đó là cơn ác mộng nếu nó không được đặt và bạn mong muốn nó luôn được đặt . Trong một số, bạn hy vọng không có nó, vì vậy bạn không thêm. Dù sao, trong khi thực hiện UI tôi làm rõ nếu nó ở chế độ phát triển để bạn không bao giờ có câu hỏi nếu nó bật hay tắt. Nếu NODE_ENV là! == sản xuất thì bạn phải ở chế độ khác, vì vậy không có cơn ác mộng nào cả. Tất cả rõ ràng, tất cả đều tốt.
Lukas Liesis

+1 để nói về cách làm cho nó tồn tại. Tôi tự hỏi có bao nhiêu người đã đặt nó chỉ trong phiên hiện tại nghĩ rằng nó sẽ tồn tại. Còn trước khi khởi động lại thì sao? Nếu bạn muốn đặt nó ngay lập tức, bạn có nên đặt nó vào /etc/environment chạy export NODE_ENV=productionkhông?
Nateowami

24

Để không phải lo lắng liệu bạn đang chạy tập lệnh của mình trên Windows, Mac hay Linux, hãy cài đặt gói cross-env . Sau đó, bạn có thể sử dụng tập lệnh của mình một cách dễ dàng, như vậy:

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

Đạo cụ khổng lồ cho các nhà phát triển của gói này.

npm install --save-dev cross-env

22
heroku config:set NODE_ENV="production"

2
ahhh đây là những gì tôi cần. bạn thật tuyệt vời
Connor Leech

5
NODE_ENV=productionhiện là mặc định trong Heroku node.js triển khai.
sean

1
heroku không phải là nơi duy nhất để triển khai
Pavan Katepalli

9

Đối với Windows Powershell, hãy sử dụng lệnh này

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

6

Trên OSX, tôi khuyên bạn nên thêm export NODE_ENV=developmentvào ~/.bash_profilevà / hoặc ~/.bashrc/ hoặc ~/.profile.

Cá nhân tôi thêm mục đó vào của tôi ~/.bashrcvà sau đó có~/.bash_profile ~/.profile nhập nội dung của tệp đó, vì vậy nó phù hợp giữa các môi trường.

Sau khi thực hiện các bổ sung này, hãy chắc chắn khởi động lại thiết bị đầu cuối của bạn để nhận cài đặt.


2

Nếu bạn đang ở trên cửa sổ. Mở cmd của bạn ở thư mục bên phải, trước tiên

set node_env={your env name here}

nhấn enter sau đó bạn có thể bắt đầu nút của mình với

node app.js

nó sẽ bắt đầu với cài đặt env của bạn


1
nó sẽ không biến mất sau khi khởi động lại chứ? Đừng có cửa sổ, đừng thử bản thân mình.
Lukas Liesis

Nếu bạn hỏi về việc khởi động lại nút không, nó sẽ không biến mất cho đến khi bạn đóng hoàn toàn dấu nhắc lệnh. Nhưng nếu Windows Server khởi động lại thì nó sẽ biến mất.
garenyondem

2
nói về khởi động lại hệ điều hành. Đó là lý do tại sao tôi tốt hơn nên tìm một cách khác để ngừng tự hỏi mỗi khi cài đặt bản cập nhật Windows, hoặc chỉ cần khởi động lại, về vấn đề này nhiều lần.
Lukas Liesis

2

Nếu bạn sử dụng webpack trong ứng dụng của bạn, bạn chỉ có thể thiết lập nó ở đó, sử dụngDefinePlugin ...

Vì vậy, trong pluginphần của bạn , đặt NODE_ENV thành production:

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

1

Để có nhiều môi trường, bạn cần tất cả các câu trả lời trước đó (tham số NODE_ENV và xuất nó), nhưng tôi sử dụng một cách tiếp cận rất đơn giản mà không cần cài đặt bất cứ điều gì. Trong gói.json của bạn, chỉ cần đặt một tập lệnh cho mỗi env bạn cần, như thế này:

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

Sau đó, để khởi động ứng dụng thay vì sử npm startdụng npm run script-prod.

Trong mã bạn có thể truy cập vào môi trường hiện tại với process.env.NODE_ENV.

Voila.


NODE_ENV phải là "phát triển" hoặc "sản xuất" ở trên không được mã bên thứ 3 nhận ra (mặc dù bạn có thể đang xem process.env cho nó)
John Culviner

1

Windows CMD -> set NODE_ENV=production

Quyền hạn Windows -> $env:NODE_ENV="production"

MAC -> export NODE_ENV=production


0

Daniel có một câu trả lời tuyệt vời đó là cách tiếp cận tốt hơn cho quy trình triển khai (đặt và quên) chính xác.

Đối với những người sử dụng express. Bạn có thể sử dụng grunt-express-server cũng rất tuyệt vời. https://www.npmjs.org/package/grunt-express-server


0

Nó có thể là một cơ hội mà bạn đã thực hiện hai trường hợp của đối tượng sắp xếp lại

ví dụ: var con1 = new Sequelize (); var con2 = new Sequelize ();

cũng xảy ra lỗi tương tự

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.