‫Jonas: Como última parte desta seção, vamos falar
‫sobre como o NODE. Módulos JS realmente funcionam
‫nos bastidores.
‫Em primeiro lugar no NODE. Sistema de módulo
‫JS cada arquivo JavaScript é tratado como um módulo separado.
‫E já brincamos um pouco com
‫os módulos na
‫interseção, 'especialmente usando a função
‫require e exportando dados dos módulos.
‫Portanto, esses são os fundamentos dos módulos JS comuns, que é
‫o sistema de módulos que o nó usa.
‫Porque funciona especialmente bem no servidor.
‫Agora, há também o script ECMA nativo ou sistema
‫de módulo ES com
‫o qual você já deve estar familiarizado,
‫especialmente se você fez meu curso de
‫JavaScript ou se tem escrito
‫JavaScript no front end recentemente.
‫Este sistema de módulo ES de que estava falando foi
‫desenvolvido para funcionar no navegador usando a sintaxe de importação e exportação.
‫Então, eu só queria deixar claro que esses
‫são dois sistemas de módulos diferentes que você
‫verá em
‫diferentes situações, então não se confunda.
‫Também houve tentativas de implementar módulos ES
‫nativos no NODE. JS, 'especialmente usando
‫extensões de arquivo
‫como. mjs.
‫Mas, até agora, não
‫se tornou algo popular de usar.
‫Portanto, a menos que você
‫esteja acompanhando este curso
‫em um futuro distante, provavelmente sempre
‫usará o sistema JS comum com o nó.
‫Agora, você deve estar se perguntando por que no NODE. Cada
‫módulo JS realmente obtém acesso
‫à função require para
‫importar módulos em primeiro lugar.
‫Direito?
‫Quer dizer, não é uma função JavaScript padrão.
‫Então de onde isso vem?
‫E como isso funciona exatamente nos bastidores?
‫Bem, vamos descobrir.
‫Portanto, a questão aqui
‫é: o que acontece cada vez
‫que solicitamos um módulo, chamando a função
‫require com um nome de módulo, é o argumento.
‫Como uma visão geral
‫muito ampla, as etapas a seguir são executadas nos bastidores.
‫Primeiro, o caminho para o módulo
‫necessário é resolvido e o arquivo é carregado.
‫Em seguida, ocorre um processo chamado empacotamento,
‫o
‫código do módulo é executado
‫e as exportações do módulo são retornadas.
‫E, finalmente, todo o módulo é armazenado em cache.
‫Portanto, vamos examinar cada etapa com mais detalhes.
‫Em primeiro lugar, como o node sabe qual arquivo
‫carregar quando precisamos de um módulo?
‫Porque lembre-se, podemos realmente
‫carregar três tipos diferentes de módulos.
‫Módulos principais do Node,
‫nossos próprios módulos ou módulos de terceiros do npm como
‫express, que é a estrutura do nó que
‫usaremos durante a maior parte do curso.
‫Portanto, esse processo é conhecido como resolução do caminho do arquivo.
‫E é assim que funciona.
‫Quando as funções de requerimento recebem o nome do
‫módulo como sua
‫entrada, ela tentará primeiro carregar um módulo principal com esse nome.
‫Como, por exemplo, o módulo http.
‫Ele encontrará automaticamente um caminho para esse módulo e,
‫em seguida, o carregará.
‫Agora, se o caminho começa com um
‫ponto, ou dois
‫pontos, significa que é um módulo de desenvolvedor.
‫Porque indicamos o caminho relativo ao nosso arquivo.
‫Portanto, o node tentará carregar esse arquivo,
‫mas se não houver nenhum arquivo com esse
‫nome, ele procurará por uma pasta
‫e carregará o índice. js se estiver nessa pasta.
‫Portanto, neste exemplo,
‫ele tentará carregar lib / controller. js.
‫Lembre-se de que podemos descartar o ponto
‫js ao exigir um módulo.
‫Caso não haja nenhum arquivo neste
‫caminho, ele tentará
‫então abrir o índice. js da pasta lib / controlador em vez disso.
‫Faz sentido?
‫E, finalmente, se o módulo necessário
‫não for um
‫módulo central nem um módulo de
‫desenvolvedor, o nó assumirá que é um módulo do npm.
‫E lembre-se, em um módulo que carregamos do npm,
‫não precisamos escrever o caminho quando o solicitamos.
‫Apenas o nome
‫do módulo, do jeito que funciona em um módulo principal.
‫Portanto, esses módulos de terceiros são armazenados em
‫uma pasta de módulo de
‫nó, de modo que o nó irá entrar nessa pasta e
‫tentar encontrar um módulo lá e, em seguida, carregá-lo.
‫E, claro, se o arquivo não puder ser encontrado em
‫nenhum lugar, um erro será gerado e a
‫execução do aplicativo será interrompida.
‫Seguindo em frente, depois que o
‫módulo é carregado, o código do módulo é empacotado em
‫uma função especial que nos dará acesso a alguns objetos especiais.
‫Portanto, esta etapa é onde a mágica acontece.
‫É aqui que obtemos a resposta à pergunta:
‫de onde realmente vem a função require e por
‫que temos acesso a ela?
‫É porque o tempo de execução
‫do nodejs tira o
‫código de nosso módulo e o coloca dentro
‫da expressão de função imediatamente chamada, ou IIFE, que você pode ver aqui.
‫Portanto, o node não executa
‫diretamente o código que reescrevo em um arquivo, mas,
‫em vez disso, a função de empacotador que
‫conterá nosso código em seu corpo.
‫Ele também passa os especialistas exigem módulo,
‫nome de arquivo e objetos dir para ele.
‫É por isso que em cada
‫módulo temos acesso
‫automático a coisas como a função require.
‫Portanto, são basicamente como variáveis
‫globais que são injetadas em cada módulo.
‫Agora, ao fazer isso, o nó atinge duas coisas muito importantes.
‫Em primeiro lugar, é claro, é dar aos desenvolvedores
‫acesso a todas essas variáveis de que acabamos de
‫falar, o que é muito útil.
‫Em segundo lugar, ele mantém as variáveis de nível
‫superior que definimos em nossos módulos privadas.
‫Portanto, seu escopo é apenas para o
‫módulo atual, em vez de vazar tudo para o objeto global.
‫Então imagine por
‫um segundo, que declaramos uma variável x em um de nossos
‫módulos e, em seguida, incluímos um módulo npm que também
‫usava uma variável chamada x.
‫Sem esse mecanismo,
‫nossa própria variável seria substituída e
‫o aplicativo inteiro simplesmente não funcionaria.
‫Portanto, cada módulo com seu escopo privado
‫é absolutamente crucial e é obtido por
‫meio desse truque inteligente de agrupar nosso código
‫nessa função especial.
‫Vamos agora dar uma olhada rápida em cada
‫objeto que nosso módulo obtém.
‫Primeiro, a função require,
‫que já conhecemos.
‫Depois, existe um objeto módulo, que
‫é apenas uma referência ao módulo atual e
‫que para nós é
‫o mais importante na hora de exportar dados.
‫O mesmo se aplica ao objeto de
‫exportação que discutiremos em um momento.
‫Finalmente, existem as variáveis de
‫conveniência nome do arquivo e nome do
‫diretório que simplesmente contêm o caminho
‫absoluto para o arquivo
‫do módulo atual, bem como o nome do diretório atual.
‫E é assim que funciona a etapa de empacotamento do carregamento de um módulo.
‫Em seguida, o código no módulo, ou
‫para ser mais preciso,
‫na função de invólucro do módulo,
‫é realmente executado pelo NODE. Tempo de execução JS.
‫Portanto, nada extravagante aqui.
‫Até este ponto,
‫a função require foi chamada com um nome de
‫módulo como o argumento
‫o caminho para o arquivo do módulo foi resolvido no
‫arquivo carregado, todo o código foi empacotado na função
‫wrapper que foi então executada.
‫Agora, é hora de a função
‫require realmente retornar algo.
‫E o que ele retorna são as exportações do módulo necessário.
‫Essas exportações são armazenadas no módulo. exportaçõesobjetos.
‫Pode ser um pouco assim.
‫Portanto, novamente, em cada módulo podemos
‫exportar variáveis, que, no final, serão retornadas pela função require.
‫E fazemos isso atribuindo variáveis ao módulo. exportações ou simplesmente para exportações,
‫onde é apenas
‫um ponteiro para o módulo. exportar.
‫Faremos isso na prática no
‫próximo vídeo, porque eu sei que parece um
‫pouco confuso quando eu digo assim.
‫De qualquer forma, aqui está o que
‫você precisa saber sobre quando usar o módulo. exportar ou apenas exportar.
‫Portanto, se tudo o que você deseja fazer é exportar uma única
‫variável, como uma classe ou uma função,
‫geralmente usa o módulo. exporta e define-o igual
‫à variável que você deseja exportar.
‫Exatamente como neste exemplo.
‫Por
‫outro lado, se você estiver procurando exportar várias
‫variáveis nomeadas como várias funções,
‫por exemplo, você
‫deve criá-las como propriedades do objeto de exportação.
‫Por exemplo, se estivéssemos fazendo um módulo de calculadora, você poderia
‫criar exportações. adicionar, exportações.
‫multiplique, as exportações. dividir e assim por diante.
‫Faz sentido?
‫Mais uma vez, faremos isso no próximo vídeo e
‫fará mais sentido para você até lá.
‫É assim que exportamos e importamos dados
‫de um módulo para outro.
‫Obviamente, é também por isso que normalmente
‫atribuímos o resultado de uma função de requerimento chamada a uma nova variável.
‫Para que possamos salvar as exportações retornadas.
‫Agora, só para terminar este vídeo bem rápido,
‫a última etapa é que os módulos são realmente armazenados
‫em cache após a primeira vez que são carregados.
‫O que isso significa é que, se você precisar
‫do mesmo módulo várias vezes, sempre obterá o mesmo resultado.
‫E o código nos módulos é realmente executado apenas na
‫primeira chamada.
‫Em chamadas subsequentes,
‫o resultado é simplesmente recuperado do cache.
‫Perfeito.
‫Espero que toda a lógica por
‫trás de como
‫trabalhar com módulos não pareça mais mágica.
‫É muito importante saber como tudo isso funciona, para
‫se tornar um grande e,
‫acima de tudo, um
‫NÓ mais independente. Desenvolvedor JS.