Alguma idéia de como eu poderia implementar um recarregamento automático de arquivos no Node.js. Estou cansado de reiniciar o servidor toda vez que altero um arquivo. Aparentemente, a require()
função Node.js. não recarrega os arquivos se eles já tiverem sido solicitados, por isso preciso fazer algo assim:
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 );
E no arquivo app.js eu tenho:
var file = require('./file');
this.app = function(req, res) {
file.serveFile( req, res, 'file.js');
}
Mas isso também não está funcionando - eu recebo um erro na process.compile()
declaração dizendo que 'require' não está definido. process.compile
está avaliando o app.js , mas não tem idéia sobre os globais do node.js.
javascript
node.js
disc0dancer
fonte
fonte
Object.keys(require.cache).forEach(function(key) { delete require.cache[key]; });
Respostas:
Uma boa alternativa atualizada
supervisor
énodemon
:Para usar
nodemon
:fonte
$ nodemon -L yourfile.js
(explicação completa no coderwall.com/p/aqxl_q )automatically restart the server - perfect for development
é muito hipérbole. Recarregar servidor pode significar fazer login em serviços de back-end, o que leva muito tempo no meu caso. "Perfeito para o desenvolvimento" seria algo como classes de recarga a quente enquanto o processo está em execução na memória sem perder o estado do que o android studio faz quando você altera o código-fonte.npm install [--save-dev | -D] nodemon
para limitar a instalação ao escopo do projeto.supervisor de nó é impressionante
uso para reiniciar ao salvar:
por isaacs - http://github.com/isaacs/node-supervisor
fonte
"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
(eu tenho uma instalação não-raiz do Node)PATH
eu encontrei uma maneira simples:
fonte
delete require.cache[require.resolve('./mymodule.js')];
negócio resolve com caminhos reais===
Se alguém ainda chega a essa pergunta e quer resolvê-la usando apenas os módulos padrão, fiz um exemplo simples:
Este exemplo é apenas para um arquivo (server.js), mas pode ser adaptado a vários arquivos usando uma matriz de arquivos, um loop for para obter todos os nomes de arquivos ou assistindo a um diretório:
Este código foi criado para a API Node.js 0.8, não está adaptado para algumas necessidades específicas, mas funcionará em alguns aplicativos simples.
UPDATE: Esta funcionalidade é implementada no meu módulo simpleR , repositório GitHub
fonte
watch
não for necessário, é possível recarregar semfs
ouvir um sinal diferente.nodemon surgiu primeiro em uma pesquisa no google, e parece fazer o truque:
fonte
Há um Node-Supervisor que você pode instalar
consulte http://github.com/isaacs/node-supervisor
fonte
Edit: Minha resposta é obsoleta. O Node.js é uma tecnologia que muda muito rapidamente.
Também me perguntei sobre recarregar módulos. Modifiquei o node.js e publiquei a fonte no Github em nalply / node . A única diferença é a função
require
. Ele tem um segundo argumento opcionalreload
.Para recarregar
app.js
no diretório atual, useEscreva algo como isto e você terá o recarregamento automático :
O único problema que vejo é a variável
module
, mas estou trabalhando nisso agora.fonte
nodemon
é ótimo. Acabei de adicionar mais parâmetros para opções de depuração e observação.package.json
O comando:
nodemon --watch server --inspect ./server/server.js
Enquanto que:
--watch server
Reinicie o aplicativo ao mudar.js
,.mjs
,.coffee
,.litcoffee
, e.json
arquivos naserver
pasta (incluído subpastas).--inspect
Ativar depuração remota../server/server.js
O ponto de entrada.Em seguida, adicione a seguinte configuração em
launch.json
(Código VS) e comece a depurar a qualquer momento.Observe que é melhor instalar
nodemon
como dependência de desenvolvimento do projeto. Para que os membros da sua equipe não precisem instalá-lo ou lembre-se dos argumentos de comando, eles apenasnpm run dev
começam a invadir.Veja mais em
nodemon
documentos: https://github.com/remy/nodemon#monitoring-multiple-directoriesfonte
Houve um tópico recente sobre esse assunto na lista de discussão node.js. A resposta curta é não, atualmente não é possível recarregar automaticamente os arquivos necessários, mas várias pessoas desenvolveram patches que adicionam esse recurso.
fonte
ainda outra solução para esse problema está usando para sempre
fonte
O node-dev funciona muito bem. npm
install node-dev
Ele também fornece uma notificação na área de trabalho quando o servidor é recarregado e fornece êxito ou erros na mensagem.
inicie seu aplicativo na linha de comando com:
node-dev app.js
fonte
Aqui está uma postagem de blog sobre o Hot Reloading for Node. Ele fornece uma ramificação do nó do github que você pode usar para substituir sua instalação do nó e ativar o recarregamento a quente.
Do blog:
fonte
Estou trabalhando para criar uma "coisa" de nó bastante pequeno que seja capaz de carregar / descarregar módulos à vontade (por exemplo, você poderá reiniciar parte do seu aplicativo sem desativar o aplicativo inteiro). Estou incorporando um gerenciamento de dependências (muito estúpido), de modo que, se você quiser parar um módulo, todos os módulos que dependem disso também serão parados.
Até agora tudo bem, mas então me deparei com a questão de como recarregar um módulo. Aparentemente, pode-se remover o módulo do cache "require" e concluir o trabalho. Desde que eu não estou interessado em alterar diretamente o código-fonte nó, eu vim com uma muito hacky-hack que é: procure no rastreamento de pilha a última chamada para a "exigir" função, pegue uma referência ao campo que é "cache" e..bem, exclua a referência para o nó:
Ainda mais fácil, na verdade:Aparentemente, isso funciona muito bem. Não tenho absolutamente nenhuma idéia do que esses argumentos ["1"] significam, mas está fazendo seu trabalho. Eu acredito que o pessoal do nó implementará um recurso de recarga algum dia, então acho que por enquanto essa solução também é aceitável. (btw. minha "coisa" estará aqui: https://github.com/cheng81/wirez , vá lá em algumas semanas e você deverá ver do que estou falando)
fonte
function (module, require) { /* your code */ }
. Quando você leva isso em consideração,arguments[1]
aponta pararequire
. E o loop while está lá para situações em que você chama isso de dentro de outra função em um módulo (ele simplesmente sobe na hierarquia de funções e verifica os valores dos argumentos passados para cada).Você pode usar o nodemon do NPM . E se você estiver usando o gerador Express, poderá usar este comando dentro da pasta do projeto:
ou usando o modo de depuração
você também pode executar diretamente
Espero que esta ajuda.
fonte
solução em: http://github.com/shimondoodkin/node-hot-reload
observe que você deve cuidar das referências usadas.
isso significa que se você fez: var x = require ('foo'); y = x; z = x.bar; e quente recarregado.
isso significa que você deve substituir as referências armazenadas em x, ye z. na função de retorno de chamada reaload quente.
algumas pessoas confundem recarga a quente com reinicialização automática, o módulo nodejs-autorestart também possui integração inicial para permitir o início automático na inicialização. se você tiver um pequeno aplicativo, a reinicialização automática é boa, mas quando você tem um aplicativo grande, a recarga a quente é mais adequada. simplesmente porque a recarga a quente é mais rápida.
Também gosto do meu módulo de entrada de nós.
fonte
Não é necessário usar nodemon ou outras ferramentas como essa. Basta usar os recursos do seu IDE.
Provavelmente melhor é IntelliJ WebStorm com característica de recarga quente (servidor automático e recarga browser) para node.js .
fonte
Aqui está um método de baixa tecnologia para uso no Windows. Coloque isso em um arquivo em lotes chamado
serve.bat
:Agora, em vez de executar
node app.js
no seu cmd shell, executeserve app.js
.Isso abrirá uma nova janela do shell executando o servidor. O arquivo em lote será bloqueado (por causa do
/wait
) até que você feche a janela do shell; nesse momento, o cmd original perguntará "Terminar trabalho em lotes (S / N)?" Se você responder "N", o servidor será reiniciado.Sempre que desejar reiniciar o servidor, feche a janela do servidor e responda "N" no shell do cmd.
fonte
minha estrutura de aplicativos:
primeiro instale o recarregamento com este comando:
altere package.json :
agora você deve usar recarregar no arquivo do servidor :
e para a última alteração, final da sua resposta envie este script :
agora inicie seu aplicativo com este código:
fonte
Usa isto:
Tudo o que você precisa fazer agora é:
E a configuração será recarregada automaticamente :)
fonte
loaddir é a minha solução para carregamento rápido de um diretório, recursivamente.
pode retornar
{ 'path/to/file': 'fileContents...' }
ou{ path: { to: { file: 'fileContents'} } }
Tem o
callback
que será chamado quando o arquivo for alterado.Ele lida com situações em que os arquivos são grandes o suficiente para serem
watch
chamados antes de terminar a gravação.Uso-o em projetos há um ano ou mais e recentemente acrescentei promessas a ele.
Ajude-me a testá-lo!
https://github.com/danschumann/loaddir
fonte
Você pode usar o recarregamento automático para recarregar o módulo sem desligar o servidor.
instalar
exemplo
data.json
test.js
Resultado:
fonte
outra solução simples é usar fs.readFile em vez de exigir que você possa salvar um arquivo de texto contendo um objeto json e criar um intervalo no servidor para recarregar esse objeto.
profissionais:
contras:
fonte
Para pessoas que usam o Vagrant e o PHPStorm, o observador de arquivos é uma abordagem mais rápida
desative a sincronização imediata dos arquivos para que você execute o comando apenas em save, crie um escopo para os arquivos * .js e diretórios de trabalho e adicione este comando
vagrant ssh -c "/var/www/gadelkareem.com/forever.sh restart"
onde forever.sh é como
fonte
Recentemente, cheguei a essa pergunta porque os suspeitos comuns não estavam trabalhando com pacotes vinculados. Se você é como eu e está aproveitando
npm link
durante o desenvolvimento para trabalhar efetivamente em um projeto que é composto por muitos pacotes, é importante que as alterações que ocorrem nas dependências disparem uma recarga também.Depois de tentar o node-mon e o pm2, mesmo seguindo as instruções para assistir adicionalmente à pasta node_modules, eles ainda não capturaram as alterações. Embora existam algumas soluções personalizadas nas respostas aqui, para algo assim, um pacote separado é mais limpo. Encontrei o node-dev hoje e funciona perfeitamente sem opções ou configurações.
No Leiame:
fonte
fonte
Você pode fazer isso com a atualização do navegador . Seu aplicativo do nó é reiniciado automaticamente, sua página de resultados no navegador também é atualizada automaticamente. A desvantagem é que você deve colocar o snippet js na página gerada. Aqui está o repo para o exemplo de trabalho.
fonte
Eu tentei o pm2 : a instalação também é fácil e fácil de usar; o resultado é satisfatório. No entanto, precisamos cuidar de qual edição do pm2 queremos. O pm 2 runtime é a edição gratuita, enquanto o pm2 plus e o pm2 enterprise não são gratuitos.
Quanto ao Strongloop , minha instalação falhou ou não foi concluída, portanto não pude usá-lo.
fonte
Atualmente, o servidor de desenvolvimento WebPack com opção hot é usado. você pode adicionar um script como este em seu package.json:
"hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",
e todas as alterações em seus arquivos acionarão uma recompilação automaticamente
fonte