literalmente ser cualquier valor. Por lo tanto, está tipado como 'any' en TypeScript y no es realmente útil. Así que comenzamos este viaje en un esfuerzo por integrar sin problemas funciones de Rust para estructuras de datos en aplicaciones de TypeScript con WebAssembly. Y parece que deberíamos rendirnos. A menos que tal vez haya una herramienta mágica que pueda ayudarnos generando enlaces seguros de tipos y ergonómicos. Bueno, afortunadamente esa herramienta existe. Se llama tspy y, sinceramente, me encanta. Admite todo lo que hemos visto hasta ahora, pero no necesita ninguna conversión manual y viene con enlaces fuertes de tipos tardíos. Veremos en un segundo que vamos a necesitar un poco más de macros para que las cosas funcionen. Pero aún así, es una gran mejora respecto a los enfoques anteriores. También debemos tener en cuenta que necesitamos instalar tspy con la marca de función JS, lo que nos dará una integración nativa de JavaScript. De lo contrario, utilizará la serialización JSON de forma predeterminada.
Como demostración, adaptaremos el ejemplo anterior utilizando variantes de Enum, que queríamos que se tradujeran a uniones objetivo en TypeScript. Entonces, vemos que necesitamos derivar los rasgos de SerDes, así como el nuevo rasgo de tspy. También necesitamos usar una nueva macro de tspy para indicar a Wasp bind que compile algunos tipos de datos, ya sabes, un tipo de datos que de otra manera no sería compatible con Wasp binding. De hecho, Wasp ABI significa Interfaz Binaria de Aplicación WebAssembly y describe cómo llamar a funciones entre lenguajes en WebAssembly. Luego definimos la variante either familiar con un giro que es común a todos los enfoques que usan SerDe. Necesitamos decirle a Rust cómo serializar esto en una variante porque, ya sabes, esto podría suceder de muchas maneras y para obtener uniones de etiquetas idiomáticas como las que vemos a la derecha, tenemos que decirle a Rust que el nombre de la variante debe asociarse con su clave dominante, es decir, la etiqueta de guion bajo, y que el contenido de la variante, que se define entre los paréntesis del constructor, debe asociarse a una propiedad llamada valor. Luego podemos definir una función que, por ejemplo, tome una instancia de either y devuelva su representación en cadena. Observa que realmente no requiere que escribamos ningún código de plantilla de conversión de tipos y se traduce en una definición limpia de TypeScript. Al igual que SerD vs BindGen, podemos definir un valor either en JavaScript sin necesidad de ningún constructor. Simplemente podemos crearlo en el momento como un diccionario. Pero esta vez obtenemos garantías de TypeScript, por lo que podemos aprovechar el compilador de TypeScript para evitar escribir errores tipográficos en nuestros tipos de datos. Así que resumamos lo que hemos aprendido hasta ahora. WebAssembly está aquí para quedarse, y es bueno para tareas intensivas de CPU que de lo contrario serían demasiado lentas en JavaScript puro, o para trasladar lógica compleja ya existente a la web. Piensa en Figma. Sin embargo, actualmente proporciona casi ningún soporte de entrada-salida. Entonces, si necesitas interactuar con el mundo exterior desde tus funciones, es mejor que te quedes con NAPI por el momento. Hemos iterado a través de varios enfoques para portar funciones de Rust a Node.js, y hemos observado que hay limitaciones o una experiencia de desarrollo incómoda, especialmente para aplicaciones de TypeScript. Finalmente, hemos visto que la mejor solución para enlaces seguros de tipos, TSFI, todavía es relativamente nueva. Una advertencia es que su código fuente depende en gran medida de la magia de macros, ¿verdad? Y eso podría ser un obstáculo para alguien. Además, para cualquier conjunto de enfoques, y eso incluye TSFI, no puedes simplemente usar contenedores genéricos como vectores o mapas hash directamente en una función que enlaces a WebAssembly. En realidad, primero debes especificar el tipo genérico. Entonces, tienes que hacer, tienes que decir, un vector de cadenas y luego tienes que envolverlo en una estructura o variante de Enum que luego expones a SerDe a través de los rasgos serializados o deserializados y luego lo usas en tu función. Y si quieres ver un ejemplo de TSFI siendo utilizado en la práctica, puedes revisar una solicitud de extracción en línea que introdujo soporte de WebAssembly a Lira, un motor de búsqueda de texto completo escrito en TypeScript por Mikhail Eriva, que creo que también habló aquí en el Congreso de Node. Mikhail Eriva estaba bastante satisfecho con las mejoras de rendimiento. Y eso es todo por mi parte. Soy Bertos Ghebel, puedes encontrarme en Twitter y GitHub, también puedes encontrar material adicional y ejemplos de código para esta charla en mi repositorio, node-congress-2023. No dudes en hacer preguntas adicionales ahora mismo o más tarde en Twitter, y gracias por tu atención.
Comments