Guia do Node.js, parte 2: JavaScript, V8, alguns truques de desenvolvimento

Ao publicar a primeira parte da tradução deste guia no Node.js, decidimos descobrir a opinião do público sobre se devemos continuar trabalhando no projeto e realizamos uma pequena pesquisa. Como se viu, aproximadamente 94% dos que votaram apoiaram nossa iniciativa. Portanto, conheça a segunda parte do tutorial Node.js.



Hoje, falaremos sobre o tipo de conhecimento de JS que você precisa ter para desenvolver aplicativos com eficiência na plataforma Node.js. discutiremos as diferenças entre o código JavaScript do navegador e o servidor e falaremos sobre os mecanismos JS e algumas técnicas de desenvolvimento do Node.js.


Que tipo de conhecimento de JS eu preciso para o desenvolvimento do Node.js.


Suponha que você acabou de começar a programar. Qual a profundidade necessária para aprender JavaScript para dominar o Node.js com êxito? É difícil para um iniciante atingir esse nível quando ganha confiança suficiente em suas habilidades profissionais. Além disso, ao estudar programação, você pode achar que não entende exatamente onde o JavaScript do navegador termina e o desenvolvimento do Node.js. começa.

Se você está no começo do caminho de um programador JavaScript, aconselho você, antes de escrever para o Node.js, a dominar bem os seguintes conceitos de linguagem:

  • Construções lexicais.
  • Expressões.
  • Tipos.
  • Variáveis
  • Funções
  • Esta palavra-chave.
  • Funções de seta
  • Ciclos
  • Escopos.
  • Matrizes
  • Sequências de modelos.
  • Aplique um ponto e vírgula.
  • Trabalhe em modo estrito.

De fato, esta lista continua, mas se você dominar tudo, significa que você estabelecerá uma boa base para o desenvolvimento produtivo de clientes e servidores em JavaScript.
Os seguintes conceitos de linguagem também são muito importantes para entender as idéias de programação assíncrona, que são uma das partes básicas do Node.js. Em particular, estamos falando sobre o seguinte:

  • Programação assíncrona e funções de retorno de chamada.
  • Temporizadores.
  • Promessas.
  • Construção assíncrona / aguardada.
  • Curto-circuito.
  • Ciclo de eventos.

Existem muitos materiais JavaScript que permitem que os iniciantes aprendam o idioma. Por exemplo, aqui está o curso de treinamento do autor para este guia, aqui está uma seção muito útil do MDN, aqui está o tutorial para javascript.ru. Você pode aprender mecanismos básicos de JavaScript em freecodecamp.com .

Acima, falamos sobre como os iniciantes podem se preocupar com a questão de onde está o limite entre o desenvolvimento do JavaScript do servidor e do cliente. Vamos conversar sobre isso.

Diferenças entre a plataforma Node.js e o navegador


Como o desenvolvimento JS para Node.js é diferente da programação do navegador? A semelhança entre esses ambientes é que a mesma linguagem é usada lá e ali. Mas o desenvolvimento de aplicativos projetados para serem executados em um navegador é muito diferente do desenvolvimento de aplicativos de servidor. Apesar de usar a mesma linguagem, existem algumas diferenças importantes que transformam esses dois tipos de desenvolvimento em atividades completamente diferentes.

Deve-se notar que, se alguém que costumava fazer o trabalho de front-end começa a aprender o Node.js., ele tem uma oportunidade muito séria de dominar rapidamente tudo o que é necessário, devido ao fato de escrever em um idioma que já conhece. Se a necessidade de aprender um novo ambiente for adicionada e a necessidade de aprender um novo idioma, a tarefa será muito mais complicada.
Portanto, a principal diferença entre o cliente e o servidor é o ambiente para o qual você deve programar, nos ecossistemas desses ambientes.

No navegador, a maior parte do trabalho recai sobre várias operações com documentos da web por meio do DOM, bem como o uso de outras APIs da plataforma da web, como, por exemplo, mecanismos para trabalhar com cookies. O Node.js, é claro, tem tudo isso. Não há objeto de document , objeto de window e outros objetos fornecidos pelo navegador.

O navegador, por sua vez, não possui os mecanismos de software disponíveis no ambiente Node.js. e existe na forma de módulos que podem ser conectados ao aplicativo. Por exemplo, esta é uma API para acessar o sistema de arquivos.

Outra diferença entre o desenvolvimento de clientes e servidores em JS é que, ao trabalhar em um ambiente Node.js., o desenvolvedor tem controle total sobre o ambiente. A menos que você esteja desenvolvendo um aplicativo de código aberto que possa ser executado em qualquer lugar, você sabe exatamente, por exemplo, em qual versão do Node.js o seu projeto trabalhará. Isso é muito conveniente se comparado ao ambiente do cliente em que seu código precisa funcionar no navegador do usuário. Além disso, isso significa que você pode, sem medo de problemas, usar os recursos mais recentes do idioma.

