73
Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br Sistema de Módulos

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

Embed Size (px)

Citation preview

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

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

Sistema de Módulos

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

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

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

Criando um novo módulo serialGenerator.js

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

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

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

Page 5: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 6: Node.js - #2 - Sistema de Módulos - Rodrigo Branas

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

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

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

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

Criando um novo módulo serialGenerator.js

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

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

Utilizando o módulo serialGenerator index.js

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

Page 10: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 11: Node.js - #2 - Sistema de Módulos - Rodrigo Branas

Por que o módulo está vazio?

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

Tudo que é definido dentro do módulo é privado

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

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. };  

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

Utilizando o módulo serialGenerator index.js

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

Page 15: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 16: Node.js - #2 - Sistema de Módulos - Rodrigo Branas

Invocando a função generate index.js

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

Page 17: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 18: Node.js - #2 - Sistema de Módulos - Rodrigo Branas

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

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

Exportando a função generate serialGenerator.js

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

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

Exportando a função generate serialGenerator.js

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

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

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

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

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

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

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

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

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

Page 25: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 26: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 27: Node.js - #2 - Sistema de Módulos - Rodrigo Branas

Exibindo argumentos de um módulo

1. console.log(arguments);

Page 28: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 29: Node.js - #2 - Sistema de Módulos - Rodrigo Branas

Como um módulo é localizado?

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

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.

Page 31: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 32: Node.js - #2 - Sistema de Módulos - Rodrigo Branas

Localizando um módulo core

1. require('http');

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

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.

Page 34: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 35: Node.js - #2 - Sistema de Módulos - Rodrigo Branas

Localizando um módulo na mesma pasta

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

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

Localizando um módulo por meio do caminho absoluto

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

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

Localizando um módulo por meio do caminho relativo

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

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

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

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

Page 39: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 40: Node.js - #2 - Sistema de Módulos - Rodrigo Branas

Localizando um módulo na mesma pasta

1. require('./serialGenerator');

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

Localizando um módulo por meio do caminho absoluto

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

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

Localizando um módulo por meio do caminho relativo

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

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

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.

Page 44: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 45: Node.js - #2 - Sistema de Módulos - Rodrigo Branas

Localizando um módulo em node_modules/serialGenerator.js

1. require('serialGenerator');

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

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

1. require('serialGenerator');

Page 47: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 48: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 49: Node.js - #2 - Sistema de Módulos - Rodrigo Branas

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

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

A função require utiliza um mecanismo de cache

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

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

Page 52: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 53: Node.js - #2 - Sistema de Módulos - Rodrigo Branas

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

Page 54: Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Page 55: Node.js - #2 - Sistema de Módulos - Rodrigo Branas

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

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

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. };

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

Exportando por meio de um objeto

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

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. };

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

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. };

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

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. };

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

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. };

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

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. };

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

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. };

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

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

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

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();

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

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();

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

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

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

Exportando por meio de uma função

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

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;

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

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

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

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;

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

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

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

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