سؤال

أي أفكار حول كيف يمكنني تنفيذ التحميل التلقائي للملفات في 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 هو تقييم 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.8 API ، فهو غير مكيف لبعض الاحتياجات المحددة ولكنه سيعمل في بعض التطبيقات البسيطة.

تحديث: يتم تنفيذ هذا الوظيفية في الوحدة النمطية الخاصة بي أبسط, جيثب ريبو

هناك عقدة الإشراف التي يمكنك تثبيتها بواسطة

npm install supervisor

يرى http://github.com/isaacs/node-supervisor

تعديل: إجابتي عفا عليها الزمن. Node.js هي تقنية سريعة التغيير.

تساءلت أيضا عن إعادة التحميل الوحدات النمطية. لقد قمت بتعديل Node.js ونشرت المصدر في Github في nalply/عقدة. الفرق الوحيد هو الوظيفة require. لديها وسيطة ثانية اختيارية reload.

require(url, reload)

لإعادة التحميل app.js في استخدام الدليل الحالي

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

اكتب شيئًا كهذا ، ولديك تلقاءي-إعادة تحميل:

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

المشكلة الوحيدة التي أراها هي المتغير module, ، لكني أعمل الآن.

كان هناك حديث مسلك حول هذا الموضوع على القائمة البريدية Node.js. الإجابة المختصرة هي لا ، فهي حاليًا غير ممكنة ملفات مطلوبة تلقائية ، ولكن العديد من الأشخاص قاموا بتطوير تصحيحات تضيف هذه الميزة.

حل آخر لهذه المشكلة هو استخدام مدى الحياة

القدرة الأخرى المفيدة للأبد وهي أنه يمكنه إعادة تشغيل التطبيق اختياريًا عند تغيير أي ملفات مصدر. هذا يحررك من الاضطرار إلى إعادة التشغيل يدويًا في كل مرة تضيف فيها ميزة أو إصلاح خطأ. للبدء إلى الأبد في هذا الوضع ، استخدم علامة -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 نقطة الدخول.

ثم أضف التكوين التالي إلى launch.json (مقابل الكود) وابدأ تصحيح الأخطاء في أي وقت.

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

لاحظ أنه من الأفضل التثبيت nodemon كما تبعية DEV للمشروع. لذلك لا يحتاج أعضاء فريقك إلى تثبيته أو تذكر وسيطات القيادة ، فهم فقط npm run dev وابدأ القرصنة.

انظر المزيد عن nodemon مستندات: https://github.com/remy/nodemon#monitoring-multiple-directories

العقدة ديف تعمل بشكل رائع. NPM install node-dev

حتى أنه يعطي إشعار سطح المكتب عندما يتم إعادة تحميل الخادم وسيعطي النجاح أو الأخطاء في الرسالة.

ابدأ تطبيقك على سطر الأوامر مع:

node-dev app.js

هنا هو منشور مدونة حول إعادة تحميل الساخنة للعقدة. يوفر Github Node Branch يمكنك استخدامه لاستبدال تثبيت العقدة لتمكين إعادة التحميل الساخن.

من المدونة:

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 المحلي بالرمز الجديد. ستستمر أي طلبات موجودة في استخدام الرمز القديم ، بينما ستستخدم أي طلبات جديدة واردة الرمز الجديد. كل ذلك دون إيقاف الخادم ، كذاب أي طلبات ، أو قتل أي طلبات قبل الأوان ، أو حتى الاعتماد على موازن تحميل ذكي.

أنا أعمل على صنع "شيء" عقدة صغيرة إلى حد ما قادرة على تحميل/تفريغ الوحدات النمطية عند الإرادة (لذلك ، أي يمكنك إعادة تشغيل جزء من تطبيقك دون إسقاط التطبيق بالكامل). أقوم بدمج إدارة التبعية (الغبية جدًا) ، بحيث إذا كنت ترغب في إيقاف وحدة ، فإن جميع الوحدات النمطية التي تعتمد على ذلك ستتوقف أيضًا.

حتى الآن جيد جدًا ، لكنني تعثرت في مسألة كيفية إعادة تحميل وحدة نمطية. على ما يبدو ، يمكن للمرء فقط إزالة الوحدة النمطية من ذاكرة التخزين المؤقت "المتطلبات" وإنجاز المهمة. بما أنني لست حريصًا على تغيير رمز مصدر العقدة مباشرة ، فقد توصلت إلى أ جداً Hacky-Hack هذا هو: البحث في تتبع المكدس آخر مكالمة إلى وظيفة "المتطلبات" ، والاستيلاء على مرجع إلى حقل "ذاكرة التخزين المؤقت" و .. حسناً ، قم بحذف المرجع إلى العقدة:

    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 اذهب إلى هناك في غضون أسبوعين ويجب أن ترى ما أتحدث عنه)

يمكنك استخدام Nodemon من عند NPM. وإذا كنت تستخدم المولد السريع ، فيمكنك استخدام هذا الأمر داخل مجلد المشروع الخاص بك:

nodemon npm start

أو باستخدام وضع التصحيح

DEBUG=yourapp:* nodemon npm start

يمكنك أيضًا الجري مباشرة

nodemon your-app-file.js

نأمل أن تكون هذه المساعدة.

الحل في:http://github.com/shimondoodkin/node-hot-reload

