Làm cách nào để tự động tải lại các tệp trong Node.js?


444

Bạn có ý tưởng nào về cách tôi có thể tự động tải lại các tệp trong Node.js không? Tôi mệt mỏi vì phải khởi động lại máy chủ mỗi khi tôi thay đổi một tập tin. Rõ ràng require()chức năng của Node.js không tải lại các tệp nếu chúng đã được yêu cầu, vì vậy tôi cần phải làm một cái gì đó như thế này:

var sys     = require('sys'), 
    http    = require('http'),
    posix   = require('posix'),
    json    = require('./json');

var script_name = '/some/path/to/app.js';
this.app = require('./app').app;

process.watchFile(script_name, function(curr, prev){
    posix.cat(script_name).addCallback(function(content){
        process.compile( content, script_name );
    });
});

http.createServer(this.app).listen( 8080 );

Và trong tệp app.js tôi có:

var file = require('./file');
this.app = function(req, res) { 
    file.serveFile( req, res, 'file.js');  
}

Nhưng điều này cũng không hoạt động - tôi gặp lỗi trong process.compile()tuyên bố rằng 'yêu cầu' không được xác định. process.compileđang trốn tránh app.js , nhưng không có manh mối nào về toàn cầu node.js.


4
Bạn biết rằng bạn chỉ có thể chạy mã này theo từng yêu cầu:Object.keys(require.cache).forEach(function(key) { delete require.cache[key]; });
Tháp

Câu trả lời:


562

Một thay thế tốt, cập nhật supervisornodemon:

Theo dõi mọi thay đổi trong ứng dụng node.js của bạn và tự động khởi động lại máy chủ - hoàn hảo để phát triển

Để sử dụng nodemon:

$ npm install nodemon -g
$ nodemon app.js

2
và nếu bạn muốn sử dụng nó trong Nitrous.io - $ nodemon -L yourfile.js(giải thích đầy đủ tại coderwall.com/p/aqxl_q )
drzaus

3
Nhưng trong trường hợp này, nó cũng khởi động lại quá trình máy chủ.
Filipe

@Filipe, bạn nói đúng. Tôi được chuyển hướng để đăng nhập lại. Tôi muốn nó chỉ tải mô-đun sửa đổi cụ thể.
ar2015

7
automatically restart the server - perfect for developmentlà quá nhiều cường điệu. Máy chủ tải lại có thể có nghĩa là đăng nhập vào các dịch vụ phụ trợ, mất nhiều thời gian trong trường hợp của tôi. "Hoàn hảo cho sự phát triển" sẽ giống như các lớp tải lại nóng trong khi tiến trình đang chạy trong bộ nhớ mà không làm mất trạng thái của studio android khi bạn thay đổi mã nguồn.
Nurettin

2
sử dụng npm install [--save-dev | -D] nodemonđể giới hạn cài đặt trong phạm vi dự án.
chủ đề

312

giám sát nút là tuyệt vời

sử dụng để khởi động lại khi lưu:

npm cài đặt giám sát -g
giám sát app.js

bởi isaacs - http://github.com/isaacs/node-supervisor


3
npm cài đặt -g giám sát. Nó nên được cài đặt trên toàn cầu.
Kamal Reddy

Trên OSx 10.2.8, tôi đã phải chạy nó với sudo
Timopheym

2
Phải chạy nó như thế này trong Windows:"C:\Program Files\nodejs\node.exe" C:\Users\Mark\AppData\Roaming\npm\node_modules\supervisor\lib\cli-wrapper.js app.js
mpen

1
không có -g hoặc sudo tại ứng dụng root : npm install supervisor, node node_modules/supervisor/lib/cli-wrapper.js app.js(Tôi có cài đặt Node không root)
h-kippo

1
@Mark Điều này có nghĩa là nút không nằm trong của bạnPATH
Blaise

87

tôi tìm thấy một cách đơn giản:

delete require.cache['/home/shimin/test2.js']

7
Điều này thật tuyệt nếu bạn muốn tải lại các thư viện bên ngoài mà không cần khởi động lại ứng dụng - trong trường hợp của tôi, bot IRC.
Michelle Tilley

Thật tuyệt vời! Vì vậy, đơn giản và làm việc rất tốt. Bất cứ khi nào có yêu cầu đến, tôi chỉ mở ra một loạt các tệp không giữ trạng thái.
vaughan

16
delete require.cache[require.resolve('./mymodule.js')]; giải quyết thỏa thuận với các đường dẫn thực
Eduardo

Điều này có an toàn để làm hoặc được coi là "thực hành xấu" hay "chỉ phát triển" không?
vui vẻ

2
@jocull Tôi không nghĩ nó an toàn, vì nó có thể tạo lại các lớp và chức năng hoặc bất kỳ xuất khẩu nào, dẫn đến các tham chiếu khác nhau khi so sánh với===
Kroltan

20

Nếu ai đó vẫn đến câu hỏi này và muốn giải quyết nó chỉ bằng các mô-đun chuẩn, tôi đã làm một ví dụ đơn giản:

var process = require('process');
var cp = require('child_process');
var fs = require('fs');

var server = cp.fork('server.js');
console.log('Server started');

fs.watchFile('server.js', function (event, filename) {
    server.kill();
    console.log('Server stopped');
    server = cp.fork('server.js');
    console.log('Server started');
});

process.on('SIGINT', function () {
    server.kill();
    fs.unwatchFile('server.js');
    process.exit();
});

Ví dụ này chỉ dành cho một tệp (server.js), nhưng có thể được điều chỉnh cho nhiều tệp bằng cách sử dụng một mảng tệp, vòng lặp for để lấy tất cả tên tệp hoặc bằng cách xem thư mục:

fs.watch('./', function (event, filename) { // sub directory changes are not seen
    console.log(`restart server`);
    server.kill();
    server = cp.fork('server.js');    
})

Mã này được tạo cho API Node.js 0.8, nó không phù hợp với một số nhu cầu cụ thể nhưng sẽ hoạt động trong một số ứng dụng đơn giản.

CẬP NHẬT: Đây chức năng được thực hiện trong mô-đun của tôi đơn giản hơn , GitHub repo


1
Đây là một giải pháp tuyệt vời và đơn giản. Tôi chỉ sử dụng nó cho một bot được cho là tự cập nhật từ git khi được người điều hành nói như vậy. Vấn đề là một khi bạn đã ở trong ứng dụng, bạn không thể tự khởi động lại. Tuy nhiên, tôi có thể sử dụng phương pháp của bạn để sinh ra một thể hiện của bot và xem một dotfile. Bot sau đó tự cập nhật, chạm vào dotfile và sẽ được trình khởi động tự động khởi động lại. Tuyệt vời!
Fred

@Fred Tôi rất vui khi nghe điều này :) Tôi sẽ triển khai giải pháp này trong một mô-đun, tôi đoán sớm, tôi có thêm một số ý tưởng làm thế nào để mở rộng chức năng của nó
micnic

Nếu watchkhông cần tập tin , tải lại có thể được thực hiện mà không cần fs, bằng cách nghe tín hiệu khác nhau.
Vladimir Vukanac

18

gật đầu xuất hiện đầu tiên trong một tìm kiếm google, và nó dường như thực hiện thủ thuật:

npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.js

8

Có Node-Trình giám sát mà bạn có thể cài đặt bằng

npm install supervisor

xem http://github.com/isaacs/node-supervisor


2
Đó là nhiều hơn về việc khởi động lại máy chủ nếu nó gặp sự cố. giám sát nút cũng khởi động lại toàn bộ quá trình khi các tập tin đã xem đã bị thay đổi. Nó không phải là tải lại nóng theo nghĩa nghiêm ngặt.
nalply

