development

변경 사항을 확인하려면 nodejs를 다시 시작하지 않고 서버 파일을 편집하려면 어떻게해야합니까?

big-blog 2020. 12. 7. 20:12
반응형

변경 사항을 확인하려면 nodejs를 다시 시작하지 않고 서버 파일을 편집하려면 어떻게해야합니까?


내 nodejs 서버를 설정하려고하는데 문제가 있습니다. 응용 프로그램을 다시 시작하지 않고 변경 사항을 확인하는 방법을 알 수 없습니다. 응용 프로그램을 편집하고 node.js로 변경 사항을 실시간으로 볼 수있는 방법이 있습니까?


Node-Supervisor를 확인하십시오 . 변경 사항을 감시 할 파일 모음을 제공 할 수 있으며 변경 사항이 있으면 서버를 다시 시작합니다. 다른 이유로 인해 충돌이 발생하면 다시 시작합니다.

"핫스왑"코드는 NodeJS에서 활성화되지 않습니다. 실수로 메모리 누수 나 가비지 수집되지 않는 객체의 여러 복사본으로 끝나기 쉽기 때문입니다. Node는 프로그램을 실수로 누출되는 것이 아니라 실수로 빠르게 만드는 것입니다.

편집, 7 년 후 : 면책 조항, 노드 관리자를 작성했지만이 답변을 작성하기 전에 다른 관리자에게 프로젝트를 넘겼습니다.


Nodules는 서버 다시 시작 하지 않고 모듈의 자동 다시로드를 처리하는 Node 용 모듈 로더입니다 .

http://github.com/kriszyp/nodules

Nodules는 지능형 종속성 추적을 수행하므로 모듈을 완전히 다시 시작할 필요없이 모듈을 다시로드 할 때 올바른 참조를 유지하기 위해 적절한 모듈 팩토리가 다시 실행됩니다.


이것을 사용하십시오 : 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);
      

이 모든 것 뒤에는 많은주의 사항이 있지만, 무슨 일이 일어나고 왜 일어나는지 더 잘 알 수 있기를 바랍니다.


노드 프로세스를 다시 시작하지 않고 모듈을 다시로드하려면 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');
});

"라이브 코딩"이란 무엇입니까?

본질적으로 프로그램을 다시 시작하지 않고 실행하는 동안 프로그램을 변경하는 방법입니다. 그러나 목표는 (다시) 시작할 때 제대로 작동하는 프로그램으로 끝나는 것입니다. 유용하게 사용하려면 코드를 서버로 보내도록 사용자 정의 할 수있는 편집기가 있으면 도움이됩니다.

보세요 : http://lisperator.net/blog/livenode-live-code-your-nodejs-application/


PM2 도구를 사용할 수도 있습니다. 노드 js를위한 고급 생산 프로세스 도구입니다. http://pm2.keymetrics.io/


I think node-inspector is your best bet.

Similar to how you can Live Edit Client side JS code in Chrome Dev tools, this utilizes the Chrome (Blink) Dev Tools Interface to provide live code editing.

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


A simple direct solution with reference to all answers available here:

Node documentation says that fs.watch is more efficient than fs.watchFile & it can watch an entire folder.

(I just started using this, so not really sure whether there are any drawbacks)

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

참고URL : https://stackoverflow.com/questions/2925940/how-can-i-edit-on-my-server-files-without-restarting-nodejs-when-i-want-to-see-t

반응형