لاحظ أنه يتعين عليك الاعتناء بنفسك بالمراجع المستخدمة.

هذا يعني إذا فعلت: var x = require ('foo') ؛ y = x ؛ z = x.bar ؛ وأعيد تحميله الساخن.

وهذا يعني أنه يجب عليك استبدال المراجع المخزنة في X و Y و Z. في وظيفة رد الاتصال Reaload الساخنة.

بعض الأشخاص يخلطون بين إعادة التحميل الساخن مع إعادة تشغيل Auto Retart My NodeJS-Autorestart Comple النمطية أيضًا للتكامل في UPSTART لتمكين بدء التشغيل التلقائي على التمهيد. إذا كان لديك إعادة تشغيل App Small Apt Auto على ما يرام ، ولكن عندما يكون لديك تطبيق كبير للتطبيق ، يكون إعادة تحميل الساخن أكثر ملاءمة. ببساطة لأن إعادة التحميل الساخنة أسرع.

كما أنني أحب وحدة التلاشي العقدة الخاصة بي.

ليس ضروريًا للاستخدام Nodemon أو أدوات أخرى من هذا القبيل. فقط استخدم قدرات IDE الخاصة بك.

ربما الأفضل Intellij Webstorm مع ميزة إعادة التحميل الساخنة (خادم أوتوماتيكي إعادة تحميل المتصفح) ل node.js.

إليك طريقة تقنية منخفضة للاستخدام في Windows. ضع هذا في ملف دفعة يسمى serve.bat:

@echo off

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

الآن بدلاً من الجري node app.js من قذيفة CMD الخاصة بك ، قم بالتشغيل serve app.js.

سيؤدي هذا إلى فتح نافذة شل جديدة تعمل على تشغيل الخادم. سيتم حظر ملف الدُفعات (بسبب /wait) حتى تغلق نافذة الصدفة ، عند هذه النقطة ، ستسأل قذيفة CMD الأصلية "إنهاء مهمة الدُفعات (Y/N)؟" إذا أجبت "N" ، فسيتم إعادة تشغيل الخادم.

في كل مرة تريد إعادة تشغيل الخادم ، أغلق نافذة الخادم والإجابة على "N" في قذيفة CMD.

بنية التطبيق الخاصة بي:

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

ثم التغيير package.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 يتم استدعاء قبل أن ينتهيوا الكتابة.

لقد كنت أستخدمها في مشاريع لمدة عام أو نحو ذلك ، وأضفت مؤخرًا الوعود إليها.

ساعدني معركة اختباره!

https://github.com/danschumann/loaddir

يمكنك استخدام التحميل التلقائي لإعادة تحميل الوحدة النمطية دون إيقاف تشغيل الخادم.

التثبت

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' }

حل بسيط آخر هو استخدم Fs.ReadFile بدلاً من الاستخداميمكنك حفظ ملف نصي يتنافس على كائن JSON ، وإنشاء فاصل زمني على الخادم لإعادة تحميل هذا الكائن.

الايجابيات:

  • لا حاجة لاستخدام libs الخارجية
  • ذات صلة بالإنتاج (إعادة تحميل ملف التكوين عند التغيير)
  • سهل التنفيذ

سلبيات:

  • لا يمكنك إعادة تحميل وحدة نمطية - مجرد JSON تحتوي على بيانات القيمة الرئيسية

للأشخاص الذين يستخدمون Vagrant و phpstorm ، مراقب الملف هو نهج أسرع

  • تعطيل المزامنة الفورية للملفات حتى تقوم بتشغيل الأمر فقط عند حفظ ثم قم بإنشاء نطاق لملفات *.js وأدلة العمل وإضافة هذا الأمر

    Vagrant SSH -C "/var/www/gadelkareem.com/forever.sh إعادة التشغيل"

أين يشبه إلى الأبد

#!/bin/bash

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

لقد جئت مؤخرًا إلى هذا السؤال لأن المشتبه بهم المعتادين لم يكن يعمل مع الحزم المرتبطة. إذا كنت مثلي وتستفيد من npm link أثناء التطوير للعمل بفعالية على مشروع يتكون من العديد من الحزم ، من المهم أن التغييرات التي تحدث في التبعيات تؤدي إلى إعادة تحميل أيضًا.

بعد أن جربت عقدة MON و PM2 ، حتى بعد تعليماتهم لمشاهدة مجلد Node_Modules بالإضافة إلى ذلك ، لم يلتقطوا التغييرات. على الرغم من وجود بعض الحلول المخصصة في الإجابات هنا ، لشيء من هذا القبيل ، فإن الحزمة المنفصلة هي أنظف. جئت عبر العقدة ديف اليوم وهو يعمل بشكل مثالي دون أي خيارات أو تكوين.

من Readme:

على عكس أدوات مثل المشرف أو Nodemon ، فإنه لا يقوم بمسح نظام الملفات للملفات التي يمكن مراقبة الملفات. بدلاً من ذلك ، يتم ربط وظيفة Node's () لمشاهدة الملفات التي كانت مطلوبة بالفعل.

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 مع خيار ساخن. يمكنك إضافة برنامج نصي مثل هذا في الحزمة الخاصة بك. json: "hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",

وسيؤدي كل تغيير في ملفاتك إلى إعادة ترجمة تلقائيًا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top