Herramientas de usuario

Herramientas del sitio


wiki2:js

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
wiki2:js [2020/05/09 08:25]
127.0.0.1 editor externo
wiki2:js [2022/11/03 16:21] (actual)
Línea 908: Línea 908:
  
 map_1.get(4);​ map_1.get(4);​
 +</​code>​
 +
 +
 +
 +===== Javascript Snippets =====
 +
 +
 +==== Merge two objects ====
 +<​code>​
 +Object.assign(obj1,​ obj2);
 +let newObject = Object.assign({},​ obj1, obj2, obj3, etc);
 +</​code>​
 +
 +
 +==== URL parameters ======
 +<​code>​
 +var urlParams = new URLSearchParams(window.location.search);​
 +
 +console.log(urlParams.has('​post'​));​ // true
 +console.log(urlParams.get('​action'​));​ // "​edit"​
 +console.log(urlParams.getAll('​action'​));​ // ["​edit"​]
 +console.log(urlParams.toString());​ // "?​post=1234&​action=edit"​
 +console.log(urlParams.append('​active',​ '​1'​));​ // "?​post=1234&​action=edit&​active=1"​
 +</​code>​
 +
 +==== Local Storage ====
 +
 +<​code>​
 +window.localStorage.setItem('​test',​ '​hola'​);​
 +</​code>​
 +
 +  * setItem(): Add key and value to localStorage
 +  * getItem(): Retrieve a value by the key from localStorage
 +  * removeItem():​ Remove an item by key from localStorage
 +  * clear(): Clear all localStorage
 +  * key(): Passed a number to retrieve nth key of a localStorage
 +
 +
 +
 +
 +===== JavaScript Notes =====
 +<​code>​
 +> b = a.c || 4;
 +4
 +</​code>​
 +
 +==== ES6 Events ====
 +<​code>​
 +const EventEmitter = require('​events'​);​
 +
 +class Client extends EventEmitter
 +{
 +    eventTest() {
 +        this.emit('​event'​);​
 +    }
 +}
 +
 +let testClient = new Client(1,​2,​3,​4,​5);​
 +testClient.once('​event',​ () => {console.log('​triggerd1!'​)} );
 +testClient.on('​event',​ () => {console.log('​triggerd2!'​)} );
 +testClient.eventTest();​
 +testClient.eventTest();​
 +</​code>​
 +
 +==== ES6 Events to Promises ====
 +pues es tema de que se encolan los errores. Es decir, pongamos que tengo varias promises, una para (yo que sé) login, logout, cookies. Todas con su then y catch. De repente hay un error en logout, se lanzarán todos los errores (login, logout y cookies). Aún peor, si pongo un if en logout para recibir "error de logout"​ el evento se recibirá en todos, pero ya no se volverá a recibir en logout. La coña de las promises es que una vez se lancen no lo vuelven a hacer, he de hacer un control muy bestia de errores (no me vale pillar el evento con once).
 +<​code>​
 +const EventEmitter = require('​events'​);​
 +
 +class Client extends EventEmitter
 +{
 +    constructor() {
 +        super();
 +        this.num = 0;
 +    }
 +}
 +
 +class Wrapper
 +{
 +    constructor (tclient) {
 +        this.client = tclient;
 +    }
 +
 +    login() {
 +        return new Promise(function (resolve, reject) {
 +            this.client.on('​login',​ () => {
 +                console.log("​received event login"​);​
 +                resolve();
 +            });
 +            this.client.on('​eerror',​ (error) => {
 +                if (error === "login error"​) reject(error);​
 +            });
 +        }.bind(this));​
 +    }
 +
 +    logout() {
 +        return new Promise(function (resolve, reject) {
 +            this.client.on('​logout',​ () => {
 +                console.log("​received event logout"​);​
 +                resolve();
 +            });
 +            this.client.on('​eerror',​ (error) => {
 +                if (error === "​logout error"​) reject(error);​
 +            });
 +        }.bind(this));​
 +    }
 +}
 +
 +let client = new Client();
 +let wrapper = new Wrapper(client);​
 +
 +var p1 = wrapper.login().then(function() { 
 + console.log("​login"​);​
 +}).catch(function(error) {
 + console.error("​Reception error login"​);​
 +});
 +
 +var p2 = wrapper.logout().then(function() { 
 + console.log("​logout"​);​
 +}).catch(function(error) {
 + console.error("​Reception error logout"​);​
 +});
 +
 +
 +setTimeout(function() {
 +    client.emit('​eerror',​ 'login error'​);​
 +    client.emit('​logout'​);​
 +    client.emit('​logout'​);​
 +    client.emit('​logout'​);​
 +    client.emit('​eerror',​ '​logout error'​);​
 +}, 1000 * 1);
 +</​code>​
 +
 +==== JQuery (again) ====
 +
 +<​code>​
 +<a href="#"​ class="​deleteUser"​ data-id="​33"​ />
 +
 +// Now we can take it with JQuery like this: 
 +$('​.deleteUser'​).on('​click',​ function() {
 +  $(this).data('​id'​)
 +});
 +</​code>​
 +
 +
 +
 +
 +==== JavaScript Development Tools ====
 +=== Webpack ===
 +
 +  * https://​youtu.be/​GU-2T7k9NfI
 +
 +''​webpack src/​js/​app.js dist/​bundle.js''​ es el comando básico, una vez añadido webpack, para generar un bundle.js. Webpack puede realizar otras tareas de optimización y minimización si añadimos que es para producción con ''​-p''​.
 +
 +Lo que hace es pillar a partir de los imports dentro del código js qué construir. Módulos y plugins que utiliza Webpack para CSS también requieren que incluyas ficheros .css en el código js.
 +
 +Añadiendo **webpack-dev-server** como pacate al proyecto y substituyendo el comando de ejecución ''​webpack''​ por ''​webpack-dev-server''​ se nos añade un dev web server que nos permite hacer reload de los ficheros y demás. El comando sería: ''​webpack-dev-server --entry ./​src/​js/​apps.js ---output ./​dist/​bundle.js''​.
 +
 +== Configuración ==
 +
 +Webpack necesita un entry point y un output. Usa modulos y plugins para transformar el contenido desde el entry al output.
 +
 +Para escoger un fichero config (diferente al por defecto: ''​webpack.config.js''​) se puede añadir ''​--config''​ al comando. Con un archivo por defecto no necesitamos añadir parámetros al comando de ejecución.
 +
 +<​code>​
 +var path = require('​path'​);​
 +
 +module.exports = {
 +  entry: '​./​src/​js/​app.js',​
 +  output: {
 +    path: path.resolve(__dirname,​ '​dist'​),​
 +    filename: '​bundle.js',​
 +    publicPath: '/​dist' ​ // Para el webpack-dev-server,​ donde encontrar los ficheros
 +  }
 +}
 +</​code>​
 +
 +== Modulos ==
 +
 +Tras el output podemos añadir una sección de ''​modules''​. Modules tiene un array de ''​rules''​ que es sobre qué elementos se aplica un módulo. Un módulo es un transformador del código y lo has de instalar previamente (''​npm install css-loader style-loader --save-dev''​).
 +
 +Las reglas (rules) son un array de objetos js con varias propiedades. La primera es una expresión regular correspondiente a los nombres de ficheros, ''​test'',​ si se valida se ejecutará una serie de "​comandos"​ dentro del array de ''​use''​.
 +
 +===== More JavaScript =====
 +==== Default arguments on functions ====
 +<code javascript>​
 +const defaultPerson = {
 +name: {
 +first: "​Shane",​
 +last: "​McConkey"​
 +},
 +favActivity:​ "​skiing"​};​
 +function logActivity(person = defaultPerson) {
 +console.log(`${person.name.first} loves ${person.favActivity}`);​
 +}
 +</​code>​
 +
 +==== Arrow functions ====
 +This:
 +<code javascript>​
 +const lordify = function(firstName) {
 +return `${firstName} of Canterbury`;​
 +};
 +</​code>​
 +Is the same than this:
 +<code javascript>​
 +const lordify = firstName => `${firstName} of Canterbury`;​
 +</​code>​
 +Arrow functions protect the scope of this.
 +
 +For example this fails:
 +<code javascript>​
 +const tahoe = {
 +  mountains: ["​Freel",​ "​Rose",​ "​Tallac",​ "​Rubicon",​ "​Silver"​],​
 +  print: function(delay = 1000) {
 +    console.log(this);​ // Window {}
 +    setTimeout(function() {
 +      console.log(this.mountains.join(",​ "));
 +    }, delay);
 +}};
 +tahoe.print();​ // Uncaught TypeError: Cannot read property '​join'​ of undefined
 +</​code>​
 +But this not:
 +<code javascript>​
 +const tahoe = {
 + mountains: ["​Freel",​ "​Rose",​ "​Tallac",​ "​Rubicon",​ "​Silver"​],​
 + print: function(delay = 1000) {
 + setTimeout(() => {
 + console.log(this.mountains.join(",​ "));
 + }, delay);
 + }
 +};
 +tahoe.print();​ // Freel, Rose, Tallac, Rubicon, Silver
 </​code>​ </​code>​
wiki2/js.1589012710.txt.gz · Última modificación: 2020/05/09 09:25 (editor externo)