CSS es un lenguaje fuertemente tipado

Una de las formas en que se puede clasificar un lenguaje de programación es según su tipo fuerte o débil. Aquí, “escrito” significa si las variables se conocen en el momento de la compilación. Un ejemplo de esto sería un escenario en el que 1
se agrega un número entero ( ) a una cadena que contiene un número entero ( "1"
):
result = 1 + "1";
La cadena que contiene un número entero podría haberse generado involuntariamente a partir de un complicado conjunto de lógica con muchas partes móviles. También podría haber sido generado intencionalmente a partir de una única fuente de verdad.
A pesar de las connotaciones que implican los términos “débil” y “fuerte”, un lenguaje de programación fuertemente tipado no es necesariamente mejor que uno débilmente tipado. Puede haber escenarios en los que se necesite más flexibilidad que rigidez, y viceversa. Como ocurre con muchos aspectos de la programación, la respuesta depende de múltiples contextos externos (es decir, “depende”).
La otra parte interesante es que no existe una definición formal de lo que constituye tipificación fuerte o débil. Esto significa que las percepciones de lo que se considera un lenguaje fuertemente o débilmente tipificado difieren de persona a persona y pueden cambiar con el tiempo.
mecanografiado
JavaScript se considera un lenguaje de tipo débil y esta flexibilidad contribuyó a su adopción temprana en la web. Sin embargo, a medida que la web ha madurado e industrializado, los casos de uso de JavaScript se han vuelto más complicados.
Se crearon extensiones como TypeScript para ayudar con esto. Piense en ello como un “complemento” para JavaScript, que incorpora una escritura fuerte al lenguaje. Esto ayuda a los programadores a navegar por configuraciones complicadas. Un ejemplo de esto podría ser una aplicación de una sola página con uso intensivo de datos utilizados para el comercio electrónico.
TypeScript es actualmente muy popular en la industria del desarrollo web, y muchos proyectos nuevos utilizan TypeScript de forma predeterminada cuando configuran las cosas por primera vez.
Tiempo de compilación
El tiempo de compilación es el momento en el que un lenguaje de programación se convierte en código de máquina. Es un precursor del tiempo de ejecución, el momento en el que la computadora ejecuta el código de máquina.
Como ocurre con muchas cosas en la web, el tiempo de compilación es un poco complicado. Una configuración que utiliza TypeScript unirá los componentes del código JavaScript y los compilará en un único archivo JavaScript para que el navegador lo lea y ejecute.
El momento en que se compilan los componentes es cuando se combinan todos. TypeScript actúa como una especie de supervisor y le gritará si intenta romper las convenciones escritas que ha establecido antes de que se produzca la combinación.
Luego, el navegador introduce el archivo JavaScript unido, que tiene su propio tiempo de compilación. El tiempo de compilación del navegador es muy variable, dependiendo de:
- El dispositivo en el que se encuentra el navegador,
- ¿Qué otro trabajo está haciendo el navegador y?
- Qué otro trabajo están haciendo los otros programas del dispositivo.
El navegador no utiliza TypeScript directamente, pero siente su presencia. JavaScript es frágil. TypeScript ayuda con esta fragilidad al intentar evitar errores en el editor de código. Esto reduce la posibilidad de que se produzcan errores en el JavaScript leído por el navegador, errores que provocarían que JavaScript dejara de funcionar en el sitio web o la aplicación web que una persona está utilizando.
CSS
CSS es un lenguaje de programación declarativo de dominio específico. También está fuertemente tipado. En su mayor parte, los valores en CSS permanecen declarados como creados. Si un valor no es válido, el navegador descarta toda la propiedad.
Tipos de CSS
La lista de tipos de CSS es exhaustiva. Ellos hijo:
tipos textuales
- Palabras clave de alcance global:
initial
inherit
unset
revert
- Identificaciones personalizadas, que se utilizan específicamente para cosas, como proporcionar un
grid-area
nombre. - Cadenas, como,
"hello"
- URL, como
https://css-tricks.com/
- Identidades discontinuas (
--
), que se utilizan para crear propiedades personalizadas (más sobre esto en un momento)
tipos numéricos
- Numeros enteros, que son numeros decimales del 0 al 9
- Números reales, como
3.14
- Porcentajes, como
25%
- Dimensiones, un número con una unidad adjunta como (
100px
o3s
) - proporciones, como
16/9
- flex, una longitud variable para el cálculo de la cuadrícula CSS
Tipos de cantidad
- Longitudes:
- Longitudes absolutas, como píxeles o centímetros.
- Longitudes relativas, como la raíz ems o la altura de la ventana gráfica
- tiempo, como
200ms
- Ángulos, como
15deg
- tiempo, como
250ms
- frecuencias, cuentos
16Hz
- Resolución, como
96dpi
Las dimensiones y las longitudes pueden parecer similares, pero las dimensiones pueden contener porcentajes y las longitudes no.
tipos de color
- Palabras clave:
- Colores con nombre, como
papayawhip
transparent
currentColor
- Colores con nombre, como
- Colores RGB:
- Notación hexadecimal, como
#FF8764
- Notación RGB/RGBa, como
rgba(105, 221, 174, 0.5)
- Notación hexadecimal, como
- Colores HSL/HSLA, como
hsl(287, 76%, 50%)
- Colores del sistema, como
ButtonText
Tipos de imagen
- Imagen, que es una URL de referencia a un archivo de imagen o degradado
color-stop-list
, una lista de dos o más paradas de color, utilizadas para la noción de degradadolinear-color-stop
, una expresión de color y longitud utilizada para indicar una parada de color degradadolinear-color-hint
, un porcentaje de longitud utilizado para interpolar el color.ending-shape
, que utiliza una palabra clave de cualquieracircle
oellipse
para gradientes radiales
Tipos de posicionamiento 2D
- Palabras clave:
top
right
bottom
left
center
- Una longitud porcentual, como
25%
Programación en CSS
La mayor parte de la programación en CSS consiste en crear selectores y luego especificar un conjunto de propiedades y sus valores requeridos. Las colecciones de selectores dan al contenido una forma visual, de forma muy similar a cómo las colecciones de lógica JavaScript crean características.
CSS tiene funciones. Puede realizar cálculos, lógica condicional, expresiones algorítmicas, estados y comportamientos basados en modos. También tiene propiedades personalizadas, que son efectivamente variables CSS que permiten actualizar los valores dinámicamente. Diablos, incluso puedes resolver fizzbuzz con CSS.
Al igual que otros lenguajes de programación, también existe una “meta” capa, con diferentes ideas y técnicas sobre cómo organizar, gestionar y mantener las cosas.
Errores de lanzamiento
A diferencia de otros lenguajes de programación donde el código existe en gran medida bajo el capó, CSS es muy visual. No verá advertencias ni errores en la consola si utiliza un valor no válido para una declaración de propiedad, pero obtendrá elementos visuales que no se actualizan de la forma prevista.
La razón de esto es que CSS es resistente. Cuando los elementos visuales no se actualizan debido a una declaración mal construida, CSS da prioridad, garantizando que el contenido se pueda mostrar a toda costa y que presente todas las demás declaraciones válidas posibles. Esto está en consonancia con los principios de diseño del lenguaje, los principios de la plataforma y los objetivos generales de la misión de la web.
prueba
Demostraremos cómo la escritura fuerte en CSS mantiene las barreras de seguridad en tres ejemplos: uno con una declaración directa de propiedad/valor, otro con cálculo y otro con la redefinición de una propiedad personalizada.
Ejemplo 1: Declaración sencilla de propiedad/valor
En este ejemplo, el navegador no comprende la border-style
declaración “papá” del banner. Tenga en cuenta que el navegador respeta y representa las otras .banner
declaraciones de propiedad/valor del selector de clase, aunque border-style
el tipo no coincide. Este es un ejemplo de lo resistente que es CSS.
La border-style
declaración espera uno de los siguientes tipos de estilo textual:
- Palabras clave de alcance global, o una
- Sangría discontinua para una propiedad personalizada.
Si actualizamos border-style
para usar un valor escrito válido de dotted
, ¡el navegador representará el borde!
Ejemplo 2: Cálculo
La calc()
función en CSS nos permite tomar dos argumentos y un operador para devolver un resultado calculado. Si uno de los argumentos no utiliza un tipo válido, el cálculo no funcionará.
En este Pen, la propiedad p
del selector font-size
espera un valor con un tipo de dimensión numérica (por ejemplo 1.5rem
). Sin embargo, la función de cálculo produce un valor de tipo no válido para la font-size
propiedad. Esto se debe a que el segundo argumento de la calc()
función es una cadena ( "2rem"
) y no un tipo de dimensión numérica.
Debido a esto, el tamaño de fuente del párrafo vuelve al siguiente nodo principal más aplicable: el font-size
de 1.5rem
declarado en el body
elemento.
Esto es un poco complicado, pero vale la pena señalarlo: combinar dos propiedades personalizadas en una calc()
función puede causar errores. Si bien ambas propiedades personalizadas pueden ser válidas por sí solas, calc()
no aceptarán tipos de texto con sangría discontinua. Piense en un escenario en el que podríamos intentar multiplicar propiedades personalizadas que contienen unidades que no coinciden, por ejemplo, --big: 500px
y --small: 1em
.
Ejemplo 3: propiedad personalizada redefinida
Al igual que las variables de JavaScript, los valores de propiedades personalizadas se pueden redefinir. Esta flexibilidad permite cosas como crear fácilmente temas de color en modo oscuro.
En el :root
selector de este CodePen, configure una propiedad personalizada de --color-cyan
, con un valor de #953FE3
. Luego, en la .square
clase, actualicé el --color-cyan
valor de la propiedad personalizada para que sea top
. Si bien top
es un valor escrito válido, no es un tipo que background-color
respeta.
Tenga en cuenta que la propiedad personalizada actualizada tiene como ámbito .square
y no afecta otros usos, como el borde derecho de la frase “No jugar a escribir”. Y si elimina la propiedad personalizada redefinida de .square
, verá que el color de fondo cian vuelve a aparecer.
Si bien esto es un poco artificial, sirve como ejemplo de cómo la redefinición de propiedades personalizadas puede escaparse de usted si no tiene cuidado.
Este fenómeno se puede encontrar en proyectos con mala comunicación, bases de código CSS más grandes y situaciones en las que se utilizan preprocesadores CSS para construir propiedades personalizadas a escala.
Estampación
En retrospectiva, creo que la falta de advertencias de consolación para CSS es un defecto y ha contribuido a muchas de las percepciones negativas sobre el lenguaje.
Esperar que un desarrollador note un cambio visual potencial pequeño es una petición demasiado grande y no lo coloque donde está para la mayoría de sus otras herramientas diarias. Hay un par de iniciativas que conozco que intento abordar este problema.
El primero es stylelint, un linter creado específicamente para trabajar con CSS y lenguajes de preprocesamiento similares a CSS. stylelint puede integrarse con editores de código, ejecutores de tareas, herramientas de línea de comandos y acciones de GitHub para ayudar a mantener su CSS bajo control. Esto le permite encontrarse con los desarrolladores donde ya se encuentran.
En segundo lugar está el excelente conjunto de opciones de inspección de CSS de Firefox en sus herramientas para desarrolladores. En particular, me gustaría llamar la atención sobre su capacidad para identificar CSS no utilizado. Esto es extremadamente útil para identificar selectores que pueden haber entrado en conflicto con una discrepancia de tipos.
terminando
CSS ha sido fuertemente tipado desde que es un lenguaje de programación, y como lenguaje de programación ha existido durante mucho tiempo. También ha crecido mucho últimamente. Si no se ha registrado, hay algunas funciones nuevas y sorprendentes disponibles.
A medida que JavaScript fuertemente tipado se vuelve más popular, espero que ayude a los desarrolladores a sentirse más cómodos con el enfoque firme pero flexible de CSS.
Gracias a Miriam Suzanne por sus comentarios.
Deja un comentario