Mặc dù không thực sự tải nóng, công cụ này thực sự hữu ích nếu bạn chỉ muốn mã tự động tải trong khi bạn đang phát triển để bạn không phải khởi động lại nút trong dòng lệnh sau mỗi thay đổi.
Derek Dahmer

7

Chỉnh sửa: Câu trả lời của tôi đã lỗi thời. Node.js là một công nghệ thay đổi rất nhanh.

Tôi cũng tự hỏi về việc tải lại các mô-đun. Tôi đã sửa đổi node.js và đã xuất bản nguồn tại Github tại nalply / node . Sự khác biệt duy nhất là chức năng require. Nó có một đối số thứ hai tùy chọn reload.

require(url, reload)

Để tải lại app.jstrong thư mục hiện tại sử dụng

app = require("./app", true);

Viết một cái gì đó như thế này và bạn có tự động tải lại:

process.watchFile(script_name, function(curr, prev) {
    module = reload(script_name, true);
});

Vấn đề duy nhất tôi thấy là biến module, nhưng tôi đang làm việc với nó.


7

nodemonlà một trong những tuyệt vời. Tôi chỉ cần thêm nhiều tham số để gỡ lỗi và xem các tùy chọn.

pack.json

  "scripts": {
    "dev": "cross-env NODE_ENV=development nodemon --watch server --inspect ./server/server.js"
  }

Lệnh: nodemon --watch server --inspect ./server/server.js

Trong khi:

--watch serverKhởi động lại ứng dụng khi thay đổi .js, .mjs, .coffee, .litcoffee, và .jsontập tin trongserver thư mục (bao gồm các thư mục con).

--inspect Cho phép gỡ lỗi từ xa.

./server/server.js Điểm vào.

Sau đó thêm cấu hình sau vào launch.json(Mã VS) và bắt đầu gỡ lỗi bất cứ lúc nào.

{
    "type": "node",
    "request": "attach",
    "name": "Attach",
    "protocol": "inspector",
    "port": 9229
}

Lưu ý rằng tốt hơn là cài đặt nodemonnhư phụ thuộc dev của dự án. Vì vậy, các thành viên trong nhóm của bạn không cần phải cài đặt nó hoặc nhớ các đối số lệnh, họ chỉ npm run devvà bắt đầu hack.

Xem thêm về nodemontài liệu: https://github.com/remy/nodemon#monitoring-multipl-directories


Globbing không được hỗ trợ cho các phiên bản gần đây của gật đầu (ít nhất là 1.19.0). Đơn giản chỉ cần sử dụng gật đầu - máy chủ watchwatch --inspect ./server/server.js thay thế.
Alex

Cảm ơn @Alex cho thông tin của bạn. Cập nhật câu trả lời.
Ninh Phạm

5

Có một chủ đề gần đây về chủ đề này trong danh sách gửi thư của node.js. Câu trả lời ngắn gọn là không, hiện tại không thể tự động tải lại các tệp yêu cầu, nhưng một số người đã phát triển các bản vá có thêm tính năng này.


1
+1 Có. Tôi tham gia thảo luận. Tôi thừa nhận rằng giải pháp của tôi quá đơn giản. Nó chỉ hoạt động nếu bản thân mô-đun nóng không yêu cầu thêm mô-đun. Giải pháp của Felix được cân nhắc kỹ lưỡng hơn nhưng vẫn còn nhiều tranh cãi nếu tự động tải lại thực sự thuộc về cốt lõi.
kể từ

5

Một giải pháp khác cho vấn đề này là sử dụng mãi mãi

Một khả năng hữu ích khác của Forever là nó có thể tùy chọn khởi động lại ứng dụng của bạn khi bất kỳ tệp nguồn nào đã thay đổi. Điều này giải phóng bạn khỏi phải khởi động lại thủ công mỗi lần bạn thêm một tính năng hoặc sửa lỗi. Để bắt đầu Mãi mãi trong chế độ này, hãy sử dụng cờ -w:

forever -w start server.js

