Khởi động lại nút khi thay đổi tệp


172

Đối với một người đến từ nền tảng PHP, quá trình giết nút và bắt đầu lại sau mỗi lần thay đổi mã, có vẻ rất tẻ nhạt. Có cờ nào khi bắt đầu tập lệnh có nút để tự động khởi động lại nút khi thay đổi mã được lưu không?

Câu trả lời:


94

mô-đun mãi mãi có khái niệm về nhiều máy chủ node.js và có thể khởi động, khởi động lại, dừng và liệt kê các máy chủ hiện đang chạy. Nó cũng có thể xem để thay đổi tập tin và khởi động lại nút khi cần thiết.

Cài đặt nó nếu bạn chưa có nó:

npm install forever -g

Sau khi cài đặt nó, hãy gọi foreverlệnh: sử dụng -wcờ để xem tệp để thay đổi:

forever -w ./my-script.js

Ngoài ra, bạn có thể xem thư mục và bỏ qua các mẫu:

forever --watch --watchDirectory ./path/to/dir --watchIgnore *.log ./start/file

+1 mãi mãi là khá linh hoạt cho cả phát triển / thử nghiệm và sản xuất.
smertrios

1
Tôi đã cố gắng sử dụng mãi mãi để khởi động lại máy chủ ES2015 Expess.js / Webpack của mình bằng lệnh này, forever -c babel-node -w --watchDirectory ./server ./server/index.js nhưng thật đáng buồn là nó dường như gửi mãi mãi vào một cái đuôi và nó khởi động lại máy chủ quá thường xuyên, dẫn đến lỗi đã sử dụng cổng ... thêm một khoảng dừng sau khi khởi động lại?
Brian Di Palma

1
@BrianDiPalma Có lẽ bạn nên thêm một số mẫu bỏ qua, nếu có bất kỳ tệp thay đổi nào, chẳng hạn như nhật ký, trong thư mục theo dõi. Kiểm tra tài liệu để xem bạn có thể xác định độ trễ giữa các lần khởi động lại không.
hyde

1
@hyde Đó không phải là một sự chậm trễ được yêu cầu, đó là tùy chọn -thoặc killTreeđược yêu cầu, tôi đoán nút babel đã bị giết nhưng không phải máy chủ Express mà nó sinh ra.
Brian Di Palma

2
Forever JS có một lỗi trong Windows không giết được quá trình Node khi đoạn script bị chấm dứt. Phải tự
hủy

157

Một tùy chọn tốt là Node-giám sátNode.js Khởi động lại khi thay đổi tệp là bài viết hay về cách sử dụng nó, thường là:

 npm install supervisor -g

và sau khi di chuyển đến thư mục gốc của ứng dụng của bạn, hãy sử dụng như sau

 supervisor app.js

tương tự ở đây, vì bất kỳ lý do gì, như tôi đã sử dụng gật đầu trước đây mà không có vấn đề gì.
ZenMaster

1
Làm việc cho tôi quá. Tôi đã phải ghi đè tham số đồng hồ ký tự đại diện mặc định server.jsvì nó liên tục khởi động lại, điều này là do máy chủ của tôi xây dựng máy khách khi khởi động và do đó thay đổi các tệp. supervisor --watch server.js server.jsđã giải quyết nó
scipilot

2
Giám sát viên nút không được duy trì nữa.
aleung

Hoạt động như một bùa mê !!
JRichardsz

Yêu thích của tôi, làm mới khoảng thời gian để kiểm tra nếu tập tin được sửa đổi là gần như ngay lập tức!
NiCk Newman

100

Bạn nên nhìn vào một cái gì đó giống như gật đầu .

Nodemon sẽ xem các tập tin trong thư mục đã khởi động và nếu chúng thay đổi, nó sẽ tự động khởi động lại ứng dụng nút của bạn.

Thí dụ:

nodemon ./server.js localhost 8080

hoặc đơn giản

nodemon server

Bất kỳ ý tưởng tại sao Node yêu cầu khởi động lại để thực hiện thay đổi mã? Và tại sao các máy chủ khác (như Apache / PHP) không yêu cầu khởi động lại?
maverick

2
@ dk49 vì các tập lệnh PHP trong trường hợp đó được bắt đầu cho mọi yêu cầu đến và dừng lại sau khi chúng tạo xong trang.
Daerdemandt

