31
El universo JavaScript en D8 Ramon Vilar

El universo JavaScript en Drupal 8

  • Upload
    ymbra

  • View
    530

  • Download
    3

Embed Size (px)

DESCRIPTION

Drupal 8 está a la vuelta de la esquina, y poco a poco, tenemos que ir viendo y acostumbrándonos a las novedades que nos trae. Ya llevamos un tiempo escuchando y viendo sesiones sobre algunas de las novedades más sonadas que nos trae, cómo por ejemplo, CMI, multilingual (esta vez de verdad de la buena!), views in core, etc. pero nadie nos habla de un compañero inseparable y que en D8 precisamente va a tener más importancia que nunca: nuestro colega JavaScript. Esta presentación se llevó a cabo en la Drupal Camp Valencia 2014, y veremos qué novedades nos trae Drupal 8 en este sentido, repasaremos algunas buenas prácticas en desarrollos JS y todo vinculado dentro de Drupal. Algunos puntos de la sesión serán: - Actualización de jQuery e inclusión de plugins. ¿Qué nos aporta? - Domready. ¿Para qué lo quiero si tengo jquery? - Backbone, underscore. Esteroides para nuestros JS. - Otras bibliotecas del core: modernizr, etc. - Repaso al objeto JavaScript Drupal. Theming con JavaScript - Buenas prácticas JavaScript en nuestros desarrollos

Citation preview

Page 1: El universo JavaScript en Drupal 8

El universo JavaScript en D8

Ramon Vilar

Page 2: El universo JavaScript en Drupal 8

Sobre mi

Ramon Vilar

[email protected]

@rvilar

Page 3: El universo JavaScript en Drupal 8

Drupal Day 2011

Page 4: El universo JavaScript en Drupal 8

Índice

01. D8 y JavaScript

02. El objeto JS global Drupal

03. Otras APIs del core

04. Añadir JS a nuestros módulos y temas

05. Buenas prácticas en desarrollo JS

06. Conclusiones

Page 5: El universo JavaScript en Drupal 8

D8 Y JAVASCRIPT

Page 6: El universo JavaScript en Drupal 8

Drupal 8 y JavaScript

● En esta nueva versión, la importáncia de JS ha crecido y mucho.

● Inclusión de librerías muy importantes y que cambian la forma de trabajar con JS

– Ckeditor en el núcleo

– Backbone, underscore, ...● Librerías ya existentes a nuevas versiones:

– jQuery 2.0.3, jQuery.UI 1.10.2, jQuery Once 1.2.3, ...

Page 7: El universo JavaScript en Drupal 8

Estrictos con la calidad de código

“use strict” - http://ves.cat/kMMq Nueva característica de ECMAScript 5 para pasar a ejecutar código en modo estricto. Se debe añadir la cadena cómo primera línia dentro en el contexto de la función.

JSHint – http://jshint.comHerramienta de control de calidad del código JS que escribimos. Integrado para revisar todo el código del núcleo. Ver .jshintrc y .jshintignore

Page 8: El universo JavaScript en Drupal 8

Ayuda a aplicaciones livianas

domReady● Cada petición a Drupal, carga drupal.js, fichero dónde

carga toda la funcionalidad JS de Drupal.

● Este fichero sólo usaba jQuery para hacer:

$(window).ready(function() {...});

● Para hacer esto no hace falta cargar jQuery entero (90kb) y podemos usar domReady (740 bytes).

domready(function () {...});

Page 9: El universo JavaScript en Drupal 8

Backbone & Underscore

● La complejidad de las aplicaciones JS hace que se requiera un framework MVC para poder arquitecturizarla

● Hoy en día existen múltiples que estan de moda: Backbone, Angular.js o Ember.js

● La comunidad se ha decidido por Backbone porque es la que tiene la mayor comunidad de usuarios y la más estable.

● Podeis ver ejemplos de uso en los módulos del core Edit, Toolbar o Contextual

● Underscore se incluye porque es requisito de Backbone, però también podemos aprovecharnos de ellos.

Page 10: El universo JavaScript en Drupal 8

HTML5 y RWD

● Drupal 8 está desarrollado en HTML5 y es mobile friendly

● Para ello usa algunas librerías de apoyo, cómo son Picturefill, classList o HTML5Shiv (*)

● Usa otras librerías interesantes cómo Modernizr que podemos usar en nuestros desarrollos.

(*) HTML5Shiv va a desaparecer en breve porque el core no da soporte a IE8 http://ves.cat/kOor

Page 11: El universo JavaScript en Drupal 8

EL OBJETO JS GLOBAL Drupal

Page 12: El universo JavaScript en Drupal 8

El objeto JS global Drupal

● La gente sigue sin conocer un objeto clave en el desarrollo Drupal: Drupal

/core/misc/drupal.js

● A tener en cuenta:– Drupal.behaviors

– Drupal.theme

– Drupal.t

– ...

Page 13: El universo JavaScript en Drupal 8

Drupal.behaviors

● Es la forma de añadir comportamiento a una página o a un elemento:Drupal.behaviors.myModuleBehavior = { attach: function (context, settings) { $('.select').addClass('foo'); }};

● Nos aporta funciones de attach y detach. Se llama en cada petición de la página (ajax)

● Si nos interesa que sólo se llame una vez: once().

Page 14: El universo JavaScript en Drupal 8

Drupal.theme

● El theming también llegó al JS.

● Ha cambiado un poco en D8 (no usamos prototype)

● Todo HTML añadido a la página se debería hacer mediante una función de themingDrupal.theme.placeholder = function (str) { return '<em class="placeholder">' + Drupal.checkPlain(str) + '</em>';};

// Calling a theme function.Drupal.theme('placeholder', bar);

