Post on 21-Apr-2017
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