@Daerdemandt cảm ơn vì đã chia sẻ điều đó..nhưng tôi vẫn không hiểu tại sao máy chủ (trên bất kỳ nền tảng nào) cần phải khởi động và dừng lại? Có phải vì nó duy trì bộ đệm của các tập tin (phản hồi)? Tôi nghĩ rằng máy chủ sẽ tải các tệp từ đĩa tại thời điểm yêu cầu, xử lý nó và sau đó gửi phản hồi. Tôi chưa quen với lập trình phía máy chủ.
maverick

Bạn có thể / bạn nên sử dụng gật đầu trong môi trường sản xuất?
JoeTidee

1
Không chắc chắn làm thế nào gật đầu vẫn giữ ngày hôm nay (vì điều này đã trở lại vào năm 2012), nhưng vì lý do bảo mật, tôi không chắc chắn tôi sẽ muốn máy chủ của mình khởi động lại trên prod mỗi khi thay đổi tệp. Một cái gì đó như pm2 có thể phù hợp hơn cho môi trường sản xuất.
Menztrual

43

Các gói NPM khác nhau có sẵn để thực hiện công việc này dễ dàng.

Cho sự phát triển

Dành cho Sản xuất (với chức năng mở rộng như phân cụm, triển khai từ xa, v.v.)

Có thể tìm thấy sự so sánh giữa Forever, pm2 và StrongLoop trên trang web của StrongLoop .


3
@ 2019 gật đầu dường như là một trong 4 tùy chọn phát triển vẫn được duy trì.
mvermand

1
@mvermand Vâng, gần đây không có bản phát hành mới nào được phát hành cho một trong số họ ngoại trừ gật đầu. Đối với sản xuất, PM2 vẫn được duy trì tốt.
Kay

16

Bạn cũng có thể thử gật đầu

Để cài đặt Nodemon

npm install -g nodemon

Để sử dụng Nodemon

Thông thường chúng ta bắt đầu chương trình nút như:

node server.js

Nhưng ở đây bạn phải làm như:

nodemon server.js

Aswer tốt và đơn giản !!
lesimoes

1
gật đầu có lỗi khó chịu. Đó là một thời gian lãng phí cho tôi.
kta

Câu trả lời này khác với câu trả lời của năm 2012 như thế nào?
Dan Dascalescu

9

nút-dev

node-dev là sự thay thế tuyệt vời cho cả gật đầu và giám sát viên cho các nhà phát triển muốn nhận thông báo gầm gừ (hoặc libnotify) trên máy tính để bàn của họ bất cứ khi nào máy chủ khởi động lại hoặc khi có lỗi hoặc thay đổi xảy ra trong tệp.

Cài đặt:

npm install -g node-dev

Sử dụng nút-dev, thay vì nút:

node-dev app.js

Thông báo về Thay đổi tập tin để máy chủ khởi động tự động

nhập mô tả hình ảnh ở đây

giao diện điều khiển ra

nhập mô tả hình ảnh ở đây


3

Tôi sử dụng runjsnhư:

runjs example.js

Gói được gọi là chỉ run

npm install -g run

2
không tốt hơn, chỉ là một lựa chọn khác
sp2danny

Câu trả lời này sẽ có giá trị hơn nhiều nếu nó giải thích lý do tại sao bạn sử dụng runvà cách so sánh với các lựa chọn thay thế hiện có. Chỉ cần bỏ một lựa chọn khác chỉ góp phần vào nghịch lý của sự lựa chọn. (May mắn là runđã không được cập nhật từ năm 2015, vì vậy bây giờ nó không có nhiều lựa chọn.)
Dan Dascalescu

0

Thực hiện theo các bước:

  1. npm install --save-dev nodemon

  2. Thêm hai dòng sau vào phần "script" của pack.json:

"start": "node ./bin/www",
"devstart": "nodemon ./bin/www"

như hình dưới đây:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node ./bin/www",
    "devstart": "nodemon ./bin/www"
}
  1. npm run devstart

https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/sk MP_website


Chà, về cơ bản nó là câu trả lời giống như câu trả lời năm 2012 , nhưng hiện diện với nhiều "ma thuật" hơn xung quanh nó. Nhưng bản chất của câu trả lời là "sử dụng gật đầu". Việc thiết lập lại là tiếp tuyến. Và nó được định dạng kém, nhưng tôi thấy David đã sửa nó, vì vậy tôi sẽ hoàn tác lại.
Dan Dascalescu
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.