El genio de las cadenas de plantillas en ES6

ES6 es el futuro de JavaScript y ya está aquí. Es una especificación terminada y aporta muchas características que requiere un lenguaje para mantenerse competitivo con las necesidades de la web de ahora. No todo en ES6 es para ti, y en esta pequeña serie de publicaciones mostraré características que son muy útiles y que ya están disponibles..

Si observa el código JavaScript que he escrito, encontrará que siempre uso comillas simples para definir cadenas en lugar de comillas dobles. JavaScript está bien con cualquiera de los dos siguientes ejemplos hacen exactamente lo mismo:

var animal = "vaca"; var animal = 'vaca'; 

La razón por la que prefiero las comillas simples es que, en primer lugar, facilita el ensamblaje de cadenas HTML con los atributos correctamente citados de esa manera:

// con comillas simples, no hay necesidad de // escapar de las comillas alrededor del valor de clase var pero = ''; // este es un error de sintaxis: var but = ""; // esto funciona: var pero =""; 

La única vez que necesita escapar ahora es cuando utiliza una sola cita en su HTML, lo que debería ser una ocasión muy rara. Lo único en lo que puedo pensar es en JavaScript o CSS en línea, lo que significa que es muy probable que hagas algo sombrío o desesperado en tu marca. Incluso en tus textos, probablemente estés mejor si no usas una sola cita, sino la tipográficamente más agradable..

Aparte: por supuesto, HTML perdona lo suficiente como para omitir las comillas o usar comillas simples alrededor de un atributo, pero prefiero crear un marcado legible para los humanos en lugar de confiar en el perdón de un analizador. Hicimos que el analizador HTML5 perdonara porque la gente escribió un marcado marcado en el pasado, no como una excusa para seguir haciéndolo..

He sufrido lo suficiente en los días DHTML de document.write, creando un documento dentro de un conjunto de marcos en una nueva ventana emergente y otras abominaciones, para no querer usar el carácter de escape nunca más. A veces, necesitábamos el triple, y eso era incluso antes de que tuviéramos códigos de colores en nuestros editores. Fue un desastre.

Sustitución de expresiones en cuerdas?

Otra razón por la que prefiero las comillas simples es que escribí una gran cantidad de PHP en mi tiempo para sitios web muy grandes donde el rendimiento era muy importante. En PHP, hay una diferencia entre comillas simples y dobles. Las cadenas de comillas simples no tienen ninguna sustitución en ellas, mientras que las de comillas dobles sí las tienen. Eso significaba en los días de PHP 3 y 4 que el uso de comillas simples era mucho más rápido, ya que el analizador no tenía que pasar por la cadena para sustituir valores. Aquí hay un ejemplo de lo que eso significa:

 El animal es $ animal y su sonido es $ sonido eco "El animal es $ animal y su sonido es $ sonido"; // => El animal es una vaca y su sonido es muuuuuuuuq? 

JavaScript no tuvo esta sustitución, por lo que tuvimos que concatenar cadenas para lograr el mismo resultado. Esto es bastante difícil de manejar, ya que necesitas saltar y salir de las citas todo el tiempo.

var animal = 'vaca'; var sonido = 'moo'; alerta ('El animal es' + animal + 'y su sonido es' + sonido); // => "El animal es vaca y su sonido es moo"

Lío multilínea

Esto se vuelve realmente desordenado con cadenas más largas y complejas, especialmente cuando ensamblamos una gran cantidad de HTML. Y lo más probable es que tarde o temprano terminará con su herramienta de alineación quejándose de los espacios en blanco finales después de un + al final de una línea. Esto se basa en el problema de que JavaScript no tiene cadenas multilínea:

// esto no funciona var list = '
  • Comprar leche
  • Se amable con los pandas
  • Olvidate de dre
'; // Esto lo hace, pero urgh ... var list = '
    \
  • Comprar leche
  • \
  • Se amable con los pandas
  • \
  • Olvidate de dre
  • \
'; // Esta es la forma más común, y urgh, también ... var list = '
    '+'
  • Comprar leche
  • '+'
  • Se amable con los pandas
  • '+'
  • Olvidate de dre
  • '+'
';

Soluciones de plantillas del lado del cliente

Para solucionar el desorden que es el manejo de cadenas y la concatenación en JavaScript, hicimos lo que siempre hacemos: escribimos una biblioteca. Hay muchas bibliotecas de plantillas HTML, con Mustache.js que probablemente haya sido la seminal. Todos estos siguen su propia sintaxis no estandarizada y funcionan en ese estado de ánimo. Es un poco como decir que escribes tu contenido en Markdown y luego te das cuenta de que hay muchas ideas diferentes de lo que significa "Markdown"..

Introduzca las cadenas de la plantilla

Con el advenimiento de ES6 y su estandarización, podemos regocijarnos porque JavaScript ahora tiene un nuevo chavo en el bloque cuando se trata de manejar cadenas: Cadenas de plantillas. El soporte de cadenas de plantillas en los navegadores actuales es alentador: Chrome 44+, Firefox 38+, Microsoft Edge y WebKit están todos a bordo. Safari, lamentablemente, no lo es, pero llegará..

