¿Alguna idea sobre cómo podría implementar una recarga automática de archivos en Node.js? Estoy cansado de reiniciar el servidor cada vez que cambio un archivo. Aparentemente, la require()
función de Node.js no vuelve a cargar archivos si ya se han requerido, por lo que necesito 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 tengo:
var file = require('./file');
this.app = function(req, res) {
file.serveFile( req, res, 'file.js');
}
Pero esto tampoco funciona: recibo un error en la process.compile()
declaración que dice que 'requerir' no está definido. process.compile
está evaluando el app.js , pero no tiene idea sobre los nodos globales de node.js.
javascript
node.js
disc0dancer
fuente
fuente
Object.keys(require.cache).forEach(function(key) { delete require.cache[key]; });
Respuestas:
Una buena alternativa actualizada
supervisor
esnodemon
:Para utilizar
nodemon
:fuente
$ nodemon -L yourfile.js
(explicación completa en coderwall.com/p/aqxl_q )automatically restart the server - perfect for development
Es demasiada hipérbole. Recargar el servidor podría significar iniciar sesión en los servicios de backend, lo que en mi caso lleva mucho tiempo. "Perfecto para el desarrollo" sería algo así como recargar en caliente las clases mientras el proceso se ejecuta en la memoria sin perder el estado al igual que lo que hace Android Studio cuando cambia el código fuente.npm install [--save-dev | -D] nodemon
para limitar la instalación al alcance del proyecto.supervisor de nodo es increíble
uso para reiniciar al guardar:
por isaacs - http://github.com/isaacs/node-supervisor
fuente
"C:\Program Files\nodejs\node.exe" C:\Users\Mark\AppData\Roaming\npm\node_modules\supervisor\lib\cli-wrapper.js app.js
npm install supervisor
,node node_modules/supervisor/lib/cli-wrapper.js app.js
(tengo una instalación no root de Node)PATH
Encontré una manera simple:
fuente
delete require.cache[require.resolve('./mymodule.js')];
resolver acuerdo con caminos reales===
Si alguien aún llega a esta pregunta y quiere resolverla usando solo los módulos estándar, hice un ejemplo simple:
Este ejemplo es solo para un archivo (server.js), pero se puede adaptar a múltiples archivos usando una matriz de archivos, un bucle for para obtener todos los nombres de archivos o mirando un directorio:
Este código se creó para la API Node.js 0.8, no está adaptado para algunas necesidades específicas, pero funcionará en algunas aplicaciones simples.
ACTUALIZACIÓN: Este funcional se implementa en mi módulo simpleR , repositorio de GitHub
fuente
watch
no se necesita el , la recarga se puede realizar sinfs
escuchar una señal diferente.nodemon apareció primero en una búsqueda de google, y parece que funciona:
fuente
Hay Node-Supervisor que puede instalar por
ver http://github.com/isaacs/node-supervisor
fuente
Editar: mi respuesta es obsoleta. Node.js es una tecnología que cambia muy rápido.
También me preguntaba sobre la recarga de módulos. Modifiqué node.js y publiqué la fuente en Github en nalply / node . La única diferencia es la función
require
. Tiene un segundo argumento opcionalreload
.Para recargar
app.js
en el directorio actual useEscribe algo como esto, y tienes auto- recarga:
El único problema que veo es la variable
module
, pero ahora estoy trabajando en ello.fuente
nodemon
es genial Solo agrego más parámetros para depurar y ver las opciones.package.json
El comando:
nodemon --watch server --inspect ./server/server.js
Mientras:
--watch server
Reinicia la aplicación cuando se cambia.js
,.mjs
,.coffee
,.litcoffee
, y.json
los archivos de laserver
carpeta (incluidas las subcarpetas).--inspect
Habilitar depuración remota../server/server.js
El punto de entrada.Luego agregue la siguiente configuración a
launch.json
(Código VS) y comience a depurar en cualquier momento.Tenga en cuenta que es mejor instalar
nodemon
como dependencia de desarrollo del proyecto. Por lo tanto, los miembros de su equipo no necesitan instalarlo o recordar los argumentos del comando, simplementenpm run dev
comienzan a hackear.Ver más en
nodemon
documentos: https://github.com/remy/nodemon#monitoring-multiple-directoriesfuente
Hubo un hilo reciente sobre este tema en la lista de correo de node.js. La respuesta corta es no, actualmente no es posible recargar automáticamente los archivos requeridos, pero varias personas han desarrollado parches que agregan esta característica.
fuente
otra solución para este problema es usar para siempre
fuente
node-dev funciona muy bien. npm
install node-dev
Incluso da una notificación de escritorio cuando el servidor se vuelve a cargar y dará éxito o errores en el mensaje.
Inicie su aplicación en la línea de comandos con:
node-dev app.js
fuente
Aquí hay una publicación de blog sobre Hot Reloading for Node. Proporciona una rama de nodo github que puede usar para reemplazar su instalación de Nodo para habilitar la Recarga en Caliente.
Desde el blog:
fuente
Estoy trabajando en hacer una "cosa" de nodo bastante pequeña que sea capaz de cargar / descargar módulos a voluntad (es decir, podría reiniciar parte de su aplicación sin cerrar toda la aplicación). Estoy incorporando una gestión de dependencia (muy estúpida), de modo que si desea detener un módulo, también se detendrán todos los módulos que dependen de eso.
Hasta ahora todo bien, pero luego me topé con el problema de cómo volver a cargar un módulo. Aparentemente, uno podría simplemente eliminar el módulo de la caché "require" y hacer el trabajo. Como no estoy interesado en cambiar directamente el código fuente del nodo, se me ocurrió un truco muy hacky: buscar en la pila rastrear la última llamada a la función "require", tomar una referencia a su campo "cache" y ... bueno, elimine la referencia al nodo:
Aún más fácil, en realidad:Aparentemente, esto funciona bien. No tengo ni idea de lo que significan esos argumentos ["1"], pero está haciendo su trabajo. Creo que los nodos implementarán una instalación de recarga algún día, así que supongo que por ahora esta solución también es aceptable. (por cierto, mi "cosa" estará aquí: https://github.com/cheng81/wirez , ve allí en un par de semanas y deberías ver de qué estoy hablando)
fuente
function (module, require) { /* your code */ }
. Cuando tiene esto en cuenta,arguments[1]
apunta arequire
. Y el ciclo while está ahí para situaciones en las que se llama desde otra función en un módulo (simplemente sube la jerarquía de funciones y verifica los valores de argumento pasados a cada uno).Puede usar nodemon de NPM . Y si está utilizando el generador Express, puede usar este comando dentro de la carpeta de su proyecto:
o usando el modo de depuración
también puedes correr directamente
Espero que esto ayude.
fuente
solución en: http://github.com/shimondoodkin/node-hot-reload
Tenga en cuenta que debe tener cuidado usted mismo de las referencias utilizadas.
eso significa que si lo hiciste: var x = require ('foo'); y = x; z = x.bar; y caliente lo volvió a cargar.
significa que debe reemplazar las referencias almacenadas en x, y y z. en la función de reaload callback caliente.
Algunas personas confunden la recarga en caliente con el reinicio automático. si tiene una aplicación pequeña, el reinicio automático está bien, pero cuando tiene una aplicación grande, la recarga en caliente es más adecuada. simplemente porque la recarga en caliente es más rápida.
También me gusta mi módulo de entrada de nodo.
fuente
No es necesario usar nodemon u otras herramientas como esa. Simplemente use las capacidades de su IDE.
Probablemente es mejor IntelliJ WebStorm con componente de renovación caliente (servidor de recarga automática y navegador) para Node.js .
fuente
Aquí hay un método de baja tecnología para usar en Windows. Ponga esto en un archivo por lotes llamado
serve.bat
:Ahora, en lugar de ejecutar
node app.js
desde su shell de cmd, ejecuteserve app.js
.Esto abrirá una nueva ventana de shell que ejecuta el servidor. El archivo por lotes se bloqueará (debido a
/wait
) hasta que cierre la ventana del shell, en cuyo momento el shell de cmd original preguntará "¿Terminar el trabajo por lotes (S / N)?" Si responde "N", el servidor se reiniciará.Cada vez que desee reiniciar el servidor, cierre la ventana del servidor y responda "N" en el shell de cmd.
fuente
la estructura de mi aplicación
primero instale reload con este comando:
luego cambie package.json :
ahora debe usar reload en su archivo de servidor :
y para el último cambio, al final de su respuesta envíe este script :
ahora inicie su aplicación con este código:
fuente
Utilizar este:
Todo lo que tienes que hacer ahora es:
Y la configuración se volverá a cargar automáticamente :)
fuente
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
cuál será llamado cuando se cambie el archivo.Maneja situaciones donde los archivos son lo suficientemente grandes como para ser
watch
llamados antes de que terminen de escribir.Lo he estado usando en proyectos durante un año más o menos, y recientemente le agregué promesas.
¡Ayúdame a luchar, pruébalo!
https://github.com/danschumann/loaddir
fuente
Puede usar la recarga automática para volver a cargar el módulo sin apagar el servidor.
Instalar en pc
ejemplo
data.json
test.js
Resultado:
fuente
Otra solución simple es usar fs.readFile en lugar de usar require , puede guardar un archivo de texto que contenga un objeto json y crear un intervalo en el servidor para recargar este objeto.
pros:
contras:
fuente
Para las personas que usan Vagrant y PHPStorm, el observador de archivos es un enfoque más rápido
deshabilite la sincronización inmediata de los archivos para que ejecute el comando solo en guardar y luego cree un ámbito para los archivos * .js y directorios de trabajo y agregue este comando
ssh vagabundo -c "/var/www/gadelkareem.com/forever.sh restart"
donde forever.sh es como
fuente
Recientemente llegué a esta pregunta porque los sospechosos habituales no estaban trabajando con paquetes vinculados. Si eres como yo y aprovechas
npm link
durante el desarrollo para trabajar eficazmente en un proyecto que se compone de muchos paquetes, es importante que los cambios que ocurren en las dependencias también desencadenen una recarga.Después de haber probado node-mon y pm2, incluso siguiendo sus instrucciones para ver adicionalmente la carpeta node_modules, aún no recogieron los cambios. Aunque hay algunas soluciones personalizadas en las respuestas aquí, para algo como esto, un paquete separado es más limpio. Me encontré con node-dev hoy y funciona perfectamente sin ninguna opción o configuración.
Del Léame:
fuente
fuente
Puede hacerlo con la actualización del navegador . Su aplicación de nodo se reinicia automáticamente, su página de resultados en el navegador también se actualiza automáticamente. Lo malo es que tienes que poner el fragmento js en la página generada. Aquí está el repositorio para el ejemplo de trabajo.
fuente
He intentado pm2 : la instalación es fácil y fácil de usar también; El resultado es satisfactorio. Sin embargo, tenemos que ocuparnos de la edición de pm2 que queremos. pm 2 runtime es la edición gratuita, mientras que pm2 plus y pm2 enterprise no son gratuitas.
En cuanto a Strongloop , mi instalación falló o no se completó, por lo que no pude usarla.
fuente
Hoy en día se usa el servidor de desarrollo WebPack con la opción hot. puedes agregar un script como este en tu package.json:
"hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",
y cada cambio en sus archivos desencadenará una recompilación automáticamente
fuente