Primeros pasos
En este artículo crearemos un hola mundo enteramente desde 0, para que podamos ver la simpleza de meme.js, y posteriormente crearemos un chat en tiempo real para que de igual forma podamos ver lo fácil que es crear servicios, e interconectar por completo nuestro proyecto.
Cabe mencionar que lo puesto en este artículo es una demostración de las facilidades y capacidades de meme.js, es para que veas de forma rápida cómo funciona el SDK, por lo que no esperes comprender todo el código que se expone aquí.
“hola mundo” desde cero
Para crear el proyecto de meme.js más simple posible, haremos los siguientes pasos:
- Mediante la terminal, crearemos un directorio vacío.
- Dentro de este directorio, crearemos el archivo: index.mh
- Preferentemente editaremos el archivo anterior con VSCode (pero en realidad puedes editarlo con tu editor favorito), y le pondremos dentro:
index.mh
h1>hola mundo
- Ahora levantaremos este proyecto y abriremos una pestaña en nuestro navegador por defecto, con el siguiente comando en la terminal:
me -s -no-demon -open
Con estos simples pasos podemos ver varias cosas:
- La simpleza de meme.js, solo con un archivo index y el SDK, tendremos un sitio web. meme.js, no necesita de complejos sistemas de archivos ad hoc, un sin número de dependencias o sistemas complejos de administración de eventos y propagación de estados. Todo esto solo para poder usarse. meme.js es simple y eficaz.
- La independencia de meme.js es absoluta. Es decir, meme.js no necesita nada para funcionar, ni para las páginas, ni para los componentes más complejos. Si abres las herramientas de desarrollo e inspeccionas la red, veras como meme.js, no descargo ningún tipo de dependencia para poder funcionar.
- El performance de meme.js es el mejor. El SDK es una nueva forma de escribir la web, por que lo que escribes con meme.js, es la web estándar, no escribes componentes de un framework. Y como tal, no habrá nada independiente que reduzca el rendimiento de tu software.
- La potencia de meme.js. Y que si te digo que ese hola mundo que acabamos de hacer, podría tener server side render solo con agregar 34 caracteres más (para que la línea quede de la siguiente manera:
, ahora solo guardamos y refrescamos nuestra página), pero esto no es nada, podemos hacer un sin número de cosas con el código justo, creando los componentes más increíbles de la forma más simple y lógica.h1>hola mundo {request global.x??=0; return ++x}
Mi primer componente
Ahora vamos a crear un componente de memeJS, para poder consumirlo desde nuestro index. Para esto seguiremos los siguientes pasos:
- Creamos un archivo llamado mi_componente.mj. cabe resaltar que cualquier componente que será consumido en el front, debe de estar compuesto por 2 o más palabras, ya que los custom elements de una sola palabra están reservados por el estándar. De modo que nuestra carpeta quedaría de la siguiente forma:
carpeta
index.mh
mi_componente.mj
- Ahora colocamos el siguiente código dentro del archivo que acabamos de crear:
mi_componente.mj
class { View() { h1>hola desde mi_componente } Style() { h1 background-color: pink } }
- Para consumir el componente en index.mh escribiremos en la última línea, la etiqueta con el nombre de nuestro componente mi_componente, con lo que quedaría de la siguiente forma:
index.mh
h1>hola mundo {request global.x??=0; return ++x} mi_componente
- Por último guardamos y refrescamos nuestra página en nuestro navegador.
Con este ejercicio acabamos de ver cómo se crea y se consume el más simple de los componentes (solo tiene una vista y estilos). También podemos ver como los estilos que escribamos en el componente tienen un alcance definido, es decir todos los estilos que se escriban en el componente, solo afectarán a este mismo y a sus hijos.
Creación de un chat en tiempo real
Ya hicimos el 0, por lo que ahora toca hacer el 100 😏, ya que ahora te mostrare el uso de los protocolos de meme.js, la programación de un back completamente funcional y la forma en la que front y back se funden en una sola entidad, todo esto en 84 líneas totales de código, por supuesto contando con el código bien formateado, (nada de todo en una sola línea de código 😂), y de igual forma cuento las líneas del index y hasta las de la configuración 😌.
Para este ejemplo, podemos borrar todos los archivos de nuestra carpeta de proyecto o crear una nueva. luego crearemos los siguientes archivos:
carpeta
meme.conf
index.mh
pr_chat.mj
Y ahora tendremos el siguiente contenido en los archivos:
meme.conf
module.exports = {
repositories: ['mimix.red'],
port_driver : 9000,
app : { port:9001 },
api : { port:9002 },
res : { port:9003 },
};
index.mh
mx_scripts
pr_chat
pr_chat.mj
class {
// back-socket
get_message( message ) {
for ( const socket of this.sockets ) {
socket.Trigger( 'set_message', message, socket.id===this.id ? 'right' : 'left' );
}
}
// back-public
View() {
! (set_message)=onSetMessage
.cont
*messages
.box
input*inp (keyup)=onKeyUp
button*btn (click)=onClick>enviar
}
Style() {
>.cont
border : solid 1 red
display : flex
flex-direction: column
height : 80vh
left : 50%
position : absolute
top : 50%
transform : translate(-50%, -50%)
width : 500
>.messages
align-items : flex-start
display : flex
flex-direction : column
flex : 1
gap : 20
justify-content: flex-end
padding : 10
>.balloon
background-color: mistyrose
border-radius : 10
padding : 10 20
&.right
place-self: flex-end
>.box
align-items: center
display : flex
gap : 10
padding : 10
>.inp
flex: 1
}
Create() {
socket.Connect();
}
onKeyUp( event ) {
if ( event.key==='Enter' )
refs.btn.Trigger( 'click' );
}
onClick() {
const { value } = refs.inp;
if ( !value ) {
console.error( 'el mensaje está vacío' );
return;
}
refs.inp.value = '';
refs.inp.focus();
this.Trigger( 'pr_chat/get_message', value );
}
onSetMessage( _, message, type ) {
refs.messages.Add({mh .balloon.{type}}>{message} });
}
}
me -s -no-demon -open