Thật kỳ lạ với cờ -w ứng dụng express.js của tôi không sử dụng CSS.
Costa

5

nút-dev hoạt động tuyệt vời. chiềuinstall node-dev

Nó thậm chí còn đưa ra thông báo trên máy tính để bàn khi máy chủ được tải lại và sẽ đưa ra thành công hoặc lỗi trên tin nhắn.

bắt đầu ứng dụng của bạn trên dòng lệnh với:

node-dev app.js


3

Đây là một bài viết trên blog về Tải lại nóng cho Node. Nó cung cấp một nhánh github Node mà bạn có thể sử dụng để thay thế cài đặt Node của bạn để kích hoạt Tải lại nóng.

Từ blog:

var requestHandler = require('./myRequestHandler');

process.watchFile('./myRequestHandler', function () {
  module.unCacheModule('./myRequestHandler');
  requestHandler = require('./myRequestHandler');
}

var reqHandlerClosure = function (req, res) {
  requestHandler.handle(req, res);
}

http.createServer(reqHandlerClosure).listen(8000);

Bây giờ, bất cứ khi nào bạn sửa đổi myRequestHandler.js, đoạn mã trên sẽ chú ý và thay thế requestHandler cục bộ bằng mã mới. Mọi yêu cầu hiện có sẽ tiếp tục sử dụng mã cũ, trong khi mọi yêu cầu mới đến sẽ sử dụng mã mới. Tất cả mà không tắt máy chủ, từ chối bất kỳ yêu cầu nào, giết chết sớm mọi yêu cầu hoặc thậm chí dựa vào bộ cân bằng tải thông minh.


Điều duy nhất với giải pháp này là đó là một nhánh của phiên bản Node cũ hơn, do đó, nó sẽ phải được điều chỉnh và hợp nhất với phiên bản mới nhất trước khi sử dụng (trừ khi bạn không phiền khi sử dụng phiên bản Node cũ hơn).
Chetan

3

Tôi đang làm việc để tạo ra một "thứ" nút khá nhỏ có thể tải / hủy các mô-đun theo ý muốn (vì vậy, tức là bạn có thể khởi động lại một phần ứng dụng của mình mà không làm giảm toàn bộ ứng dụng). Tôi đang kết hợp một quản lý phụ thuộc (rất ngu ngốc), để nếu bạn muốn dừng một mô-đun, tất cả các mô-đun phụ thuộc vào đó cũng sẽ bị dừng.

Cho đến nay rất tốt, nhưng sau đó tôi vấp phải vấn đề làm thế nào để tải lại một mô-đun. Rõ ràng, người ta chỉ có thể loại bỏ mô-đun khỏi bộ đệm "yêu cầu" và hoàn thành công việc. Vì tôi không muốn thay đổi trực tiếp mã nguồn nút, tôi đã nghĩ ra một hack rất hack đó là: tìm kiếm trong ngăn xếp theo dõi cuộc gọi cuối cùng đến chức năng "yêu cầu", lấy tham chiếu đến trường "bộ đệm" của nó và..tốt, xóa tham chiếu đến nút:

    var args = arguments
    while(!args['1'] || !args['1'].cache) {
        args = args.callee.caller.arguments
    }
    var cache = args['1'].cache
    util.log('remove cache ' + moduleFullpathAndExt)
    delete( cache[ moduleFullpathAndExt ] )

Thậm chí dễ dàng hơn, thực sự:

var deleteCache = function(moduleFullpathAndExt) {
  delete( require.cache[ moduleFullpathAndExt ] )
}

Rõ ràng, điều này chỉ hoạt động tốt. Tôi hoàn toàn không biết ý nghĩa của những tranh luận đó ["1"] là gì, nhưng nó đang thực hiện công việc của nó. Tôi tin rằng các nút sẽ thực hiện một cơ sở tải lại một ngày nào đó, vì vậy tôi đoán rằng bây giờ giải pháp này cũng được chấp nhận. (btw. "điều" của tôi sẽ ở đây: https://github.com/cheng81/wirez , đến đó trong một vài tuần và bạn sẽ thấy những gì tôi đang nói về)


Tất nhiên là không đơn giản. Điều đó chỉ hoạt động nếu một cuộc gọi để yêu cầu trong ngăn xếp cuộc gọi. Oh, dễ dàng hack trên đầu trang của một hack: viết nội dung đó trong một kịch bản tạm thời và yêu cầu nó trong thời gian chạy. Đã làm nó, nó hoạt động..và nó thậm chí còn tự xóa khỏi bộ đệm
cheng81

Và thực sự nó đã dễ dàng hơn: xóa (allow.cache [moduleFullpathAndExt])
cheng81

Các mô-đun Node.js thực sự được bao bọc trong một hàm ẩn danh, đó là cách đóng gói mô-đun được thực hiện. Mỗi mô-đun thực sự trông như thế function (module, require) { /* your code */ }. Khi bạn tính đến điều này, arguments[1]chỉ vào require. Và vòng lặp while có sẵn cho các tình huống mà bạn gọi điều này từ bên trong một chức năng khác trong một mô-đun (nó chỉ đơn giản là đi lên hệ thống phân cấp chức năng và kiểm tra các giá trị đối số được truyền cho mỗi).
JK

3

Bạn có thể sử dụng gật đầu từ NPM . Và nếu bạn đang sử dụng trình tạo Express thì bạn có thể sử dụng lệnh này trong thư mục dự án của mình:

nodemon npm start

hoặc sử dụng chế độ Gỡ lỗi

DEBUG=yourapp:* nodemon npm start

bạn cũng có thể chạy trực tiếp

nodemon your-app-file.js

Hy vọng điều này giúp đỡ.


1

giải pháp tại: http://github.com/shimondoodkin/node-hot-reload

lưu ý rằng bạn phải tự chăm sóc các tài liệu tham khảo được sử dụng.

điều đó có nghĩa là nếu bạn đã làm: var x = quiries ('foo'); y = x; z = x.bar; và nóng tải lại nó.

điều đó có nghĩa là bạn phải thay thế các tham chiếu được lưu trữ trong x, y và z. trong chức năng gọi lại reaload nóng.

một số người nhầm lẫn tải lại nóng với tự động khởi động lại mô-đun nodejs-autorestart của tôi cũng có tích hợp khởi động để cho phép tự động khởi động khi khởi động. Nếu bạn có một ứng dụng nhỏ, tự động khởi động lại là tốt, nhưng khi bạn có một ứng dụng lớn, tải lại nóng thì phù hợp hơn. đơn giản vì tải lại nóng nhanh hơn.

Ngoài ra tôi thích mô-đun dòng chảy nút của tôi.


1

Không cần thiết phải sử dụng gật đầu hoặc các công cụ khác như thế. Chỉ cần sử dụng khả năng của IDE của bạn.

Có lẽ là một tốt nhất là IntelliJ WebStorm với tính năng tải lại nóng (máy chủ tự động và tải lại trình duyệt) cho Node.js .


1

Đây là một phương pháp công nghệ thấp để sử dụng trong Windows. Đặt cái này trong một tệp bó gọi là serve.bat:

@echo off

:serve
start /wait node.exe %*
goto :serve

Bây giờ thay vì chạy node app.jstừ shell cmd của bạn, hãy chạyserve app.js .

Điều này sẽ mở một cửa sổ shell mới chạy máy chủ. Tệp bó sẽ chặn (vì/wait ) cho đến khi bạn đóng cửa sổ shell, tại thời điểm đó, vỏ cmd ban đầu sẽ hỏi "Chấm dứt công việc bó (Y / N)?" Nếu bạn trả lời "N" thì máy chủ sẽ được khởi chạy lại.

Mỗi lần bạn muốn khởi động lại máy chủ, hãy đóng cửa sổ máy chủ và trả lời "N" trong vỏ cmd.


1

cấu trúc ứng dụng của tôi:

NodeAPP (folder)
   |-- app (folder)
      |-- all other file is here
   |-- node_modules (folder)
   |-- package.json
   |-- server.js (my server file)

đầu tiên cài đặt tải lại với lệnh này:

npm install [-g] [--save-dev] reload

sau đó thay đổi gói.json :

"scripts": {
    "start": "nodemon -e css,ejs,js,json --watch app"
}

bây giờ bạn phải sử dụng tải lại trong tệp máy chủ của bạn :

var express = require('express');
var reload = require('reload');
var app = express();

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
    console.log( 'server is running on port ' + app.get('port'));
});

