SlideShare uma empresa Scribd logo
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?
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
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);
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
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);
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());
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
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
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Exibindo argumentos de um módulo
1. console.log(arguments);
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
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.
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
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.
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
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.
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
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.
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
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');
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
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
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
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
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

Mais conteúdo relacionado

PDF
Node.js - #3 - Global Objects - Rodrigo Branas
PDF
Node.js - #4 - Timers - Rodrigo Branas
PDF
Node.js - #5 - Process - Rodrigo Branas
PDF
JavaScript Hacks
PDF
TDC2016SP - Trilha Node.Js
PPT
Spock Framework
PPT
Spock Framework 2
PPTX
Threads tasks e o tal do thread pool
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #5 - Process - Rodrigo Branas
JavaScript Hacks
TDC2016SP - Trilha Node.Js
Spock Framework
Spock Framework 2
Threads tasks e o tal do thread pool

Mais procurados (20)

PPT
Mobileconf dicas-android
PDF
Funcionamento interno do node.js e boas práticas
PPTX
Node.js para desenvolvedores .NET
PDF
PHP fora da Web
PDF
PHP e Mysql - DELETE
PDF
Curso de Node JS Básico
PPTX
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
PDF
Reference Counting
PDF
Dicas e Truques TypeScript
PDF
Programação functional reativa: lidando com código assíncrono
PDF
JavaScript - De verdade
PPTX
Coroutines tech summit
PDF
Crawling - Coleta de dados na Web com PHP
PDF
Acessando o MySql com o Python
ODP
Palestra cbq
PDF
Why functional programming matters
ODP
App scala
PDF
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
PDF
Python e bancos NoSQL
PDF
Busca Visual
Mobileconf dicas-android
Funcionamento interno do node.js e boas práticas
Node.js para desenvolvedores .NET
PHP fora da Web
PHP e Mysql - DELETE
Curso de Node JS Básico
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
Reference Counting
Dicas e Truques TypeScript
Programação functional reativa: lidando com código assíncrono
JavaScript - De verdade
Coroutines tech summit
Crawling - Coleta de dados na Web com PHP
Acessando o MySql com o Python
Palestra cbq
Why functional programming matters
App scala
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
Python e bancos NoSQL
Busca Visual
Anúncio

Destaque (20)

PDF
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
PDF
Node.js - #6 - Core Modules - net - Rodrigo Branas
PDF
Node.js - #1 - Introdução - Rodrigo Branas
PPTX
A evolução do AngularJS
PPTX
Criando serviços com AngularJS
PPTX
Introdução ao AngularJS
PPTX
Construindo Diretivas com AngularJS
PPTX
Selenium - WebDriver
PDF
HTTP Interceptors com AngularJS
PPTX
Utilizando diretivas com AngularJS
PPTX
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
PPTX
Porque eu deveria utilizar Agile
PPTX
PPTX
Domain-Driven Design
PPTX
Técnicas de Refactoring
PPTX
Test-Driven Development com JavaScript, Jasmine Karma
PDF
#2 - Git - DAG
PPTX
Validando Formulários com AngularJS
PPTX
Aplicando filtros com AngularJS
PPTX
HTTP, JSON, REST e AJAX com AngularJS
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo Branas
A evolução do AngularJS
Criando serviços com AngularJS
Introdução ao AngularJS
Construindo Diretivas com AngularJS
Selenium - WebDriver
HTTP Interceptors com AngularJS
Utilizando diretivas com AngularJS
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Porque eu deveria utilizar Agile
Domain-Driven Design
Técnicas de Refactoring
Test-Driven Development com JavaScript, Jasmine Karma
#2 - Git - DAG
Validando Formulários com AngularJS
Aplicando filtros com AngularJS
HTTP, JSON, REST e AJAX com AngularJS
Anúncio

Semelhante a Node.js - #2 - Sistema de Módulos - Rodrigo Branas (20)

PDF
Javascript Ilegível
PDF
Data mapping com Groovy - Part 2
PPTX
Javascript avançado
PDF
Algoritmos de ordenação
PDF
RMI em Java
PDF
Realtime com node.js e socket.io
PDF
Introdução ao Zend Framework 2
PPT
Mock Objects
PDF
Minicurso groovy grails
PDF
jQuery básico (parte 3)
PPTX
ESTRUTURA DE DADOS (JAVA) AULA 09
PDF
Model View Controller
PDF
Java script aula 05 - funções
PPTX
Threads e Estruturas de dados
PDF
Demoiselle Behave - Parte 3
PDF
Testes em Aplicações Web com Cactus
PDF
Evento Front End SP - Arquitetura de Front
PDF
Rafael Garcia - Yii Framework, principais características e em ação
PPTX
Teste unitário
PDF
Evolução e futuro do uso de paradigmas no JavaScript
Javascript Ilegível
Data mapping com Groovy - Part 2
Javascript avançado
Algoritmos de ordenação
RMI em Java
Realtime com node.js e socket.io
Introdução ao Zend Framework 2
Mock Objects
Minicurso groovy grails
jQuery básico (parte 3)
ESTRUTURA DE DADOS (JAVA) AULA 09
Model View Controller
Java script aula 05 - funções
Threads e Estruturas de dados
Demoiselle Behave - Parte 3
Testes em Aplicações Web com Cactus
Evento Front End SP - Arquitetura de Front
Rafael Garcia - Yii Framework, principais características e em ação
Teste unitário
Evolução e futuro do uso de paradigmas no JavaScript

Mais de Rodrigo Branas (14)