Page 15: El universo JavaScript en Drupal 8

Drupal.t

● Drupal.t() funciona exactamente igual que el método $this->t() (en D8 es un servicio y no una función procedural)

Drupal.t(“Path: !uri”, {'!uri', uri});

● Las variables se pueden pasar con @, ! y %; con el mismo significado que en PHP.

Drupal.checkPlain

Page 16: El universo JavaScript en Drupal 8

OTRAS NUEVAS APIS

Page 17: El universo JavaScript en Drupal 8

Otras nuevas APIs (I)

Drupal.announce

Envia notificaciones al usuario para informar de cambios en la página que no se pueden describir con estados ARIA.

Drupal.debounce

Limita la invocación de una función en un periodo de tiempo.

Drupal.tabbingManager

También ligado a la accesibilidad del sitio. Controla el orden y las acciones a ejecutar en el tabbing de elementos.

Page 18: El universo JavaScript en Drupal 8

Otras nuevas APIs (y II)

Drupal.displace

Calcula distancias de offset de viewport. Resuelve el problema de posicionamiento entre Overlay y el Toolbar

Drupal.dialog

API que simula el elemento dialog de HTML5.

Drupal.history

Gestiona el historial de navegación

Page 19: El universo JavaScript en Drupal 8

AÑADIR JS A NUESTROS MÓDULOS Y TEMAS

Page 20: El universo JavaScript en Drupal 8

Añadir JS a nuestro módulo

● En Drupal 7 podíamos usar, entre otros:

drupal_add_js('js/mymodule.js');

scripts[] = 'js/mymodule.js';

● Esto en Drupal 8 no se puede usar.

● Ahora se nos obliga a definir todos nuestros ficheros JS cómo librerías.

hook_library_info()

Page 21: El universo JavaScript en Drupal 8

mymodule.libraries.yml

foo: version: 1.0 js: script.js: {} dependencies: - core/jquery - core/drupal - core/drupalSettings - core/jquery.once

Page 22: El universo JavaScript en Drupal 8

Añadir JS a nuestro módulo (III)

● En el módulo, lo añadiremos al render array de nuestro elemento:

$my_render['#attached']['library'][] = 'mymodule/foo';

● Si queremos añadirlo en todas las páginas, podremos usar hook_page_build()

function edit_page_build(&$page) { if(!\Drupal::currentUser()->hasPermission('...')) { return; } // some code $page['#attached']['library'][] = 'edit/edit';}

Page 23: El universo JavaScript en Drupal 8

Añadir JS a nuestro tema

● Ahora todos los scripts tienen que declarar sus dependencias en ficheros de librerías mytheme.libraries.yml

● Para añadirlos a nuestros temas:

…core: 8.xlibraries: - bartik/baseckeditor_stylesheets: - css/ckeditor-iframe.css…

Page 24: El universo JavaScript en Drupal 8

Pasar datos de PHP a JS

● Tampoco podemos usar drupal_add_js()$form['#attached']['js'][] = array( 'type' => 'setting', 'data' => array('blockPlacement' => $placement),);

● Para usar ese dato en nuestro JS:

Drupal.settings.blockPlacement

drupalSettings.blockPlacement

● drupalSettings es una variable global intencionada.

Page 25: El universo JavaScript en Drupal 8

BUENAS PRÁCTICAS EN DESARROLLO JS

Page 26: El universo JavaScript en Drupal 8

Buenas prácticas en desarrollo JS (I)

● Usar siempre el modo estricto: “use strict”;● JSHint está ahí para ayudarnos. Usémoslo!● Usa Firebug o alguno de sus primos!● Sobretodo, acordaos de declarar “todas” las variables! Es

buena práctica hacerlo siempre al inicio de la función● Funciones anónimas para evitar problemas de scope de

variables y funciones.● Perdamos el miedo a crear nuestras própias librerías o plugins.

Page 27: El universo JavaScript en Drupal 8

Buenas práctica en desarrollo JS (y II)

● Hay que ir con cuidado con los selectores JS que se escriben. Puede ser un foco de problemas de performance http://ves.cat/kRFb

● Si nuestro JS toma cierta notoriedad, no tengamos miedo de crear nuestro própio plugin jQuery, nuestro componente en Backbone o nuestra própia librería JS.

Page 28: El universo JavaScript en Drupal 8

Desarrollo de plugins jQuery

● Si un componente jQuery asociado tiende a ser reutilizable o tiene cierta notoriedad, escribamos un plugin jQuery.

$.fn.myPlugin = function() { // My code. return this;};

$(“input”).myPlugin();

● http://learn.jquery.com/plugins/

Page 29: El universo JavaScript en Drupal 8

Desarrollo de bibliotecas JS

● Si nuestra lógica se vuelve extensa y compleja, sería bueno crear nuestra própia biblioteca JS, encapsulando lo que nos interesa (¡podemos usar Backbone que para eso está!).

var MyModule = { init: function(options) { // do my stuff. }, _myprivatefunction(): function { // other stuff. }};

MyModule.init(current_options);

Page 30: El universo JavaScript en Drupal 8

Conclusiones

● Muchas novedades en D8 en materia de JS. Ahora es tiempo de ponerlas en práctica!

● Muchas nuevas APIs que nos pueden ayudar● Cuidado con las librerías JS que añadimos a nuestros

proyectos. A veces es mejor picar algo a mano que empezar a añadir cosas descargadas de Internet.

● Debemos perder el miedo a hacer nuestras librerías y plugins. Es buena práctica!

Page 31: El universo JavaScript en Drupal 8

Contacto

● Twitter: @rvilar● Correo: [email protected]● Web: http://ymbra.com● Grácias a todos(as) ¿Preguntas?