Introdução
Loop de leitura-avaliação (REPL) é um termo que se refere a um ambiente de computador interativo que recebe a entrada do usuário, a executa e retorna uma saída. Ou seja, o usuário insere uma ou mais expressões, essas expressões são avaliadas e um resultado é exibido.
O fato é, como desenvolvedor, você provavelmente já usou um ambiente REPL antes, sem saber como ele se chama. Exemplos comuns de REPL incluem:
CLI/terminais Ambientes Shell (por exemplo, shell Python, shell MySQL) Consoles de devtool do navegador
Neste artigo, aprenderemos como um REPL funciona internamente, como usar o Node. js REPL embutido e, finalmente, como configurar um ambiente REPL personalizado em Node.js.
Como funciona o REPL
A ideia por trás de como funciona um REPL é bastante direta. Primeiro, ele lê um trecho ou bloco de código inserido pelo usuário e, em seguida, avalia esse código. Após a conclusão do processo de avaliação, a saída resultante é impressa para o usuário e este processo é repetido (em loop) até que o usuário sinalize para sair.
O REPL do Node.js
Node.js é fornecido com um ambiente REPL que permite que você teste e explore rapidamente o código JavaScript sem ter que armazená-lo em um arquivo.
Antes de executar isso, você precisa ter Node.js instalado em sua máquina de desenvolvimento; você pode instalar o Node.js seguindo as instruções aqui .
Se você já tem o Node.js instalado, você não precisa instalar nenhum software adicional, e você pode iniciar o ambiente REPL digitando o comando abaixo em seu terminal:
node
Dependendo da versão do Node que você instalou, você deve ver uma saída que é semelhante ao seguinte:
O sinal > exibido no console significa que o REPL agora está ativo e você pode inserir qualquer código JavaScript para ser avaliado imediatamente.
Vamos experimentar usando o método global console.log para imprimir “Olá, mundo”. Digite o código abaixo em seu Nó REPL:
console.log (“Hello World & # x1f44b;”);
Você deve ver a seguinte saída exibida:
Criando um REPL personalizado em Node.js
O Node.js também permite que os desenvolvedores criem e usem REPL com o módulo repl . Este é o mesmo pacote que foi usado para criar o REPL padrão fornecido com o Node.js, portanto, ele fornece todas as opções de personalização de que podemos precisar.
Além disso, este é um módulo embutido. Ou seja, podemos usá-lo sem nenhuma instalação adicional.
Para importar o módulo em nosso programa:
const repl=require (‘repl’);
Iniciando um REPL
Podemos criar uma nova instância repl com o método repl.start (). Este método aceita dois parâmetros-o primeiro é a string usada para o prompt de seu REPL (e o padrão é > ), enquanto o segundo é o fluxo (entrada do usuário) que o REPL escuta.
Para experimentar, crie um novo arquivo (app.js) e cole o seguinte código:
const repl=require (“repl”); repl.start (“custom-repl=>”);
Salve o arquivo e, em sua CLI , execute o código:
node app.js
Você deve ver a seguinte saída:
E, sim, isso funciona da mesma maneira que o Node REPL padrão. Você pode tentar inserir o código JavaScript básico-como console.log (“Hello world”)-em seu REPL e deverá ver a saída exibida.
Escopo global e local
Por padrão, a nova instância REPL tem acesso a todas as variáveis declaradas no escopo global do Node.js, e também é possível expor uma variável local ao REPL atribuindo-a explicitamente ao objeto de contexto:
const repl=require (“repl”);/* isso pode ser acessado diretamente de repl sem expô-lo ao contexto repl */global.globalVariable=”Isso pode ser acessado em qualquer lugar!”; nome const=”John Doe”;//expondo a variável local ao contexto repl repl.start (“custom-repl=>”).context.name=name;
Além disso, as variáveis expostas ao contexto repl não são somente leitura por padrão e podem ser modificadas diretamente no ambiente REPL. Podemos mudar isso definindo as propriedades de contexto como a seguir:
const repl=require (“repl”); nome const=”John Doe”; const r=repl.start (“custom-repl=>”); Object.defineProperty (r.context,”nome”, {configurável: falso, enumerável: verdadeiro, valor: nome,});
Funções de avaliação personalizadas
O módulo REPL também permite criar uma função de avaliação personalizada; ou seja, a função a ser usada ao avaliar cada linha de entrada fornecida. Isso pode ser útil quando você está tentando construir aplicativos REPL totalmente personalizados.
Abaixo está um exemplo que verifica se a entrada do usuário é um número par ou ímpar e imprime a respectiva saída com base na entrada:
const repl=require (“repl”); function isEven (uInput, context, filename, callback) {callback (null, uInput% 2==0?”Número par”:”número ímpar”); } repl.start ({prompt:”custom-repl=>”, eval: isEven});
Personalizando a saída REPL
Também podemos personalizar as saídas retornadas de nosso REPL passando uma nova função para a opção gravador ao criar uma nova instância repl.
O código abaixo capitaliza a saída retornada de nosso exemplo anterior e usando npm módulo colors.js , ele também muda a cor do texto para vermelho:
const repl=require (“repl”); cores constantes=requerem (“cores”); const r=repl.start ({prompt:”custom-repl=>”, eval: isEven, writer: modifyOutput}); function isEven (uInput, context, filename, callback) {callback (null, uInput% 2==0?”Número par”:”número ímpar”); } função modifyOutput (output) {return output.toUpperCase (). red; }
E esta é a aparência da saída:
Fechando um REPL
Embora você possa interromper a execução do ambiente REPL pressionando Ctrl + C ou inserindo o comando.exit diretamente, você também pode fazer isso programaticamente com o método repl.close ():
Abaixo está um exemplo que fecha o REPL automaticamente após cinco segundos:
const repl=requer (“repl”); const r=repl.start (“custom-repl=>”); setTimeout (()=> {r.close ();}, 5000);
Conclusão
REPL é um ambiente de computador interativo que recebe a entrada do usuário, a executa e retorna uma saída. REPL também é uma ótima alternativa para editores de texto se você deseja explorar exemplos de código sem ter que armazená-los em um arquivo.
E neste artigo, aprendemos como um REPL funciona internamente, como usar o ambiente REPL embutido do Node e, finalmente, como criar um REPL personalizado no Node.js.