質問
そのアイデアをどう実施す自動リロードのファイルNode.js?疲れたのサーバを再起動時に変更を行ったファイルです。どうやら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
はevalingの app.js, がこんなにnode.js globals.
解決
supervisor
の日付の代わりに良い、アップがあるの nodemon
のの
モニタあなたのNode.jsアプリケーションの変更のため、自動的にサーバを再起動する - 開発のための完全な
nodemon
を使用するには:
$ npm install nodemon -g
$ nodemon app.js
他のヒント
ノードスーパーバイザが素晴らしいである
:保存を再起動するには、の使用
npm install supervisor -g supervisor app.js
アイザックスによる - http://github.com/isaacs/node-supervisorする
私は簡単な方法を見つけました
delete require.cache['/home/shimin/test2.js']
のnodemon のGoogle検索で最初に思い付いた、そして、トリックを行うようだ。
npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.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();
});
この例では一つのファイルserver.jsものに対応することができ、複数のファイルの配列ファイルには、ループすべてのファイル名またはモニターを見ながらディレクトリ:
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.8APIではな予測を算出するのに使用した、一部の特定のニーズです簡単なアプリとなります。
ノードスーパーバイザーは、あなたがでインストールできることがあります。
npm install supervisor
の編集の私の答えは廃止されました。 Node.jsのは非常に高速に変化する技術である。
私はまたの再読み込みのモジュールについて疑問に思いました。私はNode.jsのを修正し、 nalply /ノードまでのGithubでソースを公開しています。唯一の違いは、関数require
です。それは、オプションの第二引数のreload
を持っています。
require(url, reload)
カレントディレクトリを使用してapp.js
をリロードする
app = require("./app", true);
このような書き込み何か、そしてあなたが持っているの自動の-reloadます:
process.watchFile(script_name, function(curr, prev) {
module = reload(script_name, true);
});
私が見る唯一の問題は、変数module
ですが、私は今それで働いています。
ノード上でこのテーマに関する最近のスレッドのがありました。 JSメーリングリスト。短い答えは何で、それが現在ではありません可能オートリロードは、ファイルを必要としないが、いくつかの人々は、この機能を追加するパッチを開発しました。
まだこの問題に対する別の解決策は永遠にを使用しているの
フォーエバーの他の有用な機能は、それは、必要に応じて再起動することができるということです すべてのソースファイルが変更されているアプリケーション。これは、あなたを解放します 毎回手動を再起動することからあなたは機能や修正Aを追加します バグ。このモードでは永遠に起動するには、-wフラグを使用します:
forever -w start server.js
nodemon
は素晴らしいものです。私は、デバッグおよびオプションを見るために多くのパラメータを追加します。
のpackage.json の
"scripts": {
"dev": "cross-env NODE_ENV=development nodemon --watch server --inspect ./server/server.js"
}
コマンド:nodemon --watch server --inspect ./server/server.js
これに対します:
--watch server
再起動アプリ.js
フォルダ(サブフォルダ含む)に.mjs
、.coffee
、.litcoffee
、.json
、およびserver
ファイルを変更するときます。
--inspect
リモートデバッグを有効にします。
./server/server.js
エントリポイント
次に、(VSコード)launch.json
に次の設定を追加して、いつでもデバッグを開始ます。
{
"type": "node",
"request": "attach",
"name": "Attach",
"protocol": "inspector",
"port": 9229
}
それはプロジェクトのdevの依存関係としてnodemon
をインストールすることをお勧めだということに注意してください。あなたのチームのメンバーは、彼らはただnpm run dev
とハッキング開始し、それをインストールするか、コマンド引数を覚えておく必要はありません。
nodemon
のドキュメントの詳細を参照してください: https://github.com/remy/nodemon #監視複数のディレクトリの
ノード-devが素晴らしい作品。 NPM install node-dev
それも、サーバーが再ロードされ、メッセージの成功またはエラーを与えるデスクトップ通知を与えます。
とコマンドラインでのアプリを起動します
node-dev app.js
ここの約ブログ記事ですノードのホットリロード。それは提供して githubのノードあなたはホットを有効にするには、ノードのインストールを置き換えるために使用できることを分岐するリロードます。
ブログから:
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に置き換えられます。既存の要求は、任意の新しい着信要求が新しいコードを使用する一方で、古いコードを使用していきます。すべての途中ですべての要求を殺し、あるいはインテリジェントなロードバランサに頼って、サーバーをシャットダウンするすべての要求をバウンスなしています。
私はで-ます(そう、つまりあなたが全体のアプリケーションのダウンをさせることなく、アプリケーションの一部を再起動することができる可能性があり)、ロード/アンロードモジュールにできているという小さなノード「もの」を作ることに取り組んでいます。 私はあなたがモジュールを停止したい場合は、その依存するすべてのモジュールがあまりにも停止されるように、(非常に愚かな)依存関係の管理を組み込んでいます。
これまでのところは良いが、その後、私はモジュールをリロードする方法の問題につまずきました。どうやら、1は単に「必要」キャッシュからモジュールを削除し、仕事を持つことができます。スタックトレース内検索「必要」機能を最後に呼び出し、グラブA:私は直接ノードのソースコードを変更することに熱心ではないよので、私はの非常にのハック、ハックを思い付きましたそれの「キャッシュ」フィールドへの参照は、ノードへの参照を削除し、and..well: <ストライキ> ストライキ>
<ストライキ> 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 ] )
}
どうやら、これはうまく動作します。私は何をその引数[「1」]手段の絶対にないアイデアを持っていないが、それはその仕事をやっています。私は今のところこのソリューションは、あまりにも受け入れ可能であることを推測するように、ノードの連中は、リロード施設いつかを実装すると確信しています。 (ところで、私の "もの" がここに次のようになります。 https://github.com/cheng81/wirez に、数週間でそこに行くと、あなたは)私が話しているかを確認する必要があります。
あなたはのNPMのからのnodemonのを使用することができます。 あなたはその後、エクスプレス・ジェネレータを使用している場合は、あなたのプロジェクトのフォルダ内に、このコマンドを使用することができます:
nodemon npm start
または
デバッグモードを使用してDEBUG=yourapp:* nodemon npm start
あなたが直接実行することができます。
nodemon your-app-file.js
・ホープこのヘルプます。
のソリューション: http://github.com/shimondoodkin/node-hot-reloadする
あなたが使用する参照の自分で世話をしていることに注意してください。
あなたがやった場合の手段があること:varは、X =( 'foo' を)必要とします。 Y = X; Z = x.bar。ホット再ロード これます。
それはあなたがのx、y、zの中に保存された参照を交換する必要があるということです。ホットrealoadコールバック関数内でます。
一部の人々は自動再起動でホットリロードを混乱させる 私nodejs-自動再モジュールはまた、ブート時に自動起動を有効にするには、新興の統合を持っています。 あなたは小さなアプリの自動再起動を持っている場合は罰金ですが、大規模なアプリホットリロードを持っているときに、より適しています。単にホットリロードが速いのでます。
また、私、私のノード-流入モジュールのような。
未使用するために必要なのnodemon のか、そのような他のツール。ちょうどあなたのIDEの機能を使用しています。
おそらく最良のものはのNode.jsののためのホットリロード機能(自動サーバとブラウザのリロード)でのIntelliJのWebStorm のです。
ここでは、Windowsで使用するためのローテクの方法があります。バッチファイルと呼ばれるserve.bat
でこれを入れます:
@echo off
:serve
start /wait node.exe %*
goto :serve
さて、あなたの代わりにCMDシェルからnode app.js
を実行する、実行serve app.js
ます。
これは、サーバーを実行している新しいシェル・ウィンドウを開きます。バッチファイルを使用すると、シェルウィンドウを閉じるまで、(理由/wait
の)ブロックのオリジナルCMDシェルを、その時点でます「バッチジョブ(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
使用この:
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'} } }
これは持っているファイルが変更されたときに呼び出されますcallback
ます。
これは、ファイルがwatch
が彼らだ済書き込みの前に呼び出されることに十分な大きさである状況を処理します。
私は1年かそこらのためのプロジェクトでそれを使用して、そしてそれにちょうど最近追加約束してきます。
ヘルプ私の戦いのテストを!
あなたがシャットダウンせずにモジュールをリロードするためにサーバーをオートリロードを使用することができます。
インストール
npm install auto-reload
例
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);
結果:
{ 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 オブジェクトを含むテキスト ファイルを保存し、サーバー上でこのオブジェクトを再ロードする間隔を作成できます。
長所:
- 外部ライブラリを使用する必要はありません
- 本番環境に関連する (変更時に構成ファイルをリロードする)
- 実装が簡単
短所:
- モジュールをリロードすることはできません。キーと値のデータを含む JSON だけをリロードします。
VagrantやPHPStormを使っている人にとっては、 ファイルウォッチャー より早いアプローチです
ファイルの即時同期を無効にして、保存時にのみコマンドを実行し、*.js ファイルと作業ディレクトリのスコープを作成して、このコマンドを追加します。
vagrant ssh -c "/var/www/gadelkareem.com/forever.sh restart"
ever.sh は次のようなものです
#!/bin/bash
cd /var/www/gadelkareem.com/ && forever $1 -l /var/www/gadelkareem.com/.tmp/log/forever.log -a app.js
私は最近、この質問に来ました。あなたが私に似ていると多くのパッケージから構成されたプロジェクトで効率的に仕事に開発中npm link
の利点を取っている場合は、依存関係に発生した変更が同様にリロードを誘発することが重要です。
でもさらにnode_modulesフォルダを見るために彼らの指示に従って、ノード月とPM2を試した後、彼らはまだ変更をピックアップしていませんでした。いくつかのカスタムソリューションは、ここでの回答でありますが、このような何かのために、別々のパッケージがきれいです。今日はノード-devのに渡って来て、それがどのオプションや設定なしで完璧に動作します。
Readmeファイルから
スーパーバイザーのような、またはそれが見するファイル用のファイルシステムをスキャンしませんnodemonツールとは対照的に、。その代わりに、実際に必要とされているファイルのみを監視するノードの必要()関数にフックます。
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;
};
ホットオプション付き昨今のWebPACKのdevのサーバーが使用されています。
あなたはpackage.jsonにこのようなスクリプトを追加することができます。"hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",
とファイル内のすべての変更が自動的に再コンパイルをトリガーします。