reload(server, app);

và để thay đổi lần cuối, kết thúc phản hồi của bạn gửi tập lệnh này :

<script src="/reload/reload.js"></script>

Bây giờ hãy bắt đầu ứng dụng của bạn với mã này:

npm start

Cách tiếp cận này không hiệu quả, tuy nhiên, những cách tiếp cận được dẫn ra trong npmjs.com/package/reload (đối với ứng dụng Express) thì có.
Maxie Berkmann

0

Dùng cái này:

function reload_config(file) {
  if (!(this instanceof reload_config))
    return new reload_config(file);
  var self = this;

  self.path = path.resolve(file);

  fs.watchFile(file, function(curr, prev) {
    delete require.cache[self.path];
    _.extend(self, require(file));
  });

  _.extend(self, require(file));
}

Tất cả bạn phải làm bây giờ là:

var config = reload_config("./config");

Và cấu hình sẽ tự động được tải lại :)


Có phiên bản không dựa trên khung không phải là một phần của Node?
Adrian

0

loaddir là giải pháp của tôi để tải nhanh một thư mục, đệ quy.

có thể trở lại

{ 'path/to/file': 'fileContents...' } hoặc là { path: { to: { file: 'fileContents'} } }

callbacksẽ được gọi khi tập tin được thay đổi.

