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

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

  • 1.
    Rodrigo Branas –@rodrigobranas - http://www.agilecode.com.br Sistema de Módulos
  • 2.
    No Node.js, existeuma relação direta entre um arquivo e um módulo
  • 3.
    Criando um novomódulo serialGenerator.js 1. var  max  =  10000;   2.       3. var  generate  =  function()  {   4.    return  Math.floor(Math.random()  *  max);   5. };  
  • 4.
    Como fazer parautilizar um módulo por meio de outro?
  • 6.
  • 7.
    A função requireé responsável por retornar o que foi exportado de um outro módulo
  • 8.
    Criando um novomódulo serialGenerator.js 1. var  max  =  10000;   2.       3. var  generate  =  function()  {   4.    return  Math.floor(Math.random()  *  max);   5. };  
  • 9.
    Utilizando o móduloserialGenerator index.js 1. var  serialGenerator  =  require('./serialGenerator.js');   2. console.log(serialGenerator);
  • 11.
    Por que omódulo está vazio?
  • 12.
    Tudo que édefinido dentro do módulo é privado
  • 13.
    Exportando a funçãogenerate serialGenerator.js 1. var  max  =  10000;   2.       3. module.exports.generate  =  function()  {   4.    return  Math.floor(Math.random()  *  max);   5. };  
  • 14.
    Utilizando o móduloserialGenerator index.js 1. var  serialGenerator  =  require('./serialGenerator.js');   2. console.log(serialGenerator);
  • 16.
    Invocando a funçãogenerate index.js 1. var  serialGenerator  =  require('./serialGenerator.js');   2. console.log(serialGenerator.generate());
  • 18.
    Também é possívelexportar o módulo utilizando exports ou this
  • 19.
    Exportando a funçãogenerate serialGenerator.js 1. var  max  =  10000;   2.       3. exports.generate  =  function()  {   4.    return  Math.floor(Math.random()  *  max);   5. };  
  • 20.
    Exportando a funçãogenerate serialGenerator.js 1. var  max  =  10000;   2.       3. this.generate  =  function()  {   4.    return  Math.floor(Math.random()  *  max);   5. };  
  • 21.
    Qual é adiferença entre module.exports, exports e this?
  • 22.
    Todos eles apontampara a mesma referência 1. console.log(module.exports  ===  exports);  //  true   2. console.log(module.exports  ===  this);  //  true   3. console.log(exports  ===  this);  //  true
  • 23.
    Cuidado, apenas module.exports éretornado da função require
  • 24.
  • 27.
    Exibindo argumentos deum módulo 1. console.log(arguments);
  • 29.
    Como um móduloé localizado?
  • 30.
    Primeiro, o algoritmode busca tenta localizar um módulo core. Existem vários como: net, http, url, fs, zlib, crypto, events, stream, os, vm, util, entre outros.
  • 32.
    Localizando um módulocore 1. require('http');
  • 33.
    Se o nomedo módulo iniciar com '/', '../' ou './', o algoritmo de busca irá localizar o módulo por meio do caminho absoluto no sistema de arquivos.
  • 35.
    Localizando um módulona mesma pasta 1. require('./serialGenerator.js');
  • 36.
    Localizando um módulopor meio do caminho absoluto 1. require('/Users/rodrigobranas/Development/workspace/youtube/ NodeJS_2_Sistema_de_Modulos/serialGenerator.js');
  • 37.
    Localizando um módulopor meio do caminho relativo 1. require('../serialGenerator.js');
  • 38.
    Terminar o nomecom '.js' é opcional, o algoritmo de busca irá tentar colocar o '.js' no final caso não encontre o módulo.
  • 40.
    Localizando um módulona mesma pasta 1. require('./serialGenerator');
  • 41.
    Localizando um módulopor meio do caminho absoluto 1. require('/Users/rodrigobranas/Development/workspace/youtube/ NodeJS_2_Sistema_de_Modulos/serialGenerator');
  • 42.
    Localizando um módulopor meio do caminho relativo 1. require('../serialGenerator');
  • 43.
    Se o módulonão começar com '/', '../' ou './' o algoritmo de busca da função require vai procurar dentro da pasta node_modules.
  • 45.
    Localizando um móduloem node_modules/serialGenerator.js 1. require('serialGenerator');
  • 46.
    Localizando um móduloem node_modules/serialGenerator/index.js 1. require('serialGenerator');
  • 49.
    Ao utilizar oNPM, os módulos instalados são armazenados na pasta node_modules
  • 50.
    A função requireutiliza um mecanismo de cache
  • 51.
  • 53.
    O módulo serialGeneratorficou armazenado em cache 1. var  serialGeneratorA  =  require('./serialGenerator.js');   2. var  serialGeneratorB  =  require('./serialGenerator.js');   3. console.log(serialGeneratorA  ===  serialGeneratorB);  //  true
  • 55.
    Existem muitas formasde criar um módulo e exportá-lo
  • 56.
    Criando um módulogerador de serial serialGenerator.js 1. var  max  =  10000;   2.       3. var  generate  =  function  ()  {   4.    return  Math.floor(Math.random()  *  max);   5. };
  • 57.
    Exportando por meiode um objeto
  • 58.
    Exportando por meiode um objeto serialGenerator.js 1. var  max  =  10000;   2.       3. module.exports.generate  =  function  ()  {   4.    return  Math.floor(Math.random()  *  max);   5. };
  • 59.
    Exportando por meiode um objeto serialGenerator.js 1. var  max  =  10000;   2.       3. exports.generate  =  function  ()  {   4.    return  Math.floor(Math.random()  *  max);   5. };
  • 60.
    Exportando por meiode um objeto serialGenerator.js 1. var  max  =  10000;   2.       3. this.generate  =  function  ()  {   4.    return  Math.floor(Math.random()  *  max);   5. };
  • 61.
    Exportando por meiode 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. };
  • 62.
    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. };
  • 63.
    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. };
  • 64.
    Cuidado, apenas module.exports éretornado da função require
  • 65.
    Exportando por meiode 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();
  • 66.
    Exportando por meiode 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();
  • 67.
    Por conta domecanismo de cache, o objeto retornado é o mesmo 1. var  serialGeneratorA  =  require('./serialGenerator');   2. var  serialGeneratorB  =  require('./serialGenerator');   3. console.log(serialGeneratorA  ===  serialGeneratorB);  //  true
  • 68.
    Exportando por meiode uma função
  • 69.
    Exportando por meiode 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;
  • 70.
    Ao invocar afunçã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
  • 71.
    Exportando por meiode 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;
  • 72.
    Ao invocar afunçã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
  • 73.
    Rodrigo Branas   AgileCode: 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