‫Jonas: Nesta palestra,
‫quero mostrar algumas coisas diferentes que envolvem módulos.
‫E eu quero começar basicamente provando a você que o
‫Node de fato envolve o código em nossos módulos em uma
‫função de invólucro, como
‫mostrei a você na última aula.
‫Portanto, vamos criar um novo arquivo novamente, módulo. js, e
‫isso são módulos, como este.
‫Ok, e o
‫que vou fazer aqui é registrar no console os argumentos, ok?
‫Portanto, argumentos é uma matriz em JavaScript e essa
‫matriz contém todos os valores
‫que foram passados para uma função.
‫Então, quando eu logar essa matriz de argumentos
‫no console, se realmente virmos alguns
‫valores lá, bem, isso significa que estamos realmente em uma função, certo?
‫Então, vamos rodar os módulos.
‫E, de fato, aqui temos o código em nossos argumentos.
‫E então, vamos lembrar os cinco
‫argumentos da função wrapper.
‫O primeiro é a exportação, então este, que
‫está vazio
‫porque não estamos exportando nada.
‫A segunda é a função require, então podemos
‫ver que
‫aqui temos de fato a função require.
‫Então o terceiro é chamado de módulo, ok.
‫E no módulo temos as exportações de módulos, sobre
‫as quais falamos novamente na última aula.
‫E o que temos aqui não é tão importante, novamente,
‫eu só queria
‫mostrar que estamos realmente em uma função agora, de
‫modo que todo o código que
‫temos neste módulo está realmente embrulhado nesta função de invólucro, ok ?
‫Em seguida, o número três e o número quatro são o nome do
‫arquivo e o nome do diretório.
‫E, de fato, este é o nome do módulo em que estamos
‫atualmente, portanto, módulos. js.
‫E aqui temos o nome do diretório.
‫Estou na minha área
‫de trabalho e agora nesta pasta de trabalhos do Node.
‫Tão semelhante a este
‫aqui, mas este tem uma barra no nome do módulo, certo?
‫Então isso nos prova que,
‫de fato, todo o código dentro de
‫um módulo é empacotado, e que temos acesso a todas
‫essas variáveis, então esses argumentos, ok?
‫Então, acho que este é um experimento interessante
‫que podemos fazer.
‫E podemos realmente fazer outra coisa legal.
‫Então, para realmente mostrar a
‫função do wrapper, podemos exigir o módulo do módulo, ok.
‫Portanto, há um módulo chamado
‫módulo, que na verdade nunca usamos, mas internamente o Node o usa.
‫E aí temos o invólucro.
‫E então essa propriedade é na verdade
‫a função de invólucro.
‫Portanto, agora podemos dar uma olhada nisso.
‫E onde fica isso, ah, sim.
‫Então aqui, aqui está realmente.
‫Portanto, esta é a função de invólucro.
‫E, de fato, você vê export, require,
‫module, filename e nome do diretório, e então o
‫corpo da função.
‫E isso é o que o
‫Node usa internamente, basicamente este modelo aqui, ele o
‫usa e, em seguida, preenche o corpo dessa função com nosso código.
‫Ok, então novamente, apenas um experimento interessante aqui.
‫Agora, a coisa mais importante que
‫quero mostrar a vocês aqui é como podemos exportar e
‫importar dados de um módulo para o outro.
‫E então vamos começar criando um novo módulo
‫aqui, no qual vou criar uma
‫calculadora, um pouco como mencionei no último vídeo.
‫Então, vamos chamar este test-module-1, porque
‫teremos alguns deles.
‫E aqui vou criar uma classe de calculadora.
‫Portanto, novamente, esta é a
‫sintaxe ES6 para escrever classes em JavaScript.
‫Então, vamos adicionar alguns métodos aqui, então adicionar
‫aeb, irá naturalmente retornar a mais b,
‫então coisas muito simples, multiplique a, b, retornará a vezes b,
‫e então, vamos apenas dividir também,
‫apenas por
‫uma questão de integridade aqui, a, b, assim.
‫Salve, formata bem e agora podemos
‫fazer o módulo. exportações, assim como vimos
‫no último vídeo,
‫e estamos exportando nossa calculadora, ok?
‫Então, novamente, usamos o módulo. exporta
‫quando queremos exportar um único valor.
‫E, neste caso, nosso único
‫valor aqui é a classe da calculadora.
‫Portanto, módulo. exportações é exatamente o
‫que é retornado de um módulo, então tudo o
‫que colocamos lá, bem, é exportado automaticamente, certo?
‫Podemos então salvar o valor exportado
‫em uma variável ao importá-lo, então vamos fazer isso agora.
‫E agora podemos dar a ele qualquer nome que quisermos.
‫Então, o nome que estamos exportando do outro lado,
‫nesse outro módulo, não importa.
‫Podemos chamá-lo do que quisermos aqui.
‫Nesse sentido, é como um retorno de função normal, certo,
‫então podemos sempre retornar qualquer variável,
‫mas chamá-la de outra coisa
‫quando basicamente salvamos o resultado de uma função em
‫uma variável, certo?
‫Portanto, como é nosso
‫próprio módulo, temos que usar a barra de ponto, o que
‫eu fiz aqui, e então test-module-1.
‫E o JS, lembre-se, podemos simplesmente abandonar isso,
‫não é necessário, ok?
‫E então essa variável C aqui, que é
‫maiúscula porque para a classe geralmente usamos nomes em maiúsculas.
‫E lembre-se, na verdade, estamos exportando uma classe aqui.
‫Ok, agora podemos usar essa classe para fazer alguns cálculos.
‫Então, primeiro vamos criar uma
‫nova calculadora, calculadora, porque mais
‫tarde teremos outra, ok?
‫E agora criamos uma nova instância de uma calculadora como
‫esta, e isso não
‫deve ser nenhuma novidade para você neste momento.
‫E então vamos registrar através do console o
‫resultado de realmente usar isso.
‫Então calc1. adicione, e digamos dois e cinco.
‫Salve e, na verdade, vamos comentar esses dois.
‫Salve-o novamente e, em seguida, os módulos do Node, e
‫aqui temos o resultado, sete.
‫Então são dois mais cinco, então funciona, certo?
‫E aqui em nosso módulo de
‫teste, podemos realmente fazer isso de uma forma mais elegante.
‫Portanto, poderíamos atribuir essa classe aqui
‫diretamente ao módulo. exportações, certo?
‫Portanto, agora temos uma declaração de classe, que
‫é um pouco como uma
‫declaração de função, onde dizemos calculadora de função e, em
‫seguida, isso, e aqui dizemos classe, ok?
‫Mas também poderíamos fazer isso com uma expressão de classe.
‫E assim, simplesmente não usamos o nome da calculadora
‫de qualquer maneira.
‫Então copie, comente.
‫Ok, então assim.
‫Portanto, apenas dizemos que se trata
‫de uma classe e a atribuímos a uma variável.
‫E isso agora é uma expressão.
‫Então, vamos rodar de
‫novo e veremos, é claro, nosso sete de novo, ok?
‫Então, novamente, isso é apenas para atribuir imediatamente o valor
‫que queremos modular. exportações, e isso
‫vai nos poupar algumas linhas de código
‫e, provavelmente, fazer nosso código parecer um pouco melhor.
‫Ok, é assim que exportamos as coisas com o módulo. exportações, e agora vamos
‫ver como e quando podemos usar a abreviação
‫de exportações que também mencionei no
‫vídeo anterior.
‫Então, vamos apenas criar um comentário simples aqui, módulo. exportações.
‫Então aqui só exporta.
‫Portanto, um novo teste de módulo e, novamente, módulo-2. js.
‫E então a alternativa para fazer o módulo. exportações é
‫adicionar propriedades ao próprio objeto de exportação.
‫Então poderíamos fazer
‫assim, e usando novamente o exemplo da calculadora
‫anterior, poderíamos fazer assim.
‫Portanto, podemos simplesmente adicionar propriedades ao objeto de exportação.
‫Portanto, aeb retornarão a mais
‫b, exportações. multiplique a, b retornará a vezes
‫b, e
‫agora vamos apenas duplicar apenas para completar novamente, e tudo bem.
‫Portanto, criamos basicamente três funções anônimas
‫aqui, essas três, e
‫as atribuímos a três propriedades de exportações.
‫E agora, quando exportamos este módulo do outro
‫lado, então em módulos. js, teremos basicamente
‫acesso a este objeto de exportação.
‫Então, deixe-me mostrar isso a você.
‫Então, digamos que const calc2 seja obrigatório.
‫Novamente, não se esqueça do ponto e da barra,
‫porque é nosso próprio módulo.
‫Ok, e agora este calc2 aqui é o objeto de exportação.
‫Ok, deixe-me mostrar isso a você.
‫Console. log, calc2. some, dois e cinco.
‫Portanto, isso deve nos dar exatamente o mesmo resultado de antes.
‫E, de fato, aqui está o nosso sete, exatamente como antes.
‫E se
‫nós multiplicássemos, então isso deveria ser, claro, 10.
‫E então, sim, temos sete aqui a partir da adição aqui,
‫e então essa multiplicação nos dá 10.
‫Espero que isso realmente faça
‫diferença entre os módulos. exportações e exportações claras.
‫E então, novamente, quando estamos usando simplesmente
‫exportações, podemos adicionar coisas a este objeto, basicamente propriedades, e
‫então quando importarmos isso, então
‫quando exigirmos este módulo, o resultado
‫que vamos
‫obter é um objeto contendo todas essas propriedades.
‫E já que estamos recebendo
‫um objeto, podemos usar o poder da desestruturação do
‫ES6 para fazer uma mágica legal aqui, basicamente.
‫Então deixe-me me livrar deste, ou na
‫verdade duplicá-lo, comentar este aqui, e assim podemos
‫usar a desestruturação para desestruturar o objeto que obtivermos, ok?
‫E funciona assim, então usamos as chaves e, em
‫seguida, simplesmente criamos nomes
‫de variáveis para as propriedades desse objeto.
‫Então, novamente, vamos usar adicionar, multiplicar e dividir.
‫Então esses são os nomes que realmente temos
‫neste objeto de exportação.
‫Portanto, some, multiplique e divida,
‫e estes devem ter exatamente o
‫mesmo nome do objeto original, certo?
‫Agora, o que isso
‫fará é basicamente criar uma variável chamada
‫simplesmente multiplicar.
‫E então, de fato, aqui está nosso resultado.
‫E, na verdade, só podemos importar aqueles que desejamos.
‫Então, digamos que queremos apenas somar e multiplicar, certo?
‫E assim só teremos acesso a esses
‫dois, ao invés de importar tudo do módulo.
‫E este é um padrão
‫bastante comum que você verá usado no
‫Node, e faremos isso ao longo do projeto também.
‫Ok, então neste
‫vídeo falamos sobre a função wrapper
‫aqui, depois falamos sobre exportar
‫e importar usando o módulo. exportações e a taquigrafia de exportações.
‫E agora, finalmente, só para
‫terminar, vamos falar sobre armazenamento em cache muito rapidamente.
‫Ok, então vamos criar test-module-3 aqui.
‫E o que vou fazer aqui é criar um console. log, então, basicamente, algum
‫código de nível superior dentro deste módulo.
‫Olá do módulo, ok, também
‫quero exportar uma função.
‫Apenas uma única função, então estou falando de módulo. exporta a
‫função igual a sem nenhum argumento, que
‫simplesmente registrará no
‫console: registre este belo texto.
‫Apenas alguns pequenos emojis aqui para fazê-lo estourar um pouco.
‫Ok, agora vamos exigir este módulo de teste.
‫Test-module-3, e não o estou salvando em nenhuma variável.
‫Em vez disso, vou chamar a função
‫imediatamente, sem salvá-la em uma variável.
‫Claro que poderíamos fazer
‫isso, teríamos a função em uma variável
‫e poderíamos chamá-la.
‫Mas isso é exatamente
‫a mesma coisa, porque isso vai retornar essa função
‫que definimos, então essa aqui, certo?
‫Ele retornará isso porque estamos usando o módulo. exportações, e
‫então imediatamente chamamos essa função aqui, ok?
‫E então vamos fazer isso três vezes.
‫E lembrando que temos caching no Node. módulos js, o que você
‫acha que vai acontecer quando executarmos este código?
‫Ok, então vamos rodar isso e ver o que vai acontecer.
‫Aqui temos o resultado, olá do
‫módulo, e depois registramos três vezes esse belo texto.
‫Portanto, temos esse registro aqui três vezes, bem, porque
‫chamamos a mesma função três vezes.
‫Mas recebemos um alô do módulo apenas uma vez, certo?
‫E isso é por causa do cache.
‫Então, tecnicamente, este módulo foi carregado apenas uma vez,
‫e o código dentro dele também foi executado apenas uma vez.
‫E é por isso que essa linha de
‫código aqui, esse log só foi executado uma vez, ok?
‫E esses outros dois registros aqui, bem, eles vieram
‫do cache, então foram armazenados em algum lugar no
‫cache de processos do Node.
‫E assim que chamamos a função aqui pela segunda
‫vez, ela foi simplesmente recuperada
‫de lá, em vez de carregar o módulo novamente, ok?
‫Portanto, tenho certeza de que faz muito sentido para você.
‫E então essa foi nossa palestra, na verdade.
‫Se você tiver alguma dúvida, pode, como
‫sempre, postá-la na seção de perguntas e respostas e obter ajuda lá.
‫Isso conclui toda esta seção.
‫Eu sei que foi uma jornada e tanto até chegarmos a este ponto,
‫então um monte de coisas para aprender.
‫E se você corrigiu tudo 100%, não
‫se preocupe muito com isso, pois
‫ao longo do
‫curso, a maior parte das coisas vai ficando claras um dia, ok?
‫Portanto, não se preocupe, apenas continue avançando no curso,
‫e vejo você na próxima seção.