簡體   English   中英

當我想查看更改時,如何在不重新啟動nodejs的情況下編輯我的服務器文件?

[英]How can I edit on my server files without restarting nodejs when i want to see the changes?

我正在嘗試設置自己的nodejs服務器,但我遇到了問題。 我無法弄清楚如何在不重新啟動的情況下查看應用程序的更改。 有沒有辦法編輯應用程序並查看node.js的更改?

Nodules是Node的模塊加載器,可以在重新啟動服務器的情況下處理模塊的自動重載(因為這就是您所要求的):

http://github.com/kriszyp/nodules

Nodules執行智能依賴關系跟蹤,因此重新執行適當的模塊工廠以在重新加載模塊時保留正確的引用,而無需完全重啟。

查看Node-Supervisor 您可以為其提供一組文件以監視更改,如果其中任何一個更改,它將重新啟動您的服務器。 如果因某些其他原因崩潰,它也會重新啟動它。

NodeJS中未啟用“熱交換”代碼,因為它很容易意外地導致內存泄漏或未被垃圾回收的多個對象副本。 節點是關於讓您的程序意外快速,而不是意外泄漏。

編輯,7年后的事實:免責聲明,我寫了節點主管,但在寫這個答案之前已經把項目交給另一個維護者。

使用此: https//github.com/remy/nodemon

只需像這樣運行您的應用程序: nodemon yourApp.js

應該重點關注正在發生的事情,而不僅僅是在OP上使用射擊模塊。 另外,我們不知道他正在編輯的文件都是JS模塊,或者他們都在使用“require”調用。 采取以下幾種方案,它們只是為了描述正在發生的事情,因此您知道如何使用它。

  1. 您的代碼已經加載,服務器正在運行它

    • 解決方案您需要有一種方法告訴服務器哪些代碼已更改,以便可以重新加載它。 您可以將端點設置為接收信號,命令行上的命令或通過tcp / http的請求,該命令將告知它更改了哪個文件並且端點將重新加載它。

       //using Express var fs = require('fs'); app.get('reload/:file', function (req, res) { fs.readfile(req.params.file, function (err, buffer) { //do stuff... }); }); 
  2. 您的代碼可能在其中有“require”調用,用於加載和緩存模塊

    • 解決方案,因為這些模塊是由require緩存的,按照之前的解決方案,您需要在端點中使用一行來刪除該引用

       var moduleName = req.params.file; delete require.cache[moduleName]; require('./' + moduleName); 

所有這些都有很多需要注意的事情,但希望你能更清楚地知道發生了什么以及為什么會這樣。

什么是“實時編碼”?

從本質上講,它是一種在程序運行時更改程序的方法,無需重新啟動它。 然而,目標是最終得到一個在我們(重新)啟動時正常工作的程序。 為了有用,有一個可以自定義的編輯器將代碼發送到服務器是有幫助的。

看看: http//lisperator.net/blog/livenode-live-code-your-nodejs-application/

如果您想在不重新啟動節點進程的情況下重新加載模塊,可以通過fs模塊中的watchFile函數和require的 緩存清除功能來完成此操作:

假設你加載了一個帶有簡單要求的模塊:

var my_module = require('./my_module');

為了觀察該文件並在更新時重新加載,請將以下內容添加到代碼中的方便位置。

fs.watchFile(require.resolve('./my_module'), function () {
    console.log("Module changed, reloading...");
    delete require.cache[require.resolve('./my_module')]
    my_module = require('./my_module');
});

如果多個文件中需要您的模塊,則此操作不會影響其他分配,因此將模塊保留在全局變量中並在全局需要的地方使用它而不需要多次,這是一個選項。 所以上面的代碼將是這樣的:

global.my_module = require ('./my_module');
//..
fs.watchFile(require.resolve('./my_module'), function () {
    console.log("Module changed, reloading...");
    delete require.cache[require.resolve('./my_module')]
    global.my_module = require('./my_module');
});

您也可以使用工具PM2。 這是節點js的高級生產過程工具。 http://pm2.keymetrics.io/

我認為節點檢查員是你最好的選擇。

與Chrome Dev工具中的Live Edit Client側JS代碼類似,這利用Chrome(Blink)開發工具界面提供實時代碼編輯。

https://github.com/node-inspector/node-inspector/wiki/LiveEdit

一個簡單的直接解決方案,參考這里提供的所有答案:

節點文檔說fs.watchfs.watchFile更有效,它可以觀看整個文件夾。

(我剛開始使用它,所以不確定是否有任何缺點)

fs.watch("lib", (event_type, file_name) => {
    console.log("Deleting Require cache for " + file_name);
    delete require.cache[ require.resolve("./lib/" + file_name)];
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM