Node.js - #2 - Sistema de Módulos - Rodrigo Branas

Post on 21-Jan-2017

1.119 views 1 download

Transcript of Node.js - #2 - Sistema de Módulos - Rodrigo Branas

Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br

Sistema de Módulos

No Node.js, existe uma relação direta entre um arquivo e um módulo

Criando um novo módulo serialGenerator.js

1. var  max  =  10000;  2.      3. var  generate  =  function()  {  4.    return  Math.floor(Math.random()  *  max);  5. };  

Como fazer para utilizar um módulo por meio de outro?

http://wiki.commonjs.org/wiki/Modules/1.1

A função require é responsável por retornar o que foi exportado de um outro módulo

Criando um novo módulo serialGenerator.js

1. var  max  =  10000;  2.      3. var  generate  =  function()  {  4.    return  Math.floor(Math.random()  *  max);  5. };  

Utilizando o módulo serialGenerator index.js

1. var  serialGenerator  =  require('./serialGenerator.js');  2. console.log(serialGenerator);

Por que o módulo está vazio?

Tudo que é definido dentro do módulo é privado

Exportando a função generate serialGenerator.js

1. var  max  =  10000;  2.      3. module.exports.generate  =  function()  {  4.    return  Math.floor(Math.random()  *  max);  5. };  

Utilizando o módulo serialGenerator index.js

1. var  serialGenerator  =  require('./serialGenerator.js');  2. console.log(serialGenerator);

Invocando a função generate index.js

1. var  serialGenerator  =  require('./serialGenerator.js');  2. console.log(serialGenerator.generate());

Também é possível exportar o módulo utilizando exports ou this

Exportando a função generate serialGenerator.js

1. var  max  =  10000;  2.      3. exports.generate  =  function()  {  4.    return  Math.floor(Math.random()  *  max);  5. };  

Exportando a função generate serialGenerator.js

1. var  max  =  10000;  2.      3. this.generate  =  function()  {  4.    return  Math.floor(Math.random()  *  max);  5. };  

Qual é a diferença entre module.exports, exports e this?

Todos eles apontam para a mesma referência

1. console.log(module.exports  ===  exports);  //  true  2. console.log(module.exports  ===  this);  //  true  3. console.log(exports  ===  this);  //  true

Cuidado, apenas module.exports é retornado da função require

https://github.com/nodejs/node-v0.x-archive/blob/master/src/node.js

Exibindo argumentos de um módulo

1. console.log(arguments);

Como um módulo é localizado?

Primeiro, o algoritmo de busca tenta localizar um módulo core. Existem vários

como: net, http, url, fs, zlib, crypto, events, stream, os, vm, util, entre outros.

Localizando um módulo core

1. require('http');

Se o nome do módulo iniciar com '/', '../' ou './', o algoritmo de busca irá localizar o módulo por meio do caminho absoluto no

sistema de arquivos.

Localizando um módulo na mesma pasta

1. require('./serialGenerator.js');

Localizando um módulo por meio do caminho absoluto

1. require('/Users/rodrigobranas/Development/workspace/youtube/NodeJS_2_Sistema_de_Modulos/serialGenerator.js');

Localizando um módulo por meio do caminho relativo

1. require('../serialGenerator.js');

Terminar o nome com '.js' é opcional, o algoritmo de busca irá tentar colocar o

'.js' no final caso não encontre o módulo.

Localizando um módulo na mesma pasta

1. require('./serialGenerator');

Localizando um módulo por meio do caminho absoluto

1. require('/Users/rodrigobranas/Development/workspace/youtube/NodeJS_2_Sistema_de_Modulos/serialGenerator');

Localizando um módulo por meio do caminho relativo

1. require('../serialGenerator');

Se o módulo não começar com '/', '../' ou './' o algoritmo de busca da função require vai procurar

dentro da pasta node_modules.

Localizando um módulo em node_modules/serialGenerator.js

1. require('serialGenerator');

Localizando um módulo em node_modules/serialGenerator/index.js

1. require('serialGenerator');

Ao utilizar o NPM, os módulos instalados são armazenados na pasta node_modules

A função require utiliza um mecanismo de cache

https://github.com/nodejs/node-v0.x-archive/blob/master/src/node.js

O módulo serialGenerator ficou armazenado em cache

1. var  serialGeneratorA  =  require('./serialGenerator.js');  2. var  serialGeneratorB  =  require('./serialGenerator.js');  3. console.log(serialGeneratorA  ===  serialGeneratorB);  //  true

