Hackeando JSX: Construyendo en Minecraft con React

Rate this content
Bookmark
SlidesGithub

Cuando se combina con una función de renderizado personalizada, JSX se puede utilizar para construir rápidamente un lenguaje de marcado específico de dominio personalizado. Te mostraré cómo abordar esto utilizando el ejemplo de crear construcciones en Minecraft.

This talk has been presented at React Day Berlin 2023, check out the latest edition of this React Conference.

FAQ

Un lenguaje específico de dominio o DSL es un tipo de lenguaje de programación diseñado para ser especialmente eficaz en una aplicación particular, en contraste con los lenguajes de propósito general que pueden ser utilizados para resolver cualquier tipo de problema.

JSX es una extensión de sintaxis para JavaScript que permite escribir código que se parece al HTML dentro de scripts de JavaScript. Los navegadores no soportan JSX directamente, por lo que debe ser transpilado en llamadas a funciones como 'React.createElement()' para que pueda ser entendido.

JSX puede ser usado fuera de React mediante la creación de manejadores JSX personalizados que reemplacen la función 'React.createElement()'. Estos manejadores pueden transformar JSX en otras formas de representación adecuadas para diferentes objetivos, como la creación de construcciones en juegos como Minecraft.

Los principales beneficios incluyen la familiaridad y facilidad de adopción, ya que muchos desarrolladores ya conocen JSX. Además, permite aprovechar herramientas existentes para análisis, linting y soporte en IDEs, simplificando el desarrollo sin necesidad de crear analizadores de lenguaje personalizados.

JSX puede ser utilizado para definir componentes y estructuras que luego son convertidos en un array de objetos simples. Estos objetos pueden ser interpretados por un juego como Minecraft para crear construcciones tridimensionales basadas en las coordenadas y tipos de bloques especificados.

Bun es una herramienta que incluye soporte incorporado para JSX, lo que permite renderizar construcciones o componentes definidos en JSX directamente en juegos o aplicaciones que lo soporten, como Minecraft.

Felix Wotschofsky
Felix Wotschofsky
7 min
12 Dec, 2023

Comments

Sign in or register to post your comment.

Video Summary and Transcription

JSX se puede utilizar para crear construcciones en Minecraft escribiendo código pseudo-HTML dentro de JavaScript. Se puede transpilar a un formato que el navegador puede entender y no se limita a React. JSX permite la creación de una representación intermedia que se puede convertir en comandos para Minecraft. Se puede utilizar la herramienta existente con JSX, eliminando la necesidad de analizadores personalizados y habilitando el soporte de linting e IDE. El código fuente del proyecto está disponible en GitHub.

1. Uso de JSX para Construcciones en Minecraft

Short description:

Hola Día de React, hablaré sobre cómo podemos usar JSX para crear construcciones en Minecraft. JSX es una forma de escribir código pseudo-HTML dentro del código JavaScript. Puede ser transpilado en algo que el navegador puede entender. JSX no está limitado a React y se puede usar con otras funciones. Permite la creación de una representación intermedia que puede convertirse en comandos para Minecraft. Usar JSX para construir un DSL personalizado es beneficioso porque es familiar para los desarrolladores y tiene una curva de aprendizaje baja.

Hola React Day, mi nombre es Felix y hablaré sobre cómo podemos usar JSX para crear construcciones en Minecraft. Además, también exploraré la idea de usar JSX como un lenguaje específico de dominio en general.

Entonces, en primer lugar, ¿qué es un lenguaje específico de dominio? Un lenguaje específico de dominio o DSL para abreviar, es un lenguaje de programación que está diseñado para hacer una cosa particularmente bien. Y eso contrasta con un lenguaje de programación de propósito general como por ejemplo JavaScript, que en teoría es capaz de resolver cualquier problema.

Entonces, por ejemplo, SQL. SQL es muy bueno interactuando con bases de datos de manera muy concisa, pero en general es limitado en funcionalidad y no puede resolver todos los problemas. O en otras palabras, SQL no es Turing completo. Otro ejemplo muy famoso de un lenguaje específico de dominio es HTML. HTML está diseñado para definir la estructura de una página web. Pero como estamos hablando de JavaScript y React aquí, no podemos usar HTML directamente. En su lugar, usamos algo llamado JSX.