Como o JavaScript está se desenvolvendo extremamente rápido, os navegadores simplesmente não têm tempo suficiente para implementar rapidamente todas as suas inovações. Além disso, nem todos os usuários trabalham nas versões mais recentes dos navegadores. Como resultado, os desenvolvedores que desejam usar algo novo em seus programas são forçados a levar isso em conta, cuidar da compatibilidade de seus aplicativos com os navegadores que usam, o que pode resultar na necessidade de abandonar os recursos modernos do JavaScript. Obviamente, é possível usar o transportador Babel para converter o código em um formato compatível com o padrão EcmaScript 5, suportado por todos os navegadores, mas você não precisará disso ao trabalhar com o Node.js.

Outra diferença entre o Node.js e os navegadores é que o Node.js usa o sistema do módulo CommonJS , enquanto nos navegadores você pode ver o início da implementação do padrão ES Modules. Na prática, isso significa que atualmente no Node.js., a construção require() é usada para conectar código externo e import no código do navegador.

V8 e outros mecanismos JavaScript


V8 é o nome do mecanismo JavaScript usado no navegador Google Chrome. É ele quem é responsável pela execução do código JavaScript, que entra no navegador quando se trabalha na Internet. V8 fornece um tempo de execução para JavaScript. O DOM e outras APIs da plataforma da web são fornecidas pelo navegador.

O mecanismo JS é independente do navegador em que é executado. É esse fato que possibilitou o surgimento e o desenvolvimento da plataforma Node.js. O V8 foi escolhido como o mecanismo para o Node.js em 2009. Como resultado do crescimento explosivo da popularidade, o Node.js V8 acabou sendo um mecanismo que agora é responsável por executar uma enorme quantidade de código JS do lado do servidor.

O ecossistema do Node.js é enorme. Graças a isso, o V8 também é usado, através de projetos como o Electron , para desenvolver aplicativos de desktop.

Note-se que, além do V8, existem outros mecanismos:


A lista de mecanismos JS não se limita a isso.

Esses mecanismos implementam a especificação ECMA-262, também chamada de ECMAScript. É essa especificação que padroniza o JavaScript. A versão mais recente do padrão pode ser encontrada aqui .

Desenvolvimento do motor SJS e aspiração de desempenho


O mecanismo V8 é escrito em C ++, sendo constantemente aprimorado. Pode ser executado em muitos sistemas, particularmente Mac, Windows e Linux. Aqui não falaremos sobre os detalhes da implementação do V8. Informações sobre eles podem ser encontradas em outras publicações, inclusive no site oficial da V8 . Eles mudam com o tempo, às vezes muito a sério.

V8 está em constante evolução, o mesmo pode ser dito de outros motores. Isso leva, em particular, a um aumento no desempenho dos navegadores da web e da plataforma Node.js. Os fabricantes de motores de navegadores estão constantemente competindo, lutando pela velocidade de execução do código, isso ocorre há muitos anos. Tudo isso é benéfico para usuários e programadores.

▍ Interpretação e compilação


O JavaScript é considerado uma linguagem interpretada, mas os mecanismos modernos estão longe de interpretar apenas o código JS. Eles o compilam. Essa tendência pode ser observada desde 2009, quando o compilador JavaScript foi adicionado no Firefox 3.5, após o qual outros fabricantes de mecanismos e navegadores adotaram essa idéia.

V8 compila JavaScript para melhorar o desempenho do código. Desde o advento do Google Maps em 2004, o JavaScript evoluiu, evoluiu de uma linguagem na qual, para implementar os recursos interativos de aplicativos da Web, eles geralmente escreviam algumas dezenas de linhas, em uma linguagem na qual os aplicativos de navegador compostos por milhares ou mesmo centenas são escritos. mil linhas de código. Esses aplicativos podem ser executados por horas no navegador, o que é muito diferente dos antigos cenários de uso de JS, o código no qual, por exemplo, só poderia ser usado para verificar a correção dos dados inseridos nos formulários. Em condições modernas, compilar o código faz muito sentido, porque, embora a execução dessa etapa possa atrasar o momento em que o código é lançado, após a compilação, o código é muito mais produtivo do que aquele que seria processado exclusivamente pelo intérprete e funcionaria mais rápido, mas funcionaria mais lentamente.

Agora, tendo discutido algumas disposições sobre mecanismos JS, interpretação e compilação de código, vamos continuar praticando. Ou seja, vamos falar sobre como desligar os aplicativos Node.js.