PDF
Clean Architecture
PDF
#6 - Git - Desfazendo as coisas
PDF
#1 - Git - Introdução
PDF
#5 - Git - Contribuindo com um repositório remoto
PDF
#4 - Git - Stash
PDF
#3 - Git - Branching e Merging
PPTX
JavaScript - Date
PPTX
JavaScript - Expressões Regulares
PPTX
Automação de Testes com AngularJS
PPTX
Scope AngularJS
PPTX
Criando Filtros com AngularJS
PPTX
Criando aplicações Single-Page com AngularJS
PPTX
PPTX
Desvendando a linguagem JavaScript
Clean Architecture
#6 - Git - Desfazendo as coisas
#1 - Git - Introdução
#5 - Git - Contribuindo com um repositório remoto
#4 - Git - Stash
#3 - Git - Branching e Merging
JavaScript - Date
JavaScript - Expressões Regulares
Automação de Testes com AngularJS
Scope AngularJS
Criando Filtros com AngularJS
Criando aplicações Single-Page com AngularJS
Desvendando a linguagem JavaScript

Último (6)

PDF
Certificado de Conclusão Jornada Inteligência Artificial
PDF
PROJETO DE PESQUISA PRONTO FONOAUDIOLOGIA 2025 ABNT.pdf
PPTX
AULA_12_BASQUETE CAPACIDADE FÍSICA_171023.pptx
PPT
Aula_15.pptssssssssssssssssssssssssssssssssssssss
PDF
PROJETO DE PESQUISA PRONTO ESTÉTICA 2025 ABNT.pdf
PDF
Agosto-Lilas-Conscientizacao-e-Combate-a-Violencia-contra-a-Mulher.pdf
Certificado de Conclusão Jornada Inteligência Artificial
PROJETO DE PESQUISA PRONTO FONOAUDIOLOGIA 2025 ABNT.pdf
AULA_12_BASQUETE CAPACIDADE FÍSICA_171023.pptx
Aula_15.pptssssssssssssssssssssssssssssssssssssss
PROJETO DE PESQUISA PRONTO ESTÉTICA 2025 ABNT.pdf
Agosto-Lilas-Conscientizacao-e-Combate-a-Violencia-contra-a-Mulher.pdf

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, existe uma relação direta entre um arquivo e um módulo
  • 3. Criando um novo módulo serialGenerator.js 1. var  max  =  10000;   2.       3. var  generate  =  function()  {   4.    return  Math.floor(Math.random()  *  max);   5. };  
  • 4. Como fazer para utilizar um módulo por meio de outro?
  • 7. A função require é responsável por retornar o que foi exportado de um outro módulo
  • 8. Criando um novo módulo serialGenerator.js 1. var  max  =  10000;   2.       3. var  generate  =  function()  {   4.    return  Math.floor(Math.random()  *  max);   5. };  
  • 9. Utilizando o módulo serialGenerator index.js 1. var  serialGenerator  =  require('./serialGenerator.js');   2. console.log(serialGenerator);
  • 11. Por que o módulo está vazio?
  • 12. Tudo que é definido dentro do módulo é privado
  • 13. 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. };  
  • 14. Utilizando o módulo serialGenerator index.js 1. var  serialGenerator  =  require('./serialGenerator.js');   2. console.log(serialGenerator);
  • 16. Invocando a função generate index.js 1. var  serialGenerator  =  require('./serialGenerator.js');   2. console.log(serialGenerator.generate());
  • 18. Também é possível exportar o módulo utilizando exports ou this
  • 19. Exportando a função generate serialGenerator.js 1. var  max  =  10000;   2.       3. exports.generate  =  function()  {   4.    return  Math.floor(Math.random()  *  max);   5. };  
  • 20. Exportando a função generate serialGenerator.js 1. var  max  =  10000;   2.       3. this.generate  =  function()  {   4.    return  Math.floor(Math.random()  *  max);   5. };  
  • 21. Qual é a diferença entre module.exports, exports e this?
  • 22. 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
  • 23. Cuidado, apenas module.exports é retornado da função require
  • 27. Exibindo argumentos de um módulo 1. console.log(arguments);
  • 29. Como um módulo é localizado?
  • 30. 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.
  • 32. Localizando um módulo core 1. require('http');
  • 33. 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.
  • 35. Localizando um módulo na mesma pasta 1. require('./serialGenerator.js');
  • 36. Localizando um módulo por meio do caminho absoluto 1. require('/Users/rodrigobranas/Development/workspace/youtube/ NodeJS_2_Sistema_de_Modulos/serialGenerator.js');
  • 37. Localizando um módulo por meio do caminho relativo 1. require('../serialGenerator.js');
  • 38. Terminar o nome com '.js' é opcional, o algoritmo de busca irá tentar colocar o '.js' no final caso não encontre o módulo.
  • 40. Localizando um módulo na mesma pasta 1. require('./serialGenerator');
  • 41. Localizando um módulo por meio do caminho absoluto 1. require('/Users/rodrigobranas/Development/workspace/youtube/ NodeJS_2_Sistema_de_Modulos/serialGenerator');
  • 42. Localizando um módulo por meio do caminho relativo 1. require('../serialGenerator');
  • 43. 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.
  • 45. Localizando um módulo em node_modules/serialGenerator.js 1. require('serialGenerator');
  • 46. Localizando um módulo em node_modules/serialGenerator/index.js 1. require('serialGenerator');
  • 49. Ao utilizar o NPM, os módulos instalados são armazenados na pasta node_modules
  • 50. A função require utiliza um mecanismo de cache
  • 53. 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
  • 55. Existem muitas formas de criar um módulo e exportá-lo
  • 56. 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. };
  • 57. Exportando por meio de um objeto
  • 58. 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. };
  • 59. 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. };
  • 60. 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. };
  • 61. 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. };
  • 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 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();
  • 66. 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();
  • 67. 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
  • 68. Exportando por meio de uma função
  • 69. 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;
  • 70. 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
  • 71. 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;
  • 72. 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
  • 73. 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