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
Rodrigo Branas
 
PDF
Node.js - #4 - Timers - Rodrigo Branas
Rodrigo Branas
 
PDF
Node.js - #5 - Process - Rodrigo Branas
Rodrigo Branas
 
PDF
JavaScript Hacks
Caio Ribeiro Pereira
 
PDF
TDC2016SP - Trilha Node.Js
tdc-globalcode
 
PPT
Spock Framework
Ismael
 
PPT
Spock Framework 2
Ismael
 
PPTX
Threads tasks e o tal do thread pool
Fabrício Rissetto
 
Node.js - #3 - Global Objects - Rodrigo Branas
Rodrigo Branas
 
Node.js - #4 - Timers - Rodrigo Branas
Rodrigo Branas
 
Node.js - #5 - Process - Rodrigo Branas
Rodrigo Branas
 
JavaScript Hacks
Caio Ribeiro Pereira
 
TDC2016SP - Trilha Node.Js
tdc-globalcode
 
Spock Framework
Ismael
 
Spock Framework 2
Ismael
 
Threads tasks e o tal do thread pool
Fabrício Rissetto
 

Mais procurados (20)

PPT
Mobileconf dicas-android
Alberto Souza
 
PDF
Funcionamento interno do node.js e boas práticas
Kirmayr tomaz
 
PPTX
Node.js para desenvolvedores .NET
MVP Microsoft
 
PDF
PHP fora da Web
Vinícius Campitelli
 
PDF
PHP e Mysql - DELETE
Marco Pinheiro
 
PDF
Curso de Node JS Básico
Victor Hazin da Rocha
 
PPTX
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
André Déo
 
PDF
Reference Counting
crabtw
 
PDF
Dicas e Truques TypeScript
Loiane Groner
 
PDF
Programação functional reativa: lidando com código assíncrono
Leonardo Borges
 
PDF
JavaScript - De verdade
Luis Vendrame
 
PPTX
Coroutines tech summit
Paulo Sato
 
PDF
Crawling - Coleta de dados na Web com PHP
Luis Gustavo Almeida
 
PDF
Acessando o MySql com o Python
antonio sérgio nogueira
 
ODP
Palestra cbq
Rildo Pragana
 
PDF
Why functional programming matters
Jean Carlo Machado
 
ODP
App scala
Agnaldo Oliveira
 
PDF
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
iMasters
 
PDF
Python e bancos NoSQL
Marinho Brandão
 
PDF
Busca Visual
gsroma
 
Mobileconf dicas-android
Alberto Souza
 
Funcionamento interno do node.js e boas práticas
Kirmayr tomaz
 
Node.js para desenvolvedores .NET
MVP Microsoft
 
PHP fora da Web
Vinícius Campitelli
 
PHP e Mysql - DELETE
Marco Pinheiro
 
Curso de Node JS Básico
Victor Hazin da Rocha
 
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
André Déo
 
Reference Counting
crabtw
 
Dicas e Truques TypeScript
Loiane Groner
 
Programação functional reativa: lidando com código assíncrono
Leonardo Borges
 
JavaScript - De verdade
Luis Vendrame
 
Coroutines tech summit
Paulo Sato
 
Crawling - Coleta de dados na Web com PHP
Luis Gustavo Almeida
 
Acessando o MySql com o Python
antonio sérgio nogueira
 
Palestra cbq
Rildo Pragana
 
Why functional programming matters
Jean Carlo Machado
 
App scala
Agnaldo Oliveira
 
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
iMasters
 
Python e bancos NoSQL
Marinho Brandão
 
Busca Visual
gsroma
 
Anúncio

Destaque (20)

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

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

PDF
Node.JS - Workshop do básico ao avançado
Eduardo Bohrer
 
PPTX
Node JS - Parte 1
Bruno Catão
 
PDF
Workshop ExtJS4
javamanrj
 
PPT
aula de introdução a ecamscript e typescript
FabioAbrantesDiniz
 
PPTX
Javascript avançado
Ricardo Cavalcanti
 
PPTX
TypeScript - Campus party 2013
Giovanni Bassi
 
PPTX
NodeJS - Tutorial de forma simples e pratica.
Filipe Morelli
 
PDF
Javascript Ilegível
Rafael Specht da Silva
 
PDF
Realtime com node.js e socket.io
Caio Ribeiro Pereira
 
PPTX
Javascript para CSharpers 2 - Functions
Wesley Lemos
 
Node.JS - Workshop do básico ao avançado
Eduardo Bohrer
 
Node JS - Parte 1
Bruno Catão
 
Workshop ExtJS4
javamanrj
 
aula de introdução a ecamscript e typescript
FabioAbrantesDiniz
 
Javascript avançado
Ricardo Cavalcanti
 
TypeScript - Campus party 2013
Giovanni Bassi
 
NodeJS - Tutorial de forma simples e pratica.
Filipe Morelli
 
Javascript Ilegível
Rafael Specht da Silva
 
Realtime com node.js e socket.io
Caio Ribeiro Pereira
 
Javascript para CSharpers 2 - Functions
Wesley Lemos
 

Mais de Rodrigo Branas (14)

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

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