Muestra las diferencias entre dos versiones de la página.
| 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> | ||