El genio de las cadenas de plantillas es que utiliza un nuevo delimitador de cadenas, que no se usa en HTML ni en los textos normales: la marca de retroceso (').

Usando este, ahora tenemos sustitución de expresiones de cadena en JavaScript:

var animal = 'vaca'; var sonido = 'moo'; alerta ('El animal es $ animal y su sonido es $ sonido'); // => "El animal es vaca y su sonido es moo" 

los PS construct puede tomar cualquier expresión de JavaScript que devuelva un valor. Por ejemplo, puede hacer cálculos o acceder a las propiedades de un objeto:

var out = 'diez veces dos totalmente es $ 10 * 2'; // => "diez veces dos es totalmente 20" var animal = nombre: 'vaca', ilk: 'bovino', frente: 'moo', espalda: 'leche', alerta ('The $ animal.name  es del $ animal.ilk ilk, un extremo es para el $ animal.front, el otro para el $ animal.back '); // => / * La vaca es de la especie bovina, un extremo es para el moo, el otro para la leche * / 

El último ejemplo también muestra que las cadenas de varias líneas ya no son un problema.

Plantillas etiquetadas

Otra cosa que puede hacer con las cadenas de plantilla es anteponerlas con una etiqueta, que es el nombre de una función que se llama y obtiene la cadena como un parámetro. Por ejemplo, podría codificar la cadena resultante para las URL sin tener que recurrir a la horriblemente nombrada encodeURIComponent todo el tiempo.

function urlify (str) return encodeURIComponent (str);  urlify 'http://beedogs.com'; // => "http% 3A% 2F% 2Fbeedogs.com" urlify 'woah $ £ $%% ^ ^ "" = //>> woah% 24% C2% A3% 24% 25% C2% A3% 5E % 24% 22 "// el anidamiento también funciona: var str = 'foo $ urlify' && ' bar'; // =>" foo% 26% 26 bar " 

Esto funciona, pero se basa en la coerción implícita de matriz a cadena. El parámetro enviado a la función no es una cadena, sino una matriz de cadenas y valores. Si se usa de la forma que muestro aquí, se convierte en una cadena por conveniencia, pero la forma correcta es acceder a los miembros de la matriz directamente.

Recuperar cadenas y valores de una cadena de plantilla

Dentro de la función de etiqueta no solo puede obtener la cadena completa, sino también sus partes.

etiqueta de función (cadenas, valores) console.log (cadenas); console.log (valores); console.log (cadenas [1]);  etiqueta 'you $ 3 + 4 it'; / * => Array ["you", "it"] 7 it * / 

También hay una matriz de las cadenas en bruto que se le proporcionan, lo que significa que obtiene todos los caracteres de la cadena, incluidos los caracteres de control. Digamos, por ejemplo, que agrega un salto de línea con \norte. Obtendrá el doble espacio en blanco en la cadena, pero el \norte personajes en las cadenas en bruto:

etiqueta de función (cadenas, valores) console.log (cadenas); console.log (valores); console.log (cadenas [1]); console.log (string.raw [1]);  etiqueta 'you $ 3 + 4 \ nit'; / * => Array ["you", "it"] 7 it \ nit * / 

Conclusión

Las cadenas de plantillas son una de esas ingeniosas victorias en ES6 que se pueden usar en este momento. Si tiene que admitir navegadores más antiguos, puede, por supuesto, transferir su ES6 a ES5; puede realizar una prueba de características para el soporte de cadenas de plantillas utilizando una biblioteca como featuretests.io o con el siguiente código:

var templatestrings = falso; prueba nueva función ("'2 + 2'"); templatestrings = true;  catch (err) templatestrings = false;  if (templatestrings) //… 

Aquí hay algunos más artículos sobre cadenas de plantillas:

  • ECMAScript 6 Power Tutorial: Cadenas de plantillas
  • Obtención de Literal con ES6 cuerdas de plantilla
  • ES6 en profundidad: Cadenas de plantillas
  • Nuevas características de cadena en ECMAScript 6
  • Entendiendo ES6: Cadenas de plantillas
  • Plantilla HTML con cadenas de plantillas ES6

Más práctica con JavaScript

Este artículo forma parte de la serie de desarrollo web de los expertos en tecnología de Microsoft sobre aprendizaje práctico de JavaScript, proyectos de código abierto y mejores prácticas de interoperabilidad, incluido el navegador Microsoft Edge y el nuevo motor de renderizado EdgeHTML.. 

Lo alentamos a realizar pruebas en todos los navegadores y dispositivos, incluido Microsoft Edge, el navegador predeterminado para Windows 10, con herramientas gratuitas en dev.modern.IE:

  • Analice su sitio en busca de bibliotecas desactualizadas, problemas de diseño y accesibilidad
  • Usa máquinas virtuales para Mac, Linux y Windows
  • Prueba remota de Microsoft Edge en tu propio dispositivo
  • Laboratorio de codificación en GitHub: Pruebas en varios navegadores y mejores prácticas

Aprendizaje profundo de tecnología sobre Microsoft Edge y la plataforma web de nuestros ingenieros y evangelistas:

  • Microsoft Edge Web Summit 2015 (qué esperar con el nuevo navegador, los nuevos estándares de plataformas web compatibles y los oradores invitados de la comunidad de JavaScript)
  • ¡Vaya, puedo probar Edge e IE en una Mac y Linux! (de Rey Bango)
  • Avanzando JavaScript sin romper la web (de Christian Heilmann)
  • El motor de renderizado de bordes que hace que la web solo funcione (de Jacob Rossi)
  • Desata el renderizado 3D con WebGL (de David Catuhe, incluidos los proyectos Vorlon.js y Babylon.js)
  • Hosted Web Apps y Web Platform Innovations (de Kevin Hill y Kiril Seksenov, incluido el proyecto JS)

Más herramientas y recursos multiplataforma gratuitos para la plataforma web:

  • Código de Visual Studio para Linux, Mac OS y Windows
  • Código con Node.js y prueba gratuita en Azure