Navegador Unicode
Una aplicación web Blazor C# para explorar la base de datos de caracteres Unicode.
La aplicación está alojada allí: https://unicode-browser.azurewebsites.net/home
Características
- Descomponga el texto en puntos de código Unicode.
- Ver información detallada sobre un punto de código.
- Explore puntos de código en un bloque Unicode determinado.
- Busca cualquier personaje por nombre.
- Muestre información adicional (en formato Markdown) en páginas dedicadas a bloques Unicode.
Pruébalo
Aquí hay algunas URL que puede probar para ver la aplicación en acción:
- https://unicode-browser.azurewebsites.net/blocks/Miscellaneous%20Symbols%20and%20Pictographs
- https://unicode-browser.azurewebsites.net/codepoints/1F365
- https://unicode-browser.azurewebsites.net/search?q=Árbol
- https://unicode-browser.azurewebsites.net/decomposition?text=????????
- https://unicode-browser.azurewebsites.net/blocks/Tangut
- https://unicode-browser.azurewebsites.net/blocks/Tags
Principales tecnologías utilizadas
- ASP.NET Core 3.0 (.NET Core 3.0.0-preview8.19405.7)
- Blazor
- Markdig 0.17.1
- Arranque 4.1
- Fuente impresionante 5.0.10
- jQuery 3.3.1 (porque Bootstrap JS todavía parece requerirlo)
Enlaces de documentación
La documentación de Blazor está disponible en docs.microsoft.com.
Historia de fondo
La mayor parte de esta aplicación se escribió originalmente a principios de 2016, utilizando una versión preliminar de ASP.NET Core, TypeScript y Aurelia. En ese momento, esta fue una ocasión para aprender sobre esos marcos tan nuevos y funcionó muy bien.
El código fuente de la versión actual es principalmente una sencilla adaptación del primer prototipo. De hecho, la mayor parte del código del servidor simplemente se transfirió a ASP.NET Core 2.1 con muy pocas modificaciones.
La parte del cliente, sin embargo, era donde estaba la "diversión", ya que sólo las partes HTML eran reutilizables. (Y aún requería una migración a Bootstrap 4 / Fontawesome 5) Esta, nuevamente, fue una gran ocasión para probar y aprender a usar Blazor, así como para mantenerse actualizado con las otras tecnologías.
Problemas
Blazor es una tecnología muy nueva, aún en fase preliminar y, en ocasiones, puede ser difícil de manejar.
Debido a eso, me encontré tropezando con cosas que pensé que serían triviales, y siento que tuve que escribir mucho código repetitivo para que estas cosas funcionaran.
p.ej
* Me decepcionó bastante no poder compartir mis clases de modelo entre el servidor y el cliente, ya que Blazor actualmente usa SimpleJson, que es enormemente limitado. ? (Y, lamentablemente, Newtonsoft.Json no parece funcionar lo suficientemente bien por ahora).
- La vinculación a los parámetros de la cadena de consulta debe realizarse manualmente
- A veces, las páginas necesitan escuchar manualmente los cambios de ubicación (por ejemplo, cambios de URL en la misma página).
- No existe una gestión estatal lista para usar. (por ejemplo, qué sucede cuando avanzas y retrocedes en el historial) => Lo resolví al no requerir ninguna administración de estado y siempre confiando en la ruta o cadena de consulta para eso.
- El ciclo de vida del componente no parecía ser muy extensible: sería difícil agregar un comportamiento complejo en una clase base (por ejemplo, mostrar un control giratorio antes de cargar el contenido).
Las cosas han mejorado en 3.0 (¿los parámetros de ruta ahora están decodificados?), pero creo que la mayoría de los puntos siguen siendo ciertos.
Algunas novedades para .NET Core 3.0:
- System.Text.Json es el nuevo serializador JSON (predeterminado) para Blazor. Sin embargo, los bordes son muy ásperos. La falta de disponibilidad para deserializar tipos inmutables de forma inmediata es una verdadera molestia. ? => Implementé un JsonConverter para gestionar este caso específico. Al confiar en la generación de código dinámico, se puede crear un tipo que la nueva API aceptará para deserializar y luego instanciar el tipo inmutable.
- En la versión preliminar 8, los proyectos de clientes de Blazor aún deben tener como destino .NET Standard 2.0 y no .NET Standard 2.1.