Pregunta

¿Alguna idea sobre cómo podría implementar un auto-recarga de archivos en Node.js? Estoy cansado de reiniciar el servidor cada vez que cambio de un archivo. Al parecer, la función require() Node.js' no vuelve a cargar los archivos si ya han sido requeridos, por lo que tengo que hacer algo como esto:

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 );

Y en el archivo app.js que tengo:

var file = require('./file');
this.app = function(req, res) { 
    file.serveFile( req, res, 'file.js');  
}

Pero esto también no está funcionando - Me aparece un error en la declaración process.compile() diciendo que 'requiere' no está definido. process.compile se evaling el app.js , pero no tiene ni idea acerca de las variables globales Node.js.

¿Fue útil?

Solución

Una buena, hasta la fecha alternativa a supervisor es nodemon

  

Monitor de cualquier cambio en su aplicación Node.js y se reinicia automáticamente el servidor - perfecto para el desarrollo

Para uso nodemon:

$ npm install nodemon -g
$ nodemon app.js

Otros consejos

nodo supervisor es impresionante

para reiniciar el uso en guardar:

npm install supervisor -g
supervisor app.js

por Isaacs - http://github.com/isaacs/node-supervisor

He encontrado una manera sencilla:

delete require.cache['/home/shimin/test2.js']

nodemon se acercó por primera vez en una búsqueda en Google, y parece hacer el truco:

npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.js

Si alguien todavía viene a esta pregunta y quiere resolverlo usando sólo los módulos estándar que hice un sencillo ejemplo:

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();
});

Este ejemplo es sólo para un archivo (server.js), pero se puede adaptar a varios archivos usando una gran variedad de archivos, un bucle for para obtener todos los nombres de archivo, o viendo un directorio:

fs.watch('./', function (event, filename) { // sub directory changes are not seen
    console.log(`restart server`);
    server.kill();
    server = cp.fork('server.js');    
})

Este código se hizo para Node.js 0.8 API, no está adaptado para algunas de las necesidades específicas, pero funcionará en algunas aplicaciones simples.

ACTUALIZACIÓN: Esta funcionalidad se implementa en mi módulo más simple , GitHub repo

Hay Nodo-Supervisor que se puede instalar mediante

npm install supervisor

http://github.com/isaacs/node-supervisor

Editar Mi respuesta es obsoleto. Node.js es una tecnología que cambia muy rápido.

I también se preguntó acerca de recarga módulos. He modificado node.js y he publicado la fuente en Github en nalply / nodo . La única diferencia es la require función. Tiene una segunda reload argumento opcional.

require(url, reload)

Para volver a cargar app.js en uso directorio actual

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

escribir algo como esto, y usted tiene Auto -reload:

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

El único problema que veo es la variable module, pero estoy trabajando en ello ahora.

Hubo un reciente sobre este tema en el nodo. js lista de correo. La respuesta corta es no, no es posible en la actualidad de auto-recarga archivos requeridos, pero varias personas han desarrollado parches que añadir esta función.

otra solución para este problema está utilizando siempre

  

Otra capacidad útil de siempre es que opcionalmente puede reiniciar   su aplicación cuando los archivos de origen han cambiado. Esto le libera   de tener que reiniciar manualmente cada vez que se agrega una característica o una solución   error. Para empezar siempre en este modo, usar la bandera w:

forever -w start server.js

nodemon es un grande. Acabo de añadir más parámetros para la depuración y las opciones de ver.

package.json

  "scripts": {
    "dev": "cross-env NODE_ENV=development nodemon --watch server --inspect ./server/server.js"
  }

El comando: nodemon --watch server --inspect ./server/server.js

Considerando lo siguiente:

--watch server reiniciar la aplicación al cambiar .js, .mjs, .coffee, .litcoffee, y los archivos en la carpeta .json server (subcarpetas incluidas).

--inspect Habilitar depuración remota.

./server/server.js El punto de entrada.

A continuación, agregue la siguiente configuración para launch.json (Código VS) y empezar a depurar cualquier momento.

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

