javascript: potenciando la web desde 1995
DESCRIPTION
Presentación de Carlos Benítez @etnassoft y Enrique Amodeo @eamodeorubio sobre Javascript para ADWE MadridTRANSCRIPT
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Indice
-‐ Introducción al lenguaje -‐ El JavaScript me confunde -‐ Buenas prácCcas y patrones -‐ AJAX, HIJAX, SPI y otras cosas malas -‐ El futuro de JavaScript
Introducción al lenguaje
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
CaracterísCcas de lenguaje JavaScript:
-‐ Interpretado (no compilado) -‐ Lenguaje de ejecución en cliente -‐ Tipado blando (no-‐Cpado) -‐ Orientado a objetos
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
CaracterísCcas del lenguaje
Lenguaje Interpretado
-‐ No es un lenguaje compilado -‐ Cada instrucción se interpreta en Cempo de ejecución -‐ La opCmización del código se realiza durante la fase de diseño.
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Lenguaje Interpretado
Seguridad, autoría y rendimiento
-‐ El código aparece tal cual -‐ Compromete la seguridad de una lógica críCca -‐ A mayor tamaño de archivo, mayor Cempo de carga
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Lenguaje Interpretado
Soluciones poco afortunadas:
-‐ Compresión del código: JSMin -‐ Ofuscación: YUI Compressor, Packer
Inconvenientes:
-‐ Capa muy débil de seguridad -‐ Ilegibilidad del código para adaptarlo
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Herramientas para medir la calidad del soZware
Lenguaje Interpretado
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Herramientas para medir la calidad del soZware
Douglas Crockford Developers
Lenguaje Interpretado
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
CaracterísCcas del lenguaje
Tipado blando, dinámico o no-‐Cpado
-‐ Las variables se declaran sin un Cpo de datos concreto -‐ De hecho, es posible no declarar variables de forma explícita -‐ Los Cpos no son inalterables -‐ La coerción de datos interna determina el manejo de los datos.
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Tipado dinámico y coerción de datos
Tipado blando, dinámico o no-‐Cpado
-‐ Las variables se declaran sin un Cpo de datos concreto -‐ De hecho, es posible no declarar variables de forma explícita -‐ Los Cpos no son inalterables -‐ La coerción de datos interna determina el manejo de los datos.
Coerción de datos interna
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
CaracterísCcas del lenguaje
Orientado a objetos
-‐ Alto nivel de abstracción -‐ No implementa el concepto de clases -‐ Se fundamenta en los protoCpos
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Objetos en JavaScript
Tipos de EnCdades JavaScript
PRIMITIVAS -‐ undefined -‐ null -‐ booleanos -‐ cadenas -‐ números
OBJETOS
-‐ Todo lo demás
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Tipos de EnCdades JavaScript
PRIMITIVAS -‐ undefined -‐ null -‐ booleanos -‐ cadenas -‐ números
OBJETOS
-‐ Todo lo demás constructores
Objetos en JavaScript
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Tipos de EnCdades JavaScript
PRIMITIVAS -‐ undefined -‐ null -‐ booleanos -‐ cadenas -‐ números
OBJETOS
-‐ Todo lo demás constructores
Boolean Number String
Objetos en JavaScript
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Tipos de EnCdades JavaScript
PRIMITIVAS -‐ undefined -‐ null -‐ booleanos -‐ cadenas -‐ números
OBJETOS
-‐ Todo lo demás constructores
Boolean Number String
Objetos en JavaScript
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Tipos de EnCdades JavaScript
PRIMITIVAS
-‐ undefined -‐ null
OBJETOS
-‐ Todo lo demás
Objetos en JavaScript
El JavaScript me confunde (O por qué JavaScript no 2ene nada que ver con Java)
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
El JavaScript me confunde
-‐ ECMAScript: una especificación con muchos sabores
-‐ JavaScript: Netscape Corp. -‐ AcConScript: Macromedia -‐ JScript: Internet Explorer -‐ V8: Google Chrome -‐ Mozilla's JavaScript: Firefox -‐ Rhino (Java) -‐ KJS (KDE): Conqueror -‐ JavaScriptCore: Apple Inc.
TraceMonkey
SpiderMonkey
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
El JavaScript me confunde Objetos abiertos var treintaYDos = new Number(32);
treintaYDos.duplicar = funcNon(){ return 2 * this; };
alert(treintaYDos.duplicar());
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
El JavaScript me confunde Objetos abiertos var pepe = " Pepe\t\n";
String.prototype.trim = funcNon(){ return this.replace(/^\s+/g, '').replace(/\s+$/g, ''); };
alert(pepe.trim());
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
El JavaScript me confunde Scopes var defaultConfiguraNon = {
'maxLives': 3, 'level': 'intermediate' };
var play = funcNon(gameConfig){ var configuraNon = gameConfig || defaultConfiguraNon; score = 0; // .. do some play };
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
El JavaScript me confunde Scopes var defaultConfiguraNon = {
'maxLives': 3, 'level': 'intermediate' };
var play = funcNon(gameConfig){ var configuraNon = gameConfig || defaultConfiguraNon; score = 0; // .. do some play };
Global
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
El JavaScript me confunde Scopes var defaultConfiguraNon = {
'maxLives': 3, 'level': 'intermediate' };
var play = funcNon(gameConfig){ var configuraNon = gameConfig || defaultConfiguraNon; score = 0; // .. do some play };
Local
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
El JavaScript me confunde Scopes var ratePlayer = funcNon(score){
if(score == 0){ var isALoser = true; } return isALoser;
};
No problem !
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
El JavaScript me confunde Closures var crearSaludo = funcNon(mensaje){
var saludo = funcNon(porConsola){ var mensajeSaludo = mensaje + " " + nombre; if (porConsola) console.log(mensajeSaludo); else alert(mensajeSaludo); }; mensaje = mensaje || "Hola"; var nombre = "Juan"; return saludo; }; var quePasaJuan = crearSaludo("Que pasa"); quePasaJuan(false); var holaJuan = crearSaludo(); holaJuan(true);
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
El JavaScript me confunde Closures var crearSaludo = funcNon(mensaje){
var saludo = funcNon(porConsola){ var mensajeSaludo = mensaje + " " + nombre; if (porConsola) console.log(mensajeSaludo); else alert(mensajeSaludo); }; mensaje = mensaje || "Hola"; var nombre = "Juan"; return saludo; }; var quePasaJuan = crearSaludo("Que pasa"); quePasaJuan(false); var holaJuan = crearSaludo(); holaJuan(true);
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
El JavaScript me confunde Closures SCOPE GLOBAL
…..
(CLOSURE) crearSaludo
“mensaje”
“saludo”
“nombre”
(LOCAL) saludo “porConsola”
“mensajeSaludo”
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
El JavaScript me confunde Closures SCOPE GLOBAL
…..
(CLOSURE) crearSaludo
“mensaje”
“saludo”
“nombre”
(LOCAL) saludo “porConsola”
“mensajeSaludo”
Orden de búsqueda
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
El JavaScript me confunde Closures SCOPE GLOBAL
…..
(CLOSURE) crearSaludo
“mensaje”
“saludo”
“nombre”
(LOCAL) saludo “porConsola”
“mensajeSaludo”
Orden de búsqueda
Cuidado con: ✖ Excesivo tamaño de scope ✖ Excesivo numero de scopes anidados
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
El JavaScript me confunde Closures var crearSaludo = funcNon(mensaje){
var saludo = funcNon(porConsola){ var mensajeSaludo = mensaje + " " + nombre; if (porConsola) console.log(mensajeSaludo); else alert(mensajeSaludo); }; mensaje = mensaje || "Hola"; var nombre = "Juan"; return saludo; }; var quePasaJuan = crearSaludo("Que pasa"); quePasaJuan(false); var holaJuan = crearSaludo(); holaJuan(true);
Buenas prácCcas y patrones (O cómo podemos aprovechar realmente JavaScript)
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones
Patrones de Diseño JavaScript
-‐ Creacionales -‐ Estructurales -‐ Comportamiento
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones
Patrones de Diseño Más usuales
CREACIONALES ESTRUCTURALES COMPORTAMIENTO
Factory Module Iterator
Builder Facade Memento
Prototype Proxy Observer / Listener
Singleton Decorator Visitor
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
-‐ En JavaScript, no implementa clases, sino protoCpos -‐ Los protoCpos son la base de la herencia en la POO -‐ La herencia protospica y su cadena
ProtoNpos
Buenas prácCcas y patrones
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
ProtoCpos
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
var a = { first : 'Hello', second : 'World', sum : funcNon(x, y){
return x + y; }
}; var b = { difference : funcNon(x, y){
return x -‐ y; }, __proto__ : a }; var c = { product : funcNon(x, y){ return x * y; }, __proto__ : a };
Herencia Protohpica
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
console.log( a.sum( 4, 6 ) ); // 10 console.log( b.sum( 3, 2 ) ); // 5 console.log( c.first ); // Hello
Herencia Protohpica
var a = { first : 'Hello', second : 'World', sum : funcNon(x, y){
return x + y; }
}; var b = { difference : funcNon(x, y){
return x -‐ y; }, __proto__ : a }; var c = { product : funcNon(x, y){ return x * y; }, __proto__ : a };
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
console.log( a.sum( 4, 6 ) ); // 10 console.log( b.sum( 3, 2 ) ); // 5 console.log( c.first ); // Hello
Herencia Protohpica
var a = { first : 'Hello', second : 'World', sum : funcNon(x, y){
return x + y; }
}; var b = { difference : funcNon(x, y){
return x -‐ y; }, __proto__ : a }; var c = { product : funcNon(x, y){ return x * y; }, __proto__ : a };
var a = { first : 'Hello', second : 'World', sum : funcNon(x, y){
return x + y; }
}; var b = { difference : funcNon(x, y){
return x -‐ y; }, __proto__ : a }; var c = { product : funcNon(x, y){ return x * y; }, __proto__ : a };
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
console.log( a.sum( 4, 6 ) ); // 10 console.log( b.sum( 3, 2 ) ); // 5 console.log( c.first ); // Hello
Herencia Protohpica
var a = { first : 'Hello', second : 'World', sum : funcNon(x, y){
return x + y; }
}; var b = { difference : funcNon(x, y){
return x -‐ y; }, __proto__ : a }; var c = { product : funcNon(x, y){ return x * y; }, __proto__ : a };
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
console.log( a.sum( 4, 6 ) ); // 10 console.log( b.sum( 3, 2 ) ); // 5 console.log( c.first ); // Hello
Herencia Protohpica
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
var someCar = { drive: funcNon() {}; name: 'Mazda 3' };
// Use Object.create to generate a new car var anotherCar = Object.create(someCar); anotherCar.name = 'Toyota Camry';
Patrón ProtoNpo (ECMAScript 5)
Buenas prácCcas y patrones
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones Patrón Módulo // Namespace for the library
var MyLibrary = {};
// Library definiCon MyLibrary = (funcNon () { // Private variables / properCes var p1, p2;
// Private methods funcNon aPrivateMethod() { }
// Public API return { publicMethod: funcNon () { // Code funcCon...
} } }());
MyLibrary = (funcNon(){ // Code goes here... }());
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones Patrón Módulo // Namespace for the library
var MyLibrary = {};
// Library definiCon MyLibrary = (funcNon () { // Private variables / properCes var p1, p2;
// Private methods funcNon aPrivateMethod() { }
// Public API return { publicMethod: funcNon () { // Code funcCon...
} } }());
MyLibrary = (funcNon(){ // Code goes here... }());
Función autoejecutable
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones Patrón Módulo // Namespace for the library
var MyLibrary = {};
// Library definiCon MyLibrary = (funcNon () { // Private variables / properCes var p1, p2;
// Private methods funcNon aPrivateMethod() { }
// Public API return { publicMethod: funcNon () { // Code funcCon...
} } }());
MyLibrary = (funcNon(){ // Code goes here... }());
Función autoejecutable
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones Patrón Módulo Ampliado: submódulos // Namespace for the library
var MyLibrary = {};
// Library definiCon MyLibrary = (funcNon ( ) { // Private variables / properCes var p1, p2;
// Private methods funcNon aPrivateMethod() { }
// Public API return { publicMethod: funcNon () { // Code funcCon...
} } }( ));
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones Patrón Módulo Ampliado: submódulos // Namespace for the library
var MyLibrary = {};
// Library definiCon MyLibrary = (funcNon ( ) { // Private variables / properCes var p1, p2;
// Private methods funcNon aPrivateMethod() { }
// Public API return { publicMethod: funcNon () { // Code funcCon...
} } }( ));
var MyLibrary = ( funcNon( module ){
module.foo = funcNon(){ };
return module;
}( MyLibrary ));
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones Patrón Módulo Ampliado: submódulos // Namespace for the library
var MyLibrary = {};
// Library definiCon MyLibrary = (funcNon ( ) { // Private variables / properCes var p1, p2;
// Private methods funcNon aPrivateMethod() { }
// Public API return { publicMethod: funcNon () { // Code funcCon...
} } }( ));
var MyLibrary = ( funcNon( module ){
module.foo = funcNon(){ };
return module;
}( MyLibrary ));
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones Patrón Módulo Ampliado: submódulos // Namespace for the library
var MyLibrary = {};
// Library definiCon MyLibrary = (funcNon ( ) { // Private variables / properCes var p1, p2;
// Private methods funcNon aPrivateMethod() { }
// Public API return { publicMethod: funcNon () { // Code funcCon...
} } }( ));
var MyLibrary = ( funcNon( module ){
module.foo = funcNon(){ };
return module;
}( MyLibrary ));
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones Patrón Módulo Ampliado: submódulos // Namespace for the library
var MyLibrary = {};
// Library definiCon MyLibrary = (funcNon ( ) { // Private variables / properCes var p1, p2;
// Private methods funcNon aPrivateMethod() { }
// Public API return { publicMethod: funcNon () { // Code funcCon...
} } }( ));
var MyLibrary = ( funcNon( module ){
module.foo = funcNon(){ };
return module;
}( MyLibrary ));
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones Patrón Módulo Revelado (Revealing Module)
var MyLibrary = (funcNon () { // Private variables / properCes var p1, p2;
// Private methods funcNon aPrivateMethod() { }
// Public Method funcNon publicMethod () { }
// Another Public Method funcNon anotherPublicMethod () { }
// Public API return { publicMethod: publicMethod, anotherPublicMethod: anotherPublicMethod } }());
MyLibrary = (funcNon(){ // Code goes here... }());
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones Patrón Módulo Revelado (Revealing Module)
var MyLibrary = (funcNon () { // Private variables / properCes var p1, p2;
// Private methods funcNon aPrivateMethod() { }
// Public Method funcNon publicMethod () { }
// Another Public Method funcNon anotherPublicMethod () { }
// Public API return { publicMethod: publicMethod, anotherPublicMethod: anotherPublicMethod } }());
return { publicMethod: publicMethod, anotherPublicMethod: anotherPublicMethod }
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones Patrón Módulo Revelado (Revealing Module)
return { publicMethod: publicMethod, anotherPublicMethod: anotherPublicMethod }
var MyLibrary = (funcNon () { // Private variables / properCes var p1, p2;
// Private methods funcNon aPrivateMethod() { }
// Public Method funcNon publicMethod () { }
// Another Public Method funcNon anotherPublicMethod () { }
// Public API return { publicMethod: publicMethod, anotherPublicMethod: anotherPublicMethod } }());
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones This Namespace Proxy (James Edwards)
var myApp = {}; (funcNon(){ // Private variables / properCes var foo = 'Hello'; var bar = 'World';
//Private method var myMessage = funcNon(){ return foo + ' ' + bar; };
// Public Method this.sum = funcNon( param1, param2 ){ return param1 + param2; };
}).apply( myApp );
this.sum = funcNon( param1, param2 ){ return param1 + param2; };
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones This Namespace Proxy (James Edwards)
this.sum = funcNon( param1, param2 ){ return param1 + param2; };
var myApp = {}; (funcNon(){ // Private variables / properCes var foo = 'Hello'; var bar = 'World';
//Private method var myMessage = funcNon(){ return foo + ' ' + bar; };
// Public Method this.sum = funcNon( param1, param2 ){ return param1 + param2; };
}).apply( myApp );
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones FuncNon Factory ns.convertToFancyBtn = funcNon(fancyBtnId, msg){
var myBumon = document.getElementById(fancyBtnId); myBu}on.onclick = funcNon(){ alert(msg); }; }; //..... ns.convertToFancyBtn('btn1', 'Hola mundo');
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones FuncNon Factory ns.convertToFancyBtn = funcNon(fancyBtnId, msg){
var myBumon = document.getElementById(fancyBtnId); myBu}on.onclick = funcNon(){ alert(msg); }; }; //..... ns.convertToFancyBtn('btn1', 'Hola mundo');
Enlazados por la Closure
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones FuncNon Factory ns.convertToFancyBtn = funcNon(fancyBtnId, msg){
var myBumon = document.getElementById(fancyBtnId); myBu}on.onclick = funcNon(){ alert(msg); }; }; //..... ns.convertToFancyBtn('btn1', 'Hola mundo');
Pero estos también
(y no se usan)
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones FuncNon Factory ns.convertToFancyBtn = funcNon(fancyBtnId, msg){
var myBumon = document.getElementById(fancyBtnId); myBu}on.onclick = funcNon(){ alert(msg); }; }; //..... ns.convertToFancyBtn('btn1', 'Hola mundo');
Pero estos también
(y no se usan)
✖ Referencias circulares ✖ Memoria ✖ Confusión ✖ Resolución referencias
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones FuncNon Factory ns.newNoCfier = funcNon(msg){
return funcNon(){ alert(msg); } }; ns.convertToFancyBtn = funcNon(fancyBtnId, msg){ var myBumon = document.getElementById(fancyBtnId); myBu}on.onclick = ns.newNoCfier(msg); }; //..... ns.convertToFancyBtn('btn1', 'Hola mundo');
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones FuncNon Factory ns.newNoCfier = funcNon(msg){
return funcNon(){ alert(msg); } }; ns.convertToFancyBtn = funcNon(fancyBtnId, msg){ var myBumon = document.getElementById(fancyBtnId); myBu}on.onclick = ns.newNoCfier(msg); }; //..... ns.convertToFancyBtn('btn1', 'Hola mundo');
Control de la closure
ReuClizable
Sencillo y legible
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones FuncNon Factory (“this” Binding)
ns.bindFuncConToObject = funcNon(f, obj){ if (typeof(f) != 'funcNon') return obj; return funcNon(){ f.apply(obj, arguments); } }; //..... submitBtn.onclick = ns.bindFuncConToObject(
controller.checkForm , controller);
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones FuncNon Factory (“this” Binding)
ns.bindFuncConToObject = funcNon(f, obj){ if (typeof(f) != 'funcNon') return obj; return funcNon(){ f.apply(obj, arguments); } }; //..... submitBtn.onclick = ns.bindFuncConToObject(
controller.checkForm , controller);
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones FuncNon Factory (“this” Binding)
ns.bindFuncConToObject = funcNon(f, obj){ if (typeof(f) != 'funcNon') return obj; return funcNon(){ f.apply(obj, arguments); } }; //..... submitBtn.onclick = ns.bindFuncConToObject(
controller.checkForm , controller);
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones ¡ Curry ! ns.fadeOut=funcNon(trigger, Nme, selector) {
// .. Some visual FX code }; //... ns.fadeOut('onclick', 200, 'coolForm'); ns.fadeOut('onclick', 200, 'warningMsg');
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones ¡ Curry ! ns.fadeOut=funcNon(trigger, Nme, selector) {
// .. Some visual FX code }; //... ns.fadeOut('onclick', 200, 'coolForm'); ns.fadeOut('onclick', 200, 'warningMsg');
✖ RepeCCvo y laborioso ✖ Fácil equivocarnos ✖ Di~cil de mantener ✖ No es legible (intent)
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones ¡ Curry ! (John Resig)
FuncCon.prototype.curry = funcNon(){ var fn = this; var fixedArgs = Array.prototype.slice.call(arguments); return funcNon(){ return fn.apply(this, fixedArgs.concat(
Array.prototype.slice.call(arguments))); }; }; //... ns.fastFadeOutWhenClicked=ns.fadeOut.curry('onclick', 200); //.. ns.fastFadeOutWhenClicked('coolForm'); ns.fastFadeOutWhenClicked('warningMsg');
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones ¡ Curry ! (John Resig)
FuncCon.prototype.curry = funcNon(){ var fn = this; var fixedArgs = Array.prototype.slice.call(arguments); return funcNon(){ return fn.apply(this, fixedArgs.concat(
Array.prototype.slice.call(arguments))); }; }; //... ns.fastFadeOutWhenClicked=ns.fadeOut.curry('onclick', 200); //.. ns.fastFadeOutWhenClicked('coolForm'); ns.fastFadeOutWhenClicked('warningMsg');
Argumentos transformados en
array
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones ¡ Curry ! (John Resig)
FuncCon.prototype.curry = funcNon(){ var fn = this; var fixedArgs = Array.prototype.slice.call(arguments); return funcNon(){ return fn.apply(this, fixedArgs.concat(
Array.prototype.slice.call(arguments))); }; }; //... ns.fastFadeOutWhenClicked=ns.fadeOut.curry('onclick', 200); //.. ns.fastFadeOutWhenClicked('coolForm'); ns.fastFadeOutWhenClicked('warningMsg');
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones ¡ Curry ! (John Resig)
FuncCon.prototype.curry = funcNon(){ var fn = this; var fixedArgs = Array.prototype.slice.call(arguments); return funcNon(){ return fn.apply(this, fixedArgs.concat(
Array.prototype.slice.call(arguments))); }; }; //... ns.fastFadeOutWhenClicked=ns.fadeOut.curry('onclick', 200); //.. ns.fastFadeOutWhenClicked('coolForm'); ns.fastFadeOutWhenClicked('warningMsg');
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones ¡ Curry ! (John Resig)
FuncCon.prototype.curry = funcNon(){ var fn = this; var fixedArgs = Array.prototype.slice.call(arguments); return funcNon(){ return fn.apply(this, fixedArgs.concat(
Array.prototype.slice.call(arguments))); }; }; //... ns.fastFadeOutWhenClicked=ns.fadeOut.curry('onclick', 200); //.. ns.fastFadeOutWhenClicked('coolForm'); ns.fastFadeOutWhenClicked('warningMsg');
ReuClizable legible (intent)
Flexible
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones OO sin prototype: Encapsulación
ns.Evento = funcNon(nombre){ var id = nombre || '<anonymous>'; var subscriptores = []; var subscriptorYaRegistrado = funcNon(subscriptor){//... }; var noNficarSubscriptor = funcNon(evento, subscriptor){//... }; this.registrarSubscriptor = funcNon(subscriptor){//... }; this.borrarSubscriptor = funcNon(subscriptor){//... }; this.noNficar = funcNon(callback){//... }; this.destruir = funcNon(){//... }; }; //.. var onClick = new ns.Evento('onclick');
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones OO sin prototype: Encapsulación
ns.Evento = funcNon(nombre){ var id = nombre || '<anonymous>'; var subscriptores = []; var subscriptorYaRegistrado = funcNon(subscriptor){//... }; var noNficarSubscriptor = funcNon(evento, subscriptor){//... }; this.registrarSubscriptor = funcNon(subscriptor){//... }; this.borrarSubscriptor = funcNon(subscriptor){//... }; this.noNficar = funcNon(callback){//... }; this.destruir = funcNon(){//... }; }; //.. var onClick = new ns.Evento('onclick');
Datos privados
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones OO sin prototype: Encapsulación
ns.Evento = funcNon(nombre){ var id = nombre || '<anonymous>'; var subscriptores = []; var subscriptorYaRegistrado = funcNon(subscriptor){//... }; var noNficarSubscriptor = funcNon(evento, subscriptor){//... }; this.registrarSubscriptor = funcNon(subscriptor){//... }; this.borrarSubscriptor = funcNon(subscriptor){//... }; this.noNficar = funcNon(callback){//... }; this.destruir = funcNon(){//... }; }; //.. var onClick = new ns.Evento('onclick');
Métodos privados
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones OO sin prototype: Encapsulación
ns.Evento = funcNon(nombre){ var id = nombre || '<anonymous>'; var subscriptores = []; var subscriptorYaRegistrado = funcNon(subscriptor){//... }; var noNficarSubscriptor = funcNon(evento, subscriptor){//... }; this.registrarSubscriptor = funcNon(subscriptor){//... }; this.borrarSubscriptor = funcNon(subscriptor){//... }; this.noNficar = funcNon(callback){//... }; this.destruir = funcNon(){//... }; }; //.. var onClick = new ns.Evento('onclick');
Métodos públicos
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones OO sin prototype: Encapsulación
ns.Evento = (funcNon(){ var eventos = []; var noNficarSubscriptor = funcNon(evento, subscriptor){//... }; var fn=funcNon(nombre){ eventos.push(this); // ... COMO ANTES ... }; fn.destruirTodosLosEventos = funcNon(){//... }; return fn; })(); //.. var onClick = new ns.Evento('onclick'); var onBlur = new ns.Evento('onblur'); //.. ns.Evento.destruirTodosLosEventos();
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones OO sin prototype: Encapsulación
ns.Evento = (funcNon(){ var eventos = []; var noNficarSubscriptor = funcNon(evento, subscriptor){//... }; var fn=funcNon(nombre){ eventos.push(this); // ... COMO ANTES ... }; fn.destruirTodosLosEventos = funcNon(){//... }; return fn; })(); //.. var onClick = new ns.Evento('onclick'); var onBlur = new ns.Evento('onblur'); //.. ns.Evento.destruirTodosLosEventos();
Datos privados estáCcos
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones OO sin prototype: Encapsulación
ns.Evento = (funcNon(){ var eventos = []; var noNficarSubscriptor = funcNon(evento, subscriptor){//... }; var fn=funcNon(nombre){ eventos.push(this); // ... COMO ANTES ... }; fn.destruirTodosLosEventos = funcNon(){//... }; return fn; })(); //.. var onClick = new ns.Evento('onclick'); var onBlur = new ns.Evento('onblur'); //.. ns.Evento.destruirTodosLosEventos();
Metodos privados estáCcos
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones OO sin prototype: Encapsulación
ns.Evento = (funcNon(){ var eventos = []; var noNficarSubscriptor = funcNon(evento, subscriptor){//... }; var fn=funcNon(nombre){ eventos.push(this); // ... COMO ANTES ... }; fn.destruirTodosLosEventos = funcNon(){//... }; return fn; })(); //.. var onClick = new ns.Evento('onclick'); var onBlur = new ns.Evento('onblur'); //.. ns.Evento.destruirTodosLosEventos();
Metodos publicos estáCcos
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
Buenas prácCcas y patrones OO sin prototype: Tipos parametrizables
ns.Evento = funcNon(noNficarSubscriptor){ var eventos = []; var fn=funcNon(nombre){// ... }; fn.destruirTodosLosEventos = funcNon(){//... }; return fn; }; ns.EventoDirecto = ns.Evento(noCficadorSimple); ns.EventoDiferido = ns.Evento(noCficadorSegundoPlano); ns.EventoRemoto = ns.Evento(noCficadorAJAX); //.. var onClickRemoto = new ns.EventoRemoto('onclick');
AJAX, HIJAX, SPI y otras cosas malas (O cómo mimar un poco a los usuarios)
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Full Post-‐back
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Full Post-‐back (UX)
✖ Latencia ✖ Ancho de banda ✖ Lógica de presentación en servidor ✖ Generación HTML ✖ Excesiva navegación ✖ Detección rápida de errores
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Full Post-‐back (UX)
✖ Latencia ✖ Ancho de banda ✖ Lógica de presentación en servidor ✖ Generación HTML ✖ Excesiva navegación ✖ Detección rápida de errores
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Full Post-‐back (Ingeniería Sozware)
✖ Descarga y navegación mezclada ✖ Lógica de presentación en servidor ✖ GesCón de la sesión (cookies) ✖ Escalabilidad (cloud)
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Full Post-‐back (Ingeniería Sozware)
✖ Descarga y navegación mezclada ✖ Lógica de presentación en servidor ✖ GesCón de la sesión (cookies) ✖ Escalabilidad (cloud)
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
ParNal Rendering
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
ParNal Rendering
AJAX al rescate !
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
ParNal Rendering es sólo un “apaño”
Menos espera Menor ancho de banda
✖ Lógica de presentación en servidor ✖ Generación HTML (pero menos) ✖ Excesiva navegación ✖ Detección rápida de errores ✖ Descarga y navegación mezclada ✖ GesCón de la sesión ✖ Escalabilidad
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Single Page Interface BR
OWSER Control Modelo
Vista
Aplicación cliente
X-‐Browser Framework
AJAX DOM JSON/HTTP
Descarga
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Single Page Interface BR
OWSER Control Modelo
Vista
Aplicación cliente
X-‐Browser Framework
AJAX DOM JSON/HTTP
Descarga
Procesos independientes
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Single Page Interface BR
OWSER Control Modelo
Vista
Aplicación cliente
X-‐Browser Framework
AJAX DOM
Logica completa de presentación en cliente
Validaciones en cliente Control de navegación en cliente
AcCvar/DesacCvar widgets Generación DOM en cliente (UI)
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Single Page Interface BR
OWSER Control Modelo
Vista
Aplicación cliente
X-‐Browser Framework
AJAX DOM
Aislar fabricante browser UClidades
Widget Toolkits jQuery, DOJO, Mootols, etc.
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Single Page Interface BR
OWSER Control Modelo
Vista
Aplicación cliente
X-‐Browser Framework
AJAX DOM JSON/HTTP
Llamadas a servidor sólo cuando es necesario
En segundo plano Validación (otra vez) Reglas de negocio
Persistencia
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Webtop
BROWSER
Aplicación X Instancia 1
X-‐Browser Framework
AJAX DOM
Webtop Framework
Aplicación Y Instancia 1
Aplicación Z Instancia 1
Aplicación X Instancia 2
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Webtop
BROWSER
Aplicación X Instancia 1
X-‐Browser Framework
AJAX DOM
Webtop Framework
Aplicación Y Instancia 1
Aplicación Z Instancia 1
Aplicación X Instancia 2
Varias aplicaciones a la vez en la misma página
Cada una se descarga por separado
Descarga dinámica bajo demanda
Varias instancias de la misma aplicación en la misma página
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Webtop
BROWSER
Aplicación X Instancia 1
X-‐Browser Framework
AJAX DOM
Webtop Framework
Aplicación Y Instancia 1
Aplicación Z Instancia 1
Aplicación X Instancia 2
Es un “contenedor” de aplicaciones
Descarga de aplicaciones Ciclo de vida
Interacción entre aplicaciones Servicios comunes Desktop Frame (UI)
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
Webtop
BROWSER
Aplicación X Instancia 1
X-‐Browser Framework
AJAX DOM
Webtop Framework
Aplicación Y Instancia 1
Aplicación Z Instancia 1
Aplicación X Instancia 2
No hay que cambiar de pagina Aplicacion se descarga una sola
vez Cooperacion entre aplicaciones Entorno empresarial (focus)
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
HIJAX
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
HIJAX
Ouch!
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
HIJAX <a href="javascript:window.open('help.html')">
Ayuda ! </a>
<a href="#" onclick="window.open('help.html'); return false;"> Ayuda !
</a>
<a href="help.html" onclick="window.open(this.getAmribute('href')); return false;"> Ayuda !
</a>
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
HIJAX <a href="javascript:window.open('help.html')">
Ayuda ! </a>
<a href="#" onclick="window.open('help.html'); return false;"> Ayuda !
</a>
<a href="help.html" onclick="window.open(this.getAmribute('href')); return false;"> Ayuda !
</a>
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
HIJAX <a href="help.html" class="help">Ayuda !</a>
jQuery(funcNon($){ $('a.help').bind('click', funcNon(){ window.open(this.href); return false; }); });
Markup
Behaviour
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
HIJAX <form id=”signupForm" acCon="/doSignup.do" method="post"> <input type="text" name="username" id="username" /> <input type="password" name="pwd" id="pwd" /> <input type="submit" value="login" /> </form>
jQuery(funcNon($){ $(’#signupForm').submit(funcNon(){ return controller.checkPwdStrength(this); }); });
Markup
Behaviour
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
AJAX, HIJAX, SPI y otras cosas malas
HIJAX
Construye tu aplicacion como si fuera tradicional (sin JS) Cada contenido en su propia página Usa selectores para añadir JS (jQuery)
Separación CSS+HTML+JS Degradación progresiva de funcionalidad SEO
El futuro de JavaScript (Harmony, Librerías y Servidores)
JavaScript: Potenciando la web desde 1995
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
JavaScript a día de hoy
Lenguajes de Programación 2010
1-‐ Java: +52% 2-‐ C: +11% 3-‐ C++: -‐13% 4-‐ C#: +52% 5-‐ JavaScript: +76% 6-‐ Perl: +33% 7-‐ PHP: +58% 8-‐ Visual Basic: +112% 9-‐ Python: +69% 10-‐ Ruby: +78%
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
JavaScript a día de hoy
Lenguajes de Programación 2010
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
JavaScript a día de hoy
Lenguajes de Programación 2010
ECMAScript 3.1 vs
ECMAScript 4
Harmony
JavaScript: Potenciando la web desde 1995
El sueño de Brendan Eich
-‐ Estructuras OO más puras -‐ Clases -‐ Estandarización de facto
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
Las bibliotecas y el éxito jQuery JavaScript: Potenciando la web desde 1995
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
Librerías JavaScript JavaScript DistribuNon in Top Million Sites
45%
7.2%
13%
9.2%
JavaScript: Potenciando la web desde 1995
Distribución de Bibliotecas
Proyecto GNOME
-‐ Gjs: Spidermonkey Engine -‐ Seed: WebKit JavaScriptCore
/* This is publicly exported from async.js, but is defined here to * avoid a circular dependency. * * The issue is that we want async.js to build on Promise, but as * a nice tweak want Promise.get to be an async call as defined * in async.js */ let _asyncFunc = funcNon(f) { /* Create a task from an Asynchronous FuncCon, providing 'this' * as the first argument. */ f.asyncCall = funcNon() { let params = Array.slice(arguments); let me = params[0]; params[0] = f; return _asyncCall.apply(me, params); }; return f; };
JavaScript en el escritorio JavaScript: Potenciando la web desde 1995
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
Qué se echa en falta en JavaScript
-‐ No existe un sistema de módulos naCvo. -‐ No posee APIs estándares (file system, IO, binarios...) -‐ No existen interfaces estándares para BBDD o servidores Web -‐ No existe una gesCón de paquetes que controle dependencias
JavaScript: Potenciando la web desde 1995
Límites del lenguaje a día de hoy
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
Soluciones adoptadas
-‐ Gran dependencia de los Patrones de Diseño -‐ Gran dependencia de bibliotecas: jQuery -‐ JSAN como repositorio general de dependencias
Incompatible!
JS
JavaScript: Potenciando la web desde 1995
Límites del lenguaje a día de hoy
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
Propuesta de Estándar: CommonJS
-‐ Módulos -‐ Cadenas binarias -‐ Codificación de caracteres -‐ Interfaz para sistema de ficheros (file system) -‐ Sockets -‐ Tests Unitarios: afirmaciones, ejecutado y reportes -‐ Interfaz Web Server: JSGI -‐ GesCón local y remota de paquetes dependientes
JavaScript: Potenciando la web desde 1995
Límites del lenguaje a día de hoy
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)
JavaScript: Potenciando la web desde 1995
MUCHAS GRACIAS!!!!
Enrique J. Amodeo Rubio
Twi}er: @eamodeorubio
Blog: h}p://eamodeorubio.wordpress.com
Carlos Benítez
Twi}er: @EtnasSoZ
Blog: h}p://www.etnassoZ.com