JSX es una forma de escribir código pseudo-HTML dentro del código JavaScript. Pero como los navegadores no admiten nativamente JSX, esta sintaxis JSX necesita ser primero transpilada en algo que el navegador puede entender. Y esto es, en el caso de React, una llamada a una función llamada react.createElement() que luego, al final, representa el mismo contenido que nuestro JSX. Pero la gran parte de JSX es que no estamos limitados a usarlo con React. En su lugar, podemos usar cualquier función en lugar de React.createElement() para luego usar JSX y agregarle comportamiento personalizado.

Entonces, en este caso, primero creo un componente de bloque personalizado que luego se alimenta en mi función de manejador JSX personalizada, en este caso una función JSX de Minecraft. Y esto funciona porque mi función tiene la misma firma de función que react.createElement() Por lo tanto, puedo tomar mi función como objetivo para la transpilación desde JSX. En este ejemplo aquí, he expandido este ejemplo y también lo he envuelto en un fragmento. Y ahora la idea es que con mi manejador JSX personalizado, puedo convertir esta sintaxis JSX en un array que consta de objetos simples. Pero ahora esa es la parte importante. Dependiendo del caso de uso o del problema que estás intentando resolver, esta representación intermedia puede verse completamente diferente. Es posible que quieras usar clases en su lugar o posiblemente preservar la anidación que fue creada por JSX. Esta representación intermedia dependerá en gran medida del problema que estás intentando resolver.

Soy capaz de convertir este array en un conjunto de comandos que son entendidos por el juego y luego se convierten en una construcción real dentro de Minecraft. En caso de que no lo sepas, Minecraft es un juego de caja de arena 3D donde puedes colocar bloques donde como definido por tres coordenadas, x, y y z. Y cada bloque por supuesto tiene un tipo, en este caso está definido por este valor de ID.

Entonces, en general, la pregunta sería ¿por qué usarías JSX para construir un DSL personalizado? La primera razón es que tú y tus colegas ya están familiarizados con JSX. Por lo tanto, no hay una gran curva de aprendizaje y es fácil de adoptar.

2. Uso de JSX para Construcciones en Minecraft - Parte 2

Short description:

Puedes confiar en las herramientas existentes al usar JSX, eliminando la necesidad de analizadores personalizados y habilitando el soporte de linting e IDE. La función apply build convierte las construcciones JSX en elementos del juego, similar a montar un árbol React en un elemento DOM HTML. Construir con JSX es fácil y familiar, como se demuestra en el componente de casa legible. Ejecutar la aplicación con bun permite la renderización en tiempo real de la construcción. Si creas algo usando JSX, por favor compártelo conmigo. El código fuente de este proyecto está disponible en GitHub.

Y probablemente, número dos, mucho más importante, puedes confiar en las tooling existentes. Por ejemplo, no necesitas escribir un analizador personalizado para transformar tu marcado JSX en el resultado final. En su lugar, puedes simplemente escribir ese manejador JSX y listo. No necesitas escribir un analizador de lenguaje. Y también puedes confiar en las tooling existentes para el linting o también para el soporte de IDE, porque JSX es ampliamente soportado en las tooling.

Entonces, ¿cómo se ve esto en un panorama más amplio? Aquí he creado una función apply build que al final es lo que convierte mi construcción, como se define aquí en JSX, en algo que está realmente en el juego. Y puedes pensar en esto de manera similar a montar tu árbol React en un elemento DOM HTML cuando usas React regularmente. Y ahora con este componente de aldea, esto es simplemente JSX puro, como te dije. Es muy fácil entrar en la idea de construir algo con JSX, porque ya estás familiarizado con él. Como aquí, este componente de casa es solo una colección de otros componentes, que es, como creo, muy legible en general.