Tenga en cuenta que es mejor instalar nodemon como dev dependencia del proyecto. Así que los miembros de su equipo no es necesario instalarlo o recordar los argumentos de comandos, que acaba de npm run dev y empezar a cortar.

Vea más en docs nodemon: https://github.com/remy/nodemon # monitoreo en múltiples directorios

nodo-dev funciona muy bien. NPM install node-dev

Incluso se da una notificación de escritorio cuando el servidor se vuelve a cargar y dará éxito o errores en el mensaje.

se inicia la aplicación en línea de comandos con:

node-dev app.js

Aquí es un blog acerca Recarga caliente para el nodo. Proporciona una github Nodo rama que se puede utilizar para reemplazar su instalación de nodo para permitir caliente recarga.

Desde el blog:

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);
  

Ahora, cada vez que se modifica myRequestHandler.js, el código anterior se dará cuenta y reemplazar el RequestHandler local con el nuevo código. Cualquier solicitud existentes continuarán utilizando el código de edad, mientras que las nuevas solicitudes entrantes usarán el nuevo código. Todo sin necesidad de apagar el servidor, rebotando cualquier solicitud, matando prematuramente cualquier solicitud, o incluso depender de un equilibrador de carga inteligente.

Estoy trabajando en la fabricación de un nodo bastante pequeño "cosa" que es capaz de módulos de carga / descarga a voluntad (es así, es decir, usted podría ser capaz de reiniciar parte de su solicitud sin traer abajo toda la aplicación). Yo estoy incorporando un (muy tonto) gestión de la dependencia, por lo que si desea detener un módulo, todos los módulos que depende de que se detendrán también.

Hasta aquí todo bien, pero luego me encontré en el tema de cómo volver a cargar un módulo. Al parecer, uno puede simplemente quitar el módulo de la memoria caché "requerir" y tener el trabajo hecho. Ya que no estoy dispuesto a cambiar directamente el código fuente nodo, se me ocurrió con un muy hacky-hack que está: buscar en el seguimiento de la pila la última llamada a la "requieren" función, agarrar una referencia a él del campo "caché" and..well, suprimir la referencia al nodo:

    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 ] )

Incluso más fácil, en realidad:

var deleteCache = function(moduleFullpathAndExt) {
  delete( require.cache[ moduleFullpathAndExt ] )
}

Al parecer, esto funciona muy bien. No tengo absolutamente ninguna idea de lo que los argumentos [ "1"] medios, pero se está haciendo su trabajo. Creo que los chicos nodo implementarán un día las instalaciones de recarga, así que supongo que por ahora esta solución es aceptable también. (Por cierto mi "cosa" estará aquí:. https://github.com/cheng81/wirez , ir allí en un par de semanas y debería ver lo que estoy hablando)

Se puede utilizar nodemon NPM . Y si está utilizando el generador expreso a continuación, puede utilizar este comando dentro de su carpeta de proyecto:

nodemon npm start

o usando el modo de depuración

DEBUG=yourapp:* nodemon npm start

También puede ejecutar directamente

nodemon your-app-file.js

Espero que esto ayuda.

solución a: http://github.com/shimondoodkin/node-hot-reload

Tenga en cuenta que usted tiene que cuidar por sí mismo de las referencias utilizadas.

Esto significa que si usted hizo: var x = require ( 'foo'); y = x; z = x.bar; y caliente recargado a él.

que significa que tiene que reemplazar las referencias almacenadas en x, y, z. en la función de devolución de llamada reaload caliente.

Algunas personas confunden recarga caliente con reinicio automático mi módulo nodejs-autorestart también tiene la integración advenedizo para permitir el inicio automático en el arranque. si usted tiene una pequeña aplicación reinicio automático está muy bien, pero cuando se tiene una gran aplicación en caliente de recarga es más adecuado. simplemente porque es más rápido de recarga caliente.

También me gusta mi módulo de nodo de entrada.

No es necesario el uso de nodemon u otras herramientas por el estilo. Sólo tiene que utilizar las capacidades de su IDE.

Probablemente es mejor IntelliJ WebStorm con función de recarga en caliente (servidor de recarga automática y navegador) para Node.js .

Aquí hay un método de baja tecnología para su uso en Windows. Poner esto en un archivo por lotes llamado serve.bat:

@echo off

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

Ahora, en lugar de correr node app.js de su consola CMD, ejecute serve app.js.

Esto abrirá una nueva ventana de shell que ejecuta el servidor. El archivo por lotes bloqueará (debido a la /wait) hasta que se cierre la ventana de celda, en cuyo punto la consola CMD originales preguntará "Terminar proceso por lotes (S / N)?" Si su respuesta es "N" y luego se lanzó de nuevo al servidor.

Cada vez que desee reiniciar el servidor, cierre la ventana del servidor y la respuesta "N" en la consola CMD.

mi estructura de aplicación:

NodeAPP (folder)
   |-- app (folder)
      |-- all other file is here
   |-- node_modules (folder)
   |-- package.json
   |-- server.js (my server file)

instale primero recarga con este comando:

npm install [-g] [--save-dev] reload

entonces el cambio package.json :

"scripts": {
    "start": "nodemon -e css,ejs,js,json --watch app"
}

Ahora debe utilizar recarga en el archivo del servidor

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);

