Node.js에서 파일을 자동 새로고침하는 방법
Node.js에서 파일 자동 새로고침을 구현하는 방법에 대한 의견이 있으십니까?파일을 바꿀 때마다 서버를 다시 시작하는 게 지겨워요.Node 'Node.js'라고됩니다.require()
파일이 이미 필요한 경우 새로고침되지 않으므로 다음과 같은 작업을 수행해야 합니다.
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 );
app.js 파일에는 다음과 같은 내용이 있습니다.
var file = require('./file');
this.app = function(req, res) {
file.serveFile( req, res, 'file.js');
}
안 하다 가 나요.process.compile()
'되어 있지 라고 . process.compile
app.displays를 평가 중이지만 node.displays globals에 대한 단서는 없습니다.
의 supervisor
다음과 같습니다.
node.js 어플리케이션의 변경을 감시하고 서버를 자동으로 재부팅하여 개발에 최적
「」를 nodemon
버전 없음)npx
하지 않음 (v8.1, 권장하지 않음):
$ npm install nodemon -g
$ nodemon app.js
""를 사용합니다.nodemon
를 하여 Node 을 설정합니다.npx
(v8.2+):
$ npm install nodemon
$ npx nodemon app.js
또는 패키지에 npm 스크립트를 포함한 devDependency로 지정합니다.json:
"scripts": {
"start": "nodemon app.js"
},
"devDependencies": {
"nodemon": "..."
}
node-displor는 훌륭합니다.
이전 노드 버전에 대한 저장 시 재시작 방법(권장되지 않음):
npm install supervisor -g
supervisor app.js
on 시 시 사용)를하십시오.npx
:
npm install supervisor
npx supervisor app.js
직접 를 걸 수도 있습니다.supervisor
npm "npm":
"scripts": {
"start": "supervisor app.js"
}
간단한 방법을 찾았어요
delete require.cache['/home/shimin/test2.js']
누군가가 여전히 이 질문에 답하고 표준 모듈만 사용하여 문제를 해결하고자 하는 경우 간단한 예를 들어 보겠습니다.
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();
});
다음 예시는 1개의 파일(server.js)에 대해서만 사용할 수 있지만 파일 배열, 모든 파일명을 취득하기 위한 for 루프 또는 디렉토리를 참조함으로써 여러 파일에 적용할 수 있습니다.
fs.watch('./', function (event, filename) { // sub directory changes are not seen
console.log(`restart server`);
server.kill();
server = cp.fork('server.js');
})
이 코드는 Node.js 0.8 API용으로 작성되었으며, 일부 특정 요구에 맞게 조정되지 않았지만 일부 간단한 앱에서 작동합니다.
업데이트: 이 기능은 my module simpleR, GitHub repo에 구현되어 있습니다.
nodemon은 구글 검색에서 가장 먼저 떠올랐고, 다음과 같은 트릭을 하는 것 같습니다.
npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.js
nodemon
정말 대단합니다.디버깅 및 옵션 감시를 위한 파라미터를 추가할 뿐입니다.
패키지.json
"scripts": {
"dev": "cross-env NODE_ENV=development nodemon --watch server --inspect ./server/server.js"
}
the명음음음음음음음음 the the the the 。nodemon --watch server --inspect ./server/server.js
반면:
--watch server
.js
,.mjs
,.coffee
,.litcoffee
, , , , 입니다..json
파일server
이치노
--inspect
리모트 디버깅을 유효하게 합니다.
./server/server.js
진입점
다음 다음 다음 을 '보다 낫다'에 합니다.launch.json
이치노
{
"type": "node",
"request": "attach",
"name": "Attach",
"protocol": "inspector",
"port": 9229
}
이 설치하시는 것이 좋습니다.nodemon
프로젝트의 개발 의존성으로 간주됩니다.은 그것을 인수를 명령어 인수를 기억하기만 하면 됩니다.npm run dev
해킹을 시작하죠
것은, 「」, 「」를 참조해 주세요.nodemon
문서: https://github.com/remy/nodemon#monitoring-multiple-directories
설치할 수 있는 노드 슈퍼바이저가 있습니다.
npm install supervisor
http://github.com/isaacs/node-supervisor 를 참조해 주세요.
잘 합니다.node-dev가 잘 작동합니다.npm npminstall node-dev
서버가 새로고침되면 데스크톱 알림도 표시되며 메시지에 성공 또는 오류가 표시됩니다.
명령줄에서 앱을 시작합니다.
node-dev app.js
NPM의 nodemon을 사용할 수 있습니다.Express 생성기를 사용하는 경우 프로젝트 폴더 내에서 다음 명령을 사용할 수 있습니다.
nodemon npm start
또는 디버깅 모드를 사용합니다.
DEBUG=yourapp:* nodemon npm start
직접 실행할 수도 있습니다.
nodemon your-app-file.js
이게 도움이 됐으면 좋겠다.
node.js 메일링 리스트에 이 주제에 관한 최신(2009) 스레드가 있습니다.즉, 현재 필요한 파일을 자동으로 새로고침할 수 없지만 여러 사용자가 이 기능을 추가하는 패치를 개발했습니다.
이 문제에 대한 또 다른 해결책은 영원히 사용하는 것이다.
Forever의 또 다른 유용한 기능은 소스 파일이 변경되었을 때 선택적으로 응용 프로그램을 재시작할 수 있다는 것입니다.이것에 의해, 기능을 추가하거나 버그를 수정할 때마다 수동으로 재기동할 필요가 없어집니다.이 모드에서 Forever를 시작하려면 -w 플래그를 사용합니다.
forever -w start server.js
노드용 핫 새로고침에 대한 블로그 게시물입니다.노드 설치를 대체하여 핫 새로고침을 활성화하기 위해 사용할 수 있는 github Node 브랜치를 제공합니다.
블로그에서:
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);
이제 myRequestHandler.js를 변경하면 위의 코드는 로컬 requestHandler를 새로운 코드로 대체하지 않습니다.기존 재퀘스트는 오래된 코드를 사용하도록 설정되며, 새로운 재퀘스트는 새로운 코드를 사용합니다.모두 서비스 종료, 재퀘스트 실행, 재퀘스트 실행, 재퀘스트 실행, 재퀘스트 종료, 인텔리젼트 로드밸런서 실행 등입니다.
모듈을 마음대로 로드/언로드할 수 있는 작은 노드 "물건"을 만들고 있습니다(즉, 앱 전체를 정지시키지 않고 애플리케이션의 일부를 재기동할 수 있습니다).(매우 어리석은) 의존관리가 포함되어 있기 때문에 모듈을 정지할 경우 이에 의존하는 모든 모듈도 정지됩니다.
지금까지는 괜찮았지만, 그 후 모듈을 새로고침하는 방법에 대해 알게 되었습니다."require" 캐시에서 모듈을 제거하고 작업을 수행할 수 있습니다.노드 소스 코드를 직접 변경하는 것을 좋아하지 않기 때문에 매우 해킹적인 방법이 떠올랐습니다.스택에서 마지막 호출을 "요구" 함수로 추적하고 "캐시" 필드에 대한 참조를 가져옵니다.노드에 대한 참조를 삭제합니다.
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 ] )
더 쉬운 것은, 사실:
var deleteCache = function(moduleFullpathAndExt) {
delete( require.cache[ moduleFullpathAndExt ] )
}
확실히, 이건 잘 먹히네요.나는 그 주장이 무슨 뜻인지 전혀 모르지만, 그것은 제 역할을 하고 있다.노드 담당자가 언젠가 새로고침 기능을 도입할 것이라고 생각하기 때문에, 현시점에서는 이 솔루션도 받아들일 수 있을 것이라고 생각합니다.(하지만, 제 '물건'은 https://github.com/cheng81/wirez에 있습니다.몇 주 후에 접속하시면 제가 무슨 말을 하고 있는지 알 수 있을 것입니다.)
솔루션: http://github.com/shimondoodkin/node-hot-reload
사용된 참조는 사용자가 직접 관리해야 합니다.
즉, var x=var foo', y=x;z=x.bar, 핫 새로고침이 이루어졌음을 의미합니다.
즉, 핫 리얼로드 콜백 함수의 x, y 및 z에 저장된 참조를 교체해야 합니다.
핫 새로고침과 자동 재시작을 혼동하는 사람도 있습니다.nodejs-autorestart 모듈에는 부팅 시 자동 시작을 활성화하기 위한 업스타트 통합 기능도 있습니다.작은 앱을 가지고 있다면 자동 재시작도 좋지만 큰 앱을 가지고 있다면 핫 새로고침이 더 적합합니다.단순히 핫 새로고침이 더 빠르기 때문입니다.
또한 노드 유입 모듈도 마음에 듭니다.
노데몬 같은 도구를 사용할 필요는 없습니다.IDE의 기능을 사용하면 됩니다.
node.js 용 핫 새로고침 기능(서버 및 브라우저 자동 새로고침)을 갖춘 IntelliJ WebStorm이 가장 적합합니다.
윈도을 '아까부터'라고 배치 에 넣습니다.serve.bat
:
@echo off
:serve
start /wait node.exe %*
goto :serve
" " 를 실행하는 " " 를 실행합니다.node app.js
에서 cmd를 실행합니다.serve app.js
.
이렇게 하면 서버를 실행하는 새 셸 창이 열립니다.됩니다(''로 인해)./wait
"Terminate batch job (Y/N)" "Terminate batch job (Y/N)" 입니다.N이라고 대답하면 서버가 재기동됩니다.
서버를 재시작할 때마다 서버 창을 닫고 cmd 쉘에서 "N"을 입력합니다.
내 앱 구조:
NodeAPP (folder)
|-- app (folder)
|-- all other file is here
|-- node_modules (folder)
|-- package.json
|-- server.js (my server file)
첫 번째 설치 새로고침은 다음 명령을 사용하여 수행합니다.
npm install [-g] [--save-dev] reload
패키지를 변경합니다.json:
"scripts": {
"start": "nodemon -e css,ejs,js,json --watch app"
}
이제 서버 파일에서 새로고침을 사용해야 합니다.
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);
마지막으로 변경했을 경우, 응답의 마지막에 다음의 스크립트를 송신합니다.
<script src="/reload/reload.js"></script>
이제 다음 코드로 앱을 시작합니다.
npm start
브라우저 새로 고침을 사용하여 수행할 수 있습니다.노드 앱이 자동으로 재시작되고 브라우저의 결과 페이지도 자동으로 새로 고쳐집니다.단점은 생성된 페이지에 js 스니펫을 넣어야 한다는 것입니다.여기 작업 예제의 레포입니다.
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}/` })
}
});
사용방법:
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));
}
이제 해야 할 일은 다음과 같습니다.
var config = reload_config("./config");
또, 설정이 자동적으로 새로고침 됩니다. : )
loaddir는 디렉토리를 재귀적으로 빠르게 로드하기 위한 솔루션입니다.
돌아올 수 있다
{ 'path/to/file': 'fileContents...' }
★★★★★★★★★★★★★★★★★」{ path: { to: { file: 'fileContents'} } }
말말 it it it it 가 있다.callback
이치노
"" " " " " " 가 될 로 큰 합니다.watch
다
1년 정도 프로젝트에 사용하다가 최근에 약속을 추가했어요.
테스트하는 것 좀 도와줘!
https://github.com/danschumann/loaddir
자동 새로고침을 사용하면 서버를 셧다운하지 않고 모듈을 새로고침할 수 있습니다.
설치하다
npm install auto-reload
예
data.json
{ "name" : "Alan" }
test.discloss를 실행합니다.discloss 。
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);
결과:
{ 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' }
또 다른 간단한 해결책은 require를 사용하는 대신 fs.readFile을 사용하는 것입니다.json 객체를 포함하는 텍스트파일을 저장하고 이 객체를 새로고침하는 간격을 서버에 작성할 수 있습니다.
장점:
- 외부 libs를 사용할 필요가 없습니다.
- 운영 환경에 관련(변경 시 구성 파일 새로고침)
- 구현하기 쉽다
단점:
- 모듈을 다시 로드할 수 없습니다. 키 값 데이터가 들어 있는 json만 해당됩니다.
Vagrant 및 PHPStorm을 사용하는 사용자에게 파일 워처는 더 빠른 접근법입니다.
파일의 즉시 동기화를 비활성화하여 저장 시에만 명령을 실행한 다음 *.disable 파일과 작업 디렉토리에 대한 범위를 만들고 이 명령을 추가합니다.
vagrant ssh -c "/var/www/gadelkareem.com/forever.sh 재시작"
어디서 영원히?sh는 마치
#!/bin/bash
cd /var/www/gadelkareem.com/ && forever $1 -l /var/www/gadelkareem.com/.tmp/log/forever.log -a app.js
제가 최근에 이 질문을 하게 된 이유는 보통 용의자들이 링크된 패키지로 작업을 하지 않았기 때문입니다. are if if if if if if if if if if if if if if if if if if if if?npm link
많은 패키지로 구성된 프로젝트에서 효과적으로 작업하기 위해 개발 중에 의존관계에서 발생하는 변경으로 인해 새로고침도 트리거되는 것이 중요합니다.
node-mon 및 pm2를 시도해도 node_modules 폴더를 추가로 감시하는 지시에 따라도 변경은 검출되지 않았습니다.이 답변에는 몇 가지 커스텀 솔루션이 있지만, 이와 같은 경우에는 별도의 패키지가 더 깨끗합니다.오늘 node-dev를 발견했는데 옵션이나 구성 없이도 완벽하게 작동합니다.
Readme에서:
슈퍼바이저나 nodeemon 등의 툴과는 달리 파일 시스템에서 감시할 파일을 스캔하지 않습니다.대신 노드의 require() 함수에 접속하여 실제로 필요한 파일만 감시합니다.
pm2를 사용해 보았습니다.설치도 쉽고 사용하기 쉬워서 만족스러운 결과를 얻을 수 있습니다.단, 원하는 pm2 에디션을 처리해야 합니다.pm2 런타임은 무료 에디션인 반면 pm2 plus와 pm2 enterprise는 무료 에디션이 아닙니다.
Strongloop은 설치가 실패하거나 완료되지 않아 사용할 수 없었습니다.
서버측 노드를 말하는 경우JS 핫 새로고침, 익스프레스 루트가 기술되어 있는 서버에 Javascript 파일이 있고 파일 변경 시 서버가 다시 시작되지 않고 이 Javascript 파일을 핫 새로고침하고 싶다고 가정하면 razzle이 그것을 할 수 있습니다.
그 예로는 basic-server가 있습니다.
https://github.com/jaredpalmer/razzle/tree/master/examples/basic-server
https://github.com/jaredpalmer/razzle/blob/master/examples/basic-server/src/server.js 파일이 변경 및 저장되면 서버가 다시 시작되지 않습니다.
즉, 이 razzle을 사용하여 핫 새로고침이 가능한 REST 서버를 프로그래밍할 수 있습니다.
WebPack 의 WebPack 스크립트를 패키지에 할 수 패키지에 이런 스크립트를 추가할 수 있습니다.json:"hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",
파일을 변경할 때마다 자동으로 재컴파일됩니다.
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;
};
언급URL : https://stackoverflow.com/questions/1972242/how-to-auto-reload-files-in-node-js
'programing' 카테고리의 다른 글
if(개체의 키) 또는 if(object.hasOwnProperty(키)) (0) | 2022.09.04 |
---|---|
phpmyadmin은 docker-param을 사용하여 mariadb에 접속할 수 없습니다.패킷의 순서가 잘못되어 있다 (0) | 2022.09.04 |
if(a - b < 0)와 if(a < b)의 차이 (0) | 2022.09.03 |
@BeforeClass 및 상속 - 실행 순서 (0) | 2022.09.03 |
Android 아카이브 라이브러리(aar)와 표준 jar (0) | 2022.09.03 |