Así que ahora si ejecuto esta aplicación con bun, porque bun tiene soporte incorporado para JSX, puedo efectivamente ver cómo mi construcción se va renderizando en el juego. Ok, eso es todo. Espero haber podido darte una pequeña idea de cómo puedes usar JSX para cualquier propósito que quieras. Si terminas construyendo algo, o construyendo un lenguaje personalizado efectivamente en JSX, me encantaría ver lo que estás creando. Así que por favor, ponte en contacto conmigo, me encantaría verlo. Y el código fuente de este proyecto que acabo de mostrarte está disponible en github. Gracias por tu tiempo.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Un Marco para Gestionar la Deuda Técnica
TechLead Conference 2023TechLead Conference 2023
35 min
Un Marco para Gestionar la Deuda Técnica
Top Content
Today's Talk discusses the importance of managing technical debt through refactoring practices, prioritization, and planning. Successful refactoring requires establishing guidelines, maintaining an inventory, and implementing a process. Celebrating success and ensuring resilience are key to building a strong refactoring culture. Visibility, support, and transparent communication are crucial for addressing technical debt effectively. The team's responsibilities, operating style, and availability should be transparent to product managers.
Luchando contra la Deuda Técnica con la Refactorización Continua
React Day Berlin 2022React Day Berlin 2022
29 min
Luchando contra la Deuda Técnica con la Refactorización Continua
Top Content
This Talk discusses the importance of refactoring in software development and engineering. It introduces a framework called the three pillars of refactoring: practices, inventory, and process. The Talk emphasizes the need for clear practices, understanding of technical debt, and a well-defined process for successful refactoring. It also highlights the importance of visibility, reward, and resilience in the refactoring process. The Talk concludes by discussing the role of ownership, management, and prioritization in managing technical debt and refactoring efforts.
De Monolito a Micro-Frontends
React Advanced Conference 2022React Advanced Conference 2022
22 min
De Monolito a Micro-Frontends
Top Content
Microfrontends are considered as a solution to the problems of exponential growth, code duplication, and unclear ownership in older applications. Transitioning from a monolith to microfrontends involves decoupling the system and exploring options like a modular monolith. Microfrontends enable independent deployments and runtime composition, but there is a discussion about the alternative of keeping an integrated application composed at runtime. Choosing a composition model and a router are crucial decisions in the technical plan. The Strangler pattern and the reverse Strangler pattern are used to gradually replace parts of the monolith with the new application.
Patrones avanzados para la gestión de API en aplicaciones React a gran escala
React Advanced Conference 2021React Advanced Conference 2021
20 min
Patrones avanzados para la gestión de API en aplicaciones React a gran escala
Top Content
This Talk covers advanced patterns for API management in large-scale React applications. It introduces the concept of an API layer to manage API requests in a more organized and maintainable way. The benefits of using an API layer include improved maintainability, scalability, flexibility, and code reusability. The Talk also explores how to handle API states and statuses in React, and provides examples of canceling requests with Axios and React Query. Additionally, it explains how to use the API layer with React Query for simplified API management.
Ejecuta Juegos Dentro de Tus Aplicaciones React Native
React Day Berlin 2022React Day Berlin 2022
28 min
Ejecuta Juegos Dentro de Tus Aplicaciones React Native
Top Content
Today's Talk discusses integrating Unity into React Native apps for game development. Unity provides a wide range of capabilities and can be seamlessly integrated with React Native. The integration involves using the Unity View component and the Unity Message callback to enable communication between the two platforms. Native plugins are created to facilitate communication between Unity and React Native. The performance of Unity in React Native apps is comparable to regular React Native apps, and the decision to use Unity or React Native depends on the app's use case and need for advanced UI and gaming capabilities.
Cómo compartir código entre una aplicación web de React y una aplicación móvil de React Native en Monorepo
React Summit 2022React Summit 2022
7 min
Cómo compartir código entre una aplicación web de React y una aplicación móvil de React Native en Monorepo
This presentation focuses on sharing code between React web and React native mobile apps. The speaker demonstrates how to achieve feature parity using a Monorepo with NX. They highlight the importance of sharing non-UI code, such as business logic and state management, through shared libraries. This approach allows the apps to focus on UI code while keeping non-UI code separate. For more details, refer to the speaker's blog post.