Breve história do
Javascript
modularizado
<script type="text/javascript"
src="index.js">
</script>
• Separation
• Composability
• Dependency management
• Namespace management
• Consistent implementation
• Separação
• Reuso
• Gerenciamento de dependências
• Gerenciamento de nomes
• Implementação consistente
Object Literal
Pattern
IIFE CommonJS AMD UMD
Object Literal Pattern
const Person = {
name: 'Filipe'
};
const Author = {
getName: function() {
return Person.name;
}
};
Prós
• Fácil de entender
• Fácil de implementar
Contras
• Depende de uma variável global
• Baixa reusabilidade
• Variáveis e métodos não privados
• Conflitos entre módulos
IIFE
Immediately Invoked Function Expression
const Author = (function(newName) {
var name = newName;
function getName() {
return name;
}
return {
getName: getName
};
})('Filipe');
Prós
• Melhor controle interno
• Variáveis e métodos privados
• Controle ao importar dependências
• Algo parecido com um construtor e também
com decorator pattern
Contras
• Continua dependendo de uma variável global
• Uma sintaxe feia e de difícil entendimento
CommonJS
Modularidade no server-side
module.export = function Person(newName) {
var name = newName;
return {
name: name
}
}
ou o que o node consolidou
var Person = require('./person.js');
module.exports = function Author() {
function getName() {
return Person('Filipe').name;
}
return {
getName: getName
};
};
Prós
• Sintaxe clara e influenciou o ES6
• Variáveis com escopo limitado
• Não é possível declarar uma variável global
Contras
• Não funciona bem assincronamente
• Lento e pesado em devices "fracos"
AMD
The next step
define('Person', function(newName) {
var name = newName;
return {
name: name
};
});
define('Author', ['Person'], function(Person) {
function getName() {
return Person('Filipe').name;
}
return {
getName: getName
}
});
Prós
• É assíncrono
• Gerenciamento de nomes facilitados
Contras
• Sintaxe complicada
• Sintaxe feia
UMD
Combina o CommonJS com o AMD
Prós e contras
Combina os mesmo prós e contras
ES6
const Person = {
name: 'Filipe'
};
export default Person;
import * from './person.js';
class Author {
getName() {
return Person.name;
}
}
import { name } from './person.js';
class Author {
getName() {
return name;
}
}
import * as Person from 'person.js';
class Author {
getName() {
return name;
}
}
Typescript namespace
namespace Animals {
export class Cats {
types: [
'Persian ',
'Russian'
];
}
export class Cat {
getCat() {
const cats = new Cats();
return cats.types[1];
}
}
}
namespace Animals {
export class Dogs {
types: [
'Dachshund',
'Bulldog',
'Boxer'
];
}
export class Dog {
getDog() {
const dogs = new Dogs();
return dogs.types[0];
}
}
}
const dog = new Animals.Dog();
dog.getDog(); // Dachshund
const cat = new Animals.Cat();
cat.getCat(); // Russian
namespace Shapes {
export namespace Polygons {
export class Triangle { }
export class Square { }
}
}
import polygons = Shapes.Polygons;
let sq = new polygons.Square();
Referencias
• https://www.sitepoint.com/understanding-es6-modules-via-their-history/
• https://groups.google.com/forum/#!msg/comp.lang.javascript/
eTzWVa1W_pE/N9lnvRG9WJ8J
• https://medium.com/@crohacz_86666/basics-of-modular-
javascript-2395c82dd93a
• https://www.typescriptlang.org/docs/handbook/namespaces.html
• https://requirejs.org/docs/whyamd.html#amd
Filipe M. Silva
Javascript software developer
na
Concrete Solutions
Twitter/Instagram
@flpms
Blog
https://flpms.me

Breve história do javascript modularizado