Existem muitas formas de criar um módulo e exportá-lo

Criando um módulo gerador de serial serialGenerator.js

1. var  max  =  10000;  2.      3. var  generate  =  function  ()  {  4.    return  Math.floor(Math.random()  *  max);  5. };

Exportando por meio de um objeto

Exportando por meio de um objeto serialGenerator.js

1. var  max  =  10000;  2.      3. module.exports.generate  =  function  ()  {  4.    return  Math.floor(Math.random()  *  max);  5. };

Exportando por meio de um objeto serialGenerator.js

1. var  max  =  10000;  2.      3. exports.generate  =  function  ()  {  4.    return  Math.floor(Math.random()  *  max);  5. };

Exportando por meio de um objeto serialGenerator.js

1. var  max  =  10000;  2.      3. this.generate  =  function  ()  {  4.    return  Math.floor(Math.random()  *  max);  5. };

Exportando por meio de um objeto serialGenerator.js

1. var  max  =  10000;  2.      3. var  generate  =  function  ()  {  4.    return  Math.floor(Math.random()  *  max);  5. };  6.      7. module.exports  =  {  8.    generate:  generate  9. };

Não funciona!

1. var  max  =  10000;  2.      3. var  generate  =  function  ()  {  4.    return  Math.floor(Math.random()  *  max);  5. };  6.      7. exports  =  {  8.    generate:  generate  9. };

Não funciona!

1. var  max  =  10000;  2.      3. var  generate  =  function  ()  {  4.    return  Math.floor(Math.random()  *  max);  5. };  6.      7. this  =  {  8.    generate:  generate  9. };

Cuidado, apenas module.exports é retornado da função require

Exportando por meio de um objeto serialGenerator.js

1. var  createSerialGenerator  =  function  ()  {  2.    var  max  =  10000;  3.      4.    var  generate  =  function  ()  {  5.        return  Math.floor(Math.random()  *  max);  6.    };  7.      8.    return  {  9.        generate:  generate  10.    };  11. }  12.      13. module.exports  =  createSerialGenerator();

Exportando por meio de um objeto serialGenerator.js

1. var  SerialGenerator  =  function  ()  {  2.    var  max  =  10000;  3.      4.    this.generate  =  function  ()  {  5.        return  Math.floor(Math.random()  *  max);  6.    };  7. };  8.      9. module.exports  =  new  SerialGenerator();

Por conta do mecanismo de cache, o objeto retornado é o mesmo

1. var  serialGeneratorA  =  require('./serialGenerator');  2. var  serialGeneratorB  =  require('./serialGenerator');  3. console.log(serialGeneratorA  ===  serialGeneratorB);  //  true

Exportando por meio de uma função

Exportando por meio de uma função serialGenerator.js

1. var  createSerialGenerator  =  function  ()  {  2.    var  max  =  10000;  3.      4.    var  generate  =  function  ()  {  5.        return  Math.floor(Math.random()  *  max);  6.    };  7.      8.    return  {  9.        generate:  generate  10.    };  11. }  12.      13. module.exports  =  createSerialGenerator;

Ao invocar a função, temos objetos diferentes como resultado

1. var  createSerialGenerator  =  require('./serialGenerator');  2. var  serialGeneratorA  =  createSerialGenerator();  3. var  serialGeneratorB  =  createSerialGenerator();  4. console.log(serialGeneratorA  ===  serialGeneratorB);  //  false

Exportando por meio de um objeto serialGenerator.js

1. var  SerialGenerator  =  function  ()  {  2.    var  max  =  10000;  3.      4.    this.generate  =  function  ()  {  5.        return  Math.floor(Math.random()  *  max);  6.    };  7. };  8.      9. module.exports  =  SerialGenerator;

Ao invocar a função, temos objetos diferentes como resultado

1. var  SerialGenerator  =  require('./serialGenerator');  2. var  serialGeneratorA  =  new  SerialGenerator();  3. var  serialGeneratorB  =  new  SerialGenerator();  4. console.log(serialGeneratorA  ===  serialGeneratorB);  //  false

Rodrigo Branas  Agile Code: http://www.agilecode.com.br Twitter: @rodrigobranas SlideShare: http://www.slideshare.com/rodrigobranas YouTube: http://www.youtube.com/rodrigobranas LinkedIn: http://br.linkedin.com/in/rodrigobranas +Plus: https://plus.google.com/+RodrigoBranas GitHub: http://www.github.com/rodrigobranas