SlideShare uma empresa Scribd logo
1 de 73
Baixar para ler offline
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

Mais conteúdo relacionado

Mais procurados

Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-androidAlberto Souza
 
Funcionamento interno do node.js e boas práticas
Funcionamento interno do node.js e boas práticasFuncionamento interno do node.js e boas práticas
Funcionamento interno do node.js e boas práticasKirmayr tomaz
 
Node.js para desenvolvedores .NET
Node.js para desenvolvedores .NETNode.js para desenvolvedores .NET
Node.js para desenvolvedores .NETMVP Microsoft
 
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André DéoZabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André DéoAndré Déo
 
Reference Counting
Reference CountingReference Counting
Reference Countingcrabtw
 
Dicas e Truques TypeScript
Dicas e Truques TypeScriptDicas e Truques TypeScript
Dicas e Truques TypeScriptLoiane Groner
 
Programação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoProgramação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoLeonardo Borges
 
JavaScript - De verdade
JavaScript - De verdadeJavaScript - De verdade
JavaScript - De verdadeLuis Vendrame
 
Coroutines tech summit
Coroutines  tech summitCoroutines  tech summit
Coroutines tech summitPaulo Sato
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Luis Gustavo Almeida
 
Why functional programming matters
Why functional programming mattersWhy functional programming matters
Why functional programming mattersJean Carlo Machado
 
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno RochaiMasters
 
Busca Visual
Busca VisualBusca Visual
Busca Visualgsroma
 

Mais procurados (20)

Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-android
 
Funcionamento interno do node.js e boas práticas
Funcionamento interno do node.js e boas práticasFuncionamento interno do node.js e boas práticas
Funcionamento interno do node.js e boas práticas
 
Node.js para desenvolvedores .NET
Node.js para desenvolvedores .NETNode.js para desenvolvedores .NET
Node.js para desenvolvedores .NET
 
PHP fora da Web
PHP fora da WebPHP fora da Web
PHP fora da Web
 
PHP e Mysql - DELETE
PHP e Mysql - DELETEPHP e Mysql - DELETE
PHP e Mysql - DELETE
 
Curso de Node JS Básico
Curso de Node JS BásicoCurso de Node JS Básico
Curso de Node JS Básico
 
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André DéoZabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
 
Reference Counting
Reference CountingReference Counting
Reference Counting
 
Dicas e Truques TypeScript
Dicas e Truques TypeScriptDicas e Truques TypeScript
Dicas e Truques TypeScript
 
Programação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoProgramação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncrono
 
JavaScript - De verdade
JavaScript - De verdadeJavaScript - De verdade
JavaScript - De verdade
 
Coroutines tech summit
Coroutines  tech summitCoroutines  tech summit
Coroutines tech summit
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP
 
Acessando o MySql com o Python
Acessando o MySql com o PythonAcessando o MySql com o Python
Acessando o MySql com o Python
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
 
Why functional programming matters
Why functional programming mattersWhy functional programming matters
Why functional programming matters
 
App scala
App scalaApp scala
App scala
 
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
7Masters jQuery - boas práticas em JavaScriptQuery, com Bruno Rocha
 
Python e bancos NoSQL
Python e bancos NoSQLPython e bancos NoSQL
Python e bancos NoSQL
 
Busca Visual
Busca VisualBusca Visual
Busca Visual
 

Destaque

Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasRodrigo Branas
 
Node.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasNode.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasRodrigo Branas
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasRodrigo Branas
 
A evolução do AngularJS
A evolução do AngularJSA evolução do AngularJS
A evolução do AngularJSRodrigo Branas
 
Criando serviços com AngularJS
Criando serviços com AngularJSCriando serviços com AngularJS
Criando serviços com AngularJSRodrigo Branas
 
Introdução ao AngularJS
Introdução ao AngularJSIntrodução ao AngularJS
Introdução ao AngularJSRodrigo Branas
 
Construindo Diretivas com AngularJS
Construindo Diretivas com AngularJSConstruindo Diretivas com AngularJS
Construindo Diretivas com AngularJSRodrigo Branas
 
HTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSRodrigo Branas
 
Utilizando diretivas com AngularJS
Utilizando diretivas com AngularJSUtilizando diretivas com AngularJS
Utilizando diretivas com AngularJSRodrigo Branas
 
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...Rodrigo Branas
 
Porque eu deveria utilizar Agile
Porque eu deveria utilizar AgilePorque eu deveria utilizar Agile
Porque eu deveria utilizar AgileRodrigo Branas
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de RefactoringRodrigo Branas
 
Test-Driven Development com JavaScript, Jasmine Karma
Test-Driven Development com JavaScript, Jasmine  KarmaTest-Driven Development com JavaScript, Jasmine  Karma
Test-Driven Development com JavaScript, Jasmine KarmaRodrigo Branas
 
Validando Formulários com AngularJS
Validando Formulários com AngularJSValidando Formulários com AngularJS
Validando Formulários com AngularJSRodrigo Branas
 
Aplicando filtros com AngularJS
Aplicando filtros com AngularJSAplicando filtros com AngularJS
Aplicando filtros com AngularJSRodrigo Branas
 
HTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSHTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSRodrigo Branas
 

Destaque (20)

Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
 
Node.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasNode.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo Branas
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo Branas
 
A evolução do AngularJS
A evolução do AngularJSA evolução do AngularJS
A evolução do AngularJS
 
Criando serviços com AngularJS
Criando serviços com AngularJSCriando serviços com AngularJS
Criando serviços com AngularJS
 
Introdução ao AngularJS
Introdução ao AngularJSIntrodução ao AngularJS
Introdução ao AngularJS
 
Construindo Diretivas com AngularJS
Construindo Diretivas com AngularJSConstruindo Diretivas com AngularJS
Construindo Diretivas com AngularJS
 
Selenium - WebDriver
Selenium - WebDriverSelenium - WebDriver
Selenium - WebDriver
 
HTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJS
 
Utilizando diretivas com AngularJS
Utilizando diretivas com AngularJSUtilizando diretivas com AngularJS
Utilizando diretivas com AngularJS
 
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
 
Porque eu deveria utilizar Agile
Porque eu deveria utilizar AgilePorque eu deveria utilizar Agile
Porque eu deveria utilizar Agile
 
Grunt
GruntGrunt
Grunt
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de Refactoring
 
Test-Driven Development com JavaScript, Jasmine Karma
Test-Driven Development com JavaScript, Jasmine  KarmaTest-Driven Development com JavaScript, Jasmine  Karma
Test-Driven Development com JavaScript, Jasmine Karma
 
#2 - Git - DAG
#2 - Git - DAG#2 - Git - DAG
#2 - Git - DAG
 
Validando Formulários com AngularJS
Validando Formulários com AngularJSValidando Formulários com AngularJS
Validando Formulários com AngularJS
 
Aplicando filtros com AngularJS
Aplicando filtros com AngularJSAplicando filtros com AngularJS
Aplicando filtros com AngularJS
 
HTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSHTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJS
 

Semelhante a Sistema de módulos no Node.js: criando e exportando módulos

Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Jeison Barros
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
jQuery básico (parte 3)
jQuery básico (parte 3)jQuery básico (parte 3)
jQuery básico (parte 3)Luís Cobucci
 
Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Vanderson Silva
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusDenis L Presciliano
 
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontEvento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontMichel Ribeiro
 
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia
 
Teste unitário
Teste unitárioTeste unitário
Teste unitáriodist_bp
 
Evolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptEvolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptJean Carlo Emer
 

Semelhante a Sistema de módulos no Node.js: criando e exportando módulos (20)

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

Mais de Rodrigo Branas

#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisasRodrigo Branas
 
#1 - Git - Introdução
#1 - Git - Introdução#1 - Git - Introdução
#1 - Git - IntroduçãoRodrigo Branas
 
#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remoto#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remotoRodrigo Branas
 
#3 - Git - Branching e Merging
#3 - Git - Branching e Merging#3 - Git - Branching e Merging
#3 - Git - Branching e MergingRodrigo Branas
 
JavaScript - Expressões Regulares
JavaScript - Expressões RegularesJavaScript - Expressões Regulares
JavaScript - Expressões RegularesRodrigo Branas
 
Automação de Testes com AngularJS
Automação de Testes com AngularJSAutomação de Testes com AngularJS
Automação de Testes com AngularJSRodrigo Branas
 
Criando Filtros com AngularJS
Criando Filtros com AngularJSCriando Filtros com AngularJS
Criando Filtros com AngularJSRodrigo Branas
 
Criando aplicações Single-Page com AngularJS
Criando aplicações Single-Page com AngularJSCriando aplicações Single-Page com AngularJS
Criando aplicações Single-Page com AngularJSRodrigo Branas
 
Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptRodrigo Branas
 

Mais de Rodrigo Branas (14)

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

Sistema de módulos no Node.js: criando e exportando módulos

  • 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?
  • 5.
  • 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);
  • 10.
  • 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);
  • 15.
  • 16. Invocando a função generate index.js 1. var  serialGenerator  =  require('./serialGenerator.js');   2. console.log(serialGenerator.generate());
  • 17.
  • 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
  • 25.
  • 26.
  • 27. Exibindo argumentos de um módulo 1. console.log(arguments);
  • 28.
  • 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.
  • 31.
  • 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.
  • 34.
  • 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.
  • 39.
  • 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.
  • 44.
  • 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');
  • 47.
  • 48.
  • 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
  • 52.
  • 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
  • 54.
  • 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