Saindo do aplicativo Node.js.


Existem várias maneiras de desligar os aplicativos Node.js.

Portanto, ao executar um programa no console, você pode finalizar seu trabalho usando o atalho de teclado ctrl+c . Mas estamos mais interessados ​​em métodos de software para desligar aplicativos. E começaremos, talvez, com o comando mais rude para sair do programa, o que, como você agora entenderá, é melhor não usá-lo.

O módulo de process kernel fornece um método conveniente que permite sair programaticamente de um aplicativo Node.js. É assim:

 process.exit() 

Quando o Node.js encontra esse comando no código, isso leva ao fato de que seu processo termina instantaneamente. Isso significa que absolutamente tudo o que o programa fez será bastante rude e incondicionalmente interrompido. Estamos falando de retornos de chamada não convidados, sobre solicitações de rede sendo executadas no momento do lançamento, sobre ações com arquivos, sobre operações de gravação em stdout ou stderr .

Se essa situação lhe convier, você pode usar este método. Quando você o chama, pode transmitir um número inteiro que será percebido pelo sistema operacional como o código de saída do programa.

 process.exit(1) 

Por padrão, esse código é definido como 0, o que significa conclusão bem-sucedida. Outros códigos de saída têm significados diferentes, que podem ser úteis para usá-los em seu próprio sistema para estabelecer a interação de alguns programas com outros.
Detalhes sobre os códigos de desligamento do programa podem ser encontrados aqui .

Você também pode atribuir um código de saída à propriedade process.exitCode . É assim:

 process.exitCode = 1 

Após o término do programa, o Node.js retornará esse código ao sistema.

Deve-se notar que o trabalho do programa terminará naturalmente por si só depois de executar todas as ações especificadas nele. No entanto, no caso do Node.js, geralmente existem programas que, em condições ideais, são projetados para funcionar por tempo indeterminado. Estamos falando, por exemplo, sobre servidores HTTP como este:

 const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hi!') }) app.listen(3000, () => console.log('Server ready')) 

Tal programa, se nada acontecer, em teoria, pode funcionar para sempre. Nesse caso, se você chamar process.exit() , as operações executadas por ele no momento da chamada deste comando serão interrompidas. E isso é ruim.

Para concluir o trabalho de tais programas, você precisa usar o sinal SIGTERM e executar as ações necessárias usando o manipulador apropriado.

Observe que, para usar o objeto de process , você não precisa conectar nada usando o require , pois esse objeto está disponível para aplicativos Node.js. por padrão.

Considere o seguinte exemplo:

 const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hi!') }) app.listen(3000, () => console.log('Server ready')) process.on('SIGTERM', () => { app.close(() => {   console.log('Process terminated') }) }) 

O que são sinais? Sinais são um meio de interação entre processos no padrão POSIX (Interface do sistema operacional portátil). São notificações enviadas ao processo para informá-lo sobre determinados eventos.

Por exemplo, um sinal SIGKILL informa ao processo que ele precisa ser desligado imediatamente. Idealmente, funciona exatamente como process.exit() .

O sinal SIGTERM informa ao processo que ele precisa executar um procedimento normal de desligamento. Esses sinais são enviados por gerentes de processo, como upstart ou supervisord , e por muitos outros.

Você pode enviar esse sinal a partir do próprio programa, usando o seguinte comando:

 process.kill(process.pid, 'SIGTERM') 

Para concluir com êxito esse comando, você precisa conhecer o PID processo que planeja concluir.

Lendo variáveis ​​de ambiente do Node.js


O módulo do kernel do process possui a propriedade env , que fornece acesso a todas as variáveis ​​de ambiente definidas no momento em que o processo foi iniciado.

Aqui está um exemplo de trabalho com a variável de ambiente NODE_ENV , que, por padrão, está configurada para development :

 process.env.NODE_ENV // "development" 

Se, antes de executar o script, defina-o como production , isso indicará ao Node.js que o programa está sendo executado em um ambiente de produção.

Da mesma forma, você pode trabalhar com outras variáveis ​​de ambiente, por exemplo, aquelas que você mesmo definiu.

Sumário


Hoje, abordamos questões de programação de navegadores e servidores em JavaScript, conversamos sobre mecanismos JS, como desligar aplicativos de servidor e como ler variáveis ​​de ambiente dos programas Node.js. Da próxima vez, falaremos sobre hospedagem para aplicativos Node.js., como usar o Node.js. no modo REPL, como trabalhar com argumentos que podem ser passados ​​para scripts quando chamados, como interagir com o console e como projetar o código como módulos.

Caros leitores! Quais tutoriais de JavaScript você recomendaria para iniciantes?

Source: https://habr.com/ru/post/pt423153/


All Articles