y por último cambio, al final de su respuesta enviar este guión

<script src="/reload/reload.js"></script>

Ahora se inicia su aplicación con este código:

npm start

Utilice esta:

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));
}

Todo lo que tiene que hacer ahora es:

var config = reload_config("./config");

Y config conseguirá automáticamente recargado:)

loaddir es mi solución para la carga rápida de un directorio, de forma recursiva.

puede volver

{ 'path/to/file': 'fileContents...' } o { path: { to: { file: 'fileContents'} } }

Tiene callback que se llamará cuando se cambia el archivo.

Se ocupa de situaciones donde los archivos son lo suficientemente grandes que watch es llamado antes de que se está escribiendo hecho.

He estado usando en proyectos de un año o así, y recientemente añadido promesas a él.

Me ayudan batalla prueba de ello!

https://github.com/danschumann/loaddir

Se puede usar auto-recarga para recargar el módulo sin apagar el servidor.

instalar

npm install auto-reload

ejemplo

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);

Resultados:

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

otra solución simple es utilizar fs.readFile en lugar de utilizar requerir puede guardar un archivo de texto contaning un objeto JSON, y crear un intervalo en el servidor para recargar este objeto.

ventajas:

  • hay necesidad de utilizar librerías externas
  • relevante para la producción de (volver a cargar el archivo de configuración en el cambio)
  • fácil de implementar

contras:

  • no se puede volver a cargar un módulo - sólo un JSON que contiene los datos de valores clave

Para las personas que utilizan Vagrant y PhpStorm, archivo observador es un enfoque más rápido

  • desactivar la sincronización inmediata de los archivos para ejecutar el comando sólo en guardar a continuación, crear un espacio para los archivos del * .js y directorios de trabajo y añadir este comando

    vagabundo ssh -c "reinicio /var/www/gadelkareem.com/forever.sh"

donde forever.sh es como

#!/bin/bash

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

Hace poco llegó a esta pregunta porque los sospechosos habituales no estaban trabajando con paquetes enlazados. Si eres como yo y están tomando ventaja de npm link durante el desarrollo de manera eficaz el trabajo en un proyecto que se compone de muchos paquetes, es importante que los cambios que se producen en las dependencias desencadenan una recarga también.

Después de haber probado el nodo-mon y PM2, incluso siguiendo sus instrucciones, además, para ver el node_modules carpeta, que todavía no se recuperó cambios. Aunque hay algunas soluciones personalizadas en las respuestas aquí, para algo como esto, un paquete separado es más limpio. Me encontré con nodo-dev hoy y funciona perfectamente sin ninguna opción o configuración.

Desde el Léame:

  

A diferencia de las herramientas como supervisor o nodemon no analiza el sistema de archivos para los archivos a ser vigilados. En su lugar se engancha a su Node requieren () para ver sólo los archivos que han sido realmente necesarias.

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

se utiliza el servidor dev Hoy en día WebPack con opción caliente. se puede añadir un guión como este en su package.json: "hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",

y cada cambio en sus archivos se disparará automáticamente una recompilación

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top