2013-09-18 3 views
3

Возможно ли горячая перезагрузка внешних js-файлов в node.js на основе его метки времени?Горячая перезагрузка внешнего js-файла в node.js, если есть какие-либо изменения в файле

Я знаю Node.js модуля кэшей после первой загрузки времени здесь: http://nodejs.org/docs/latest/api/modules.html#modules_caching

модулей кэшируются после первого раза они загружены. Это означает, что каждый вызов, требуемый ('foo'), получит точно тот же объект, который был возвращен, если он разрешит тот же файл .

И я также знаю, если мне нужно перезагрузить его, я могу сделать так:

// first time load 
var foo = require('./foo'); 
foo.bar() 

... 

// in case need to reload 
delete require.cache[require;.resolve('./foo')] 
foo = require('./foo') 
foo.bar(); 

Но мне интересно, есть ли встроенная поддержка в Node.js, что он наблюдает за файл и загрузить его, если есть какие-то изменения. Или мне нужно сделать это самостоятельно?

псевдо-код, как

// during reload 
if (timestamp for last loaded < file modified time) 
    reload the file as above and return 
else 
    return cached required file 

P.S. Я знаю супервизора и nodemon и не хочу перезапускать сервер для перезагрузки некоторых определенных модулей.

+0

Действительно ли вы загружаете модули? Если нет, вы всегда можете использовать 'fs.watch()'. http://nodejs.org/api/fs.html#fs_fs_watch_filename_options_listener Если вы загружаете модули, вы, похоже, используете край. Вам действительно нужны непоследовательные части кода в вашем приложении? Вы всегда можете 'eval()', но я думаю, что вы делаете сейчас лучше. – Brad

+0

@Brad да, я действительно хочу эту функцию перезагрузки. так как некоторые файлы могут быть изменены. И мне нужно сделать их активными вовремя. да, eval - это вариант, но не подходит, как требуется. –

ответ

1

Существует встроенная поддержка, хотя она не соответствует всем операционным системам. Это будет либо использование fs.watch(), либо fs.watchFile(). Первая функция будет использовать события изменения файла, а вторая - использовать опрос статистики.

Вы можете посмотреть файл и проверить его время модификации, когда оно изменилось.

var fs = require('fs'); 
var file = './module.js'; 

var loadTime = new Date().getTime(); 
var module = require(file); 

fs.watch(file, function(event, filename) { 
    fs.stat(file, function(err, stats) { 
    if (stats.mtime.getTime() > loadTime) { 
     // delete the cached file and reload 
    } else { 
     // return the cached file 
    } 
    }); 
}); 

С fs.watchFile(), вам не нужно использовать fs.stats(), так как функции уже обратные вызовы экземпляров fs.Stat.

fs.watchFile(file, function(curr, prev) { 
    if (curr.mtime.getTime() > loadTime) { 
    // delete the cached file and reload 
    } else { 
    // return the cached file 
    } 
}); 
+0

опрос добавляет накладные расходы на сервер, поэтому я думаю, что 'fs.watch()' должен быть лучшим способом. И мне все еще нужно поддерживать список для отслеживания последнего загруженного файла. Вернемся к моему вопросу, мне нужно сделать цикл, чтобы потребовать серию js-файлов. Я подумывал ввести в цикл код горячей перезагрузки/timecheck и потребовать/очистить кеш, если это необходимо. Но с учетом функции 'fs.watch', как это возможно? –

+0

Следует отметить, что это заменит логику, уже кэшированную самим приложением. Например, при использовании Express, перезагрузка файла, который содержит маршрут, не означает, что Express фактически загрузит новый код в следующий запрос; поэтому для действительно работающего алгоритма «перезагрузки горячего кода» потребуется решение для широкого круга приложений, чтобы знать, когда файл с пути X должен обновить функцию Y. – gustavohenke

+0

Угадайте, мне нужно разработать подход к перезагрузке смарт-файлов для моего собственного использования. Возможно, необходимо рассмотреть и некоторые краевые вопросы. Благодарю. –

Смежные вопросы