Nó xử lý các tình huống trong đó các tệp đủ lớn watchđược gọi trước khi viết xong.

Tôi đã sử dụng nó trong các dự án trong một năm hoặc lâu hơn, và gần đây đã thêm những lời hứa cho nó.

Giúp tôi kiểm tra trận chiến đó!

https://github.com/danschumann/loaddir


0

Bạn có thể sử dụng tự động tải lại để tải lại mô-đun mà không cần tắt máy chủ.

Tải về

npm install auto-reload

thí dụ

data.json

{ "name" : "Alan" }

test.js

var fs = require('fs');
var reload = require('auto-reload');
var data = reload('./data', 3000); // reload every 3 secs

// print data every sec
setInterval(function() {
    console.log(data);
}, 1000);

// update data.json every 3 secs
setInterval(function() {
    var data = '{ "name":"' + Math.random() + '" }';
    fs.writeFile('./data.json', data);
}, 3000);

Kết quả:

{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: '0.8272748321760446' }
{ name: '0.8272748321760446' }
{ name: '0.8272748321760446' }
{ name: '0.07935990858823061' }
{ name: '0.07935990858823061' }
{ name: '0.07935990858823061' }
{ name: '0.20851597073487937' }
{ name: '0.20851597073487937' }
{ name: '0.20851597073487937' }

0

một giải pháp đơn giản khác là sử dụng fs.readFile thay vì sử dụng yêu cầu bạn có thể lưu tệp văn bản chứa một đối tượng json và tạo một khoảng trên máy chủ để tải lại đối tượng này.

ưu:

  • không cần sử dụng lib bên ngoài
  • có liên quan đến sản xuất (tải lại tập tin cấu hình khi thay đổi)
  • dễ để thực hiện

Nhược điểm:

  • bạn không thể tải lại một mô-đun - chỉ là một json chứa dữ liệu khóa-giá trị

0

Đối với những người sử dụng Vagrant và PHPStorm, trình xem tệp là cách tiếp cận nhanh hơn

  • vô hiệu hóa đồng bộ hóa ngay lập tức các tệp để bạn chỉ chạy lệnh khi lưu, sau đó tạo phạm vi cho các tệp * .js và thư mục làm việc và thêm lệnh này

    vagsh ssh -c "/var/www/gadelkareem.com/forver.sh khởi động lại"

mãi mãi

#!/bin/bash

cd /var/www/gadelkareem.com/ && forever $1 -l /var/www/gadelkareem.com/.tmp/log/forever.log -a app.js

0

Gần đây tôi đã đến câu hỏi này vì các nghi phạm thông thường không làm việc với các gói được liên kết. Nếu bạn giống tôi và đang tận dụng lợi thế npm linktrong quá trình phát triển để làm việc hiệu quả với một dự án được tạo thành từ nhiều gói, thì điều quan trọng là những thay đổi xảy ra trong phụ thuộc cũng kích hoạt tải lại.

Sau khi đã thử nút-mon và pm2, ngay cả khi làm theo hướng dẫn của họ để xem thêm thư mục node_modules, họ vẫn không nhận được các thay đổi. Mặc dù có một số giải pháp tùy chỉnh trong các câu trả lời ở đây, nhưng đối với những thứ như thế này, một gói riêng sẽ sạch hơn. Tôi đã đi qua nút-dev ngày hôm nay và nó hoạt động hoàn hảo mà không có bất kỳ tùy chọn hoặc cấu hình.

Từ Readme:

Ngược lại với các công cụ như người giám sát hoặc gật đầu, nó không quét hệ thống tập tin để xem các tập tin. Thay vào đó, nó móc vào hàm Yêu cầu () của Node để chỉ xem các tệp thực sự được yêu cầu.


0
const cleanCache = (moduleId) => {
    const module = require.cache[moduleId];
    if (!module) {
        return;
    }
    // 1. clean parent
    if (module.parent) {
        module.parent.children.splice(module.parent.children.indexOf(module), 1);
    }
    // 2. clean self
    require.cache[moduleId] = null;
};

0

Bạn có thể làm điều đó với làm mới trình duyệt . Ứng dụng nút của bạn tự động khởi động lại, trang kết quả của bạn trong trình duyệt cũng tự động làm mới. Nhược điểm là bạn phải đặt đoạn trích js trên trang được tạo. Đây là repo cho ví dụ làm việc.

const http = require('http');
const hostname = 'localhost';
const port = 3000;

const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/html; charset=UTF-8');
    res.write('Simple refresh!');
    res.write(`<script src=${process.env.BROWSER_REFRESH_URL}></script>`);
    res.end();
})

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);

    if (process.send) {
        process.send({ event: 'online', url: `http://${hostname}:${port}/` })
    }

});

0

Tôi đã thử pm2 : cài đặt cũng dễ dàng và dễ sử dụng; kết quả là thỏa mãn. Tuy nhiên, chúng tôi phải quan tâm đến phiên bản pm2 mà chúng tôi muốn. pm 2 runtime là phiên bản miễn phí, trong khi pm2 plus và pm2 Enterprise không miễn phí.

Đối với Strongloop , cài đặt của tôi không thành công hoặc chưa hoàn tất, vì vậy tôi không thể sử dụng nó.


-1

Ngày nay máy chủ dev WebPack với tùy chọn nóng được sử dụng. bạn có thể thêm một tập lệnh như thế này trong gói.json của bạn:"hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",

và mọi thay đổi trong tệp của bạn sẽ tự động kích hoạt biên dịch lại


2
Câu trả lời này là sai câu hỏi. Webpack dành cho các ứng dụng lối vào và máy chủ dev là máy chủ web. Câu hỏi đã đề cập đến một ứng dụng máy chủ được triển khai trong Node. Nó không cần một máy chủ web. Nó là một rồi.
DanielKhan
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.