{"id":34248,"date":"2025-10-20T13:48:55","date_gmt":"2025-10-20T11:48:55","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=34248"},"modified":"2025-10-20T13:48:57","modified_gmt":"2025-10-20T11:48:57","slug":"vanillacreamjs-superpoderes-para-javascript-nativo","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/","title":{"rendered":"VanillaCreamJS: S\u00faperpoderes para JavaScript nativo"},"content":{"rendered":"\n<p>VanillaCreamJS es una biblioteca de JavaScript que literalmente otorga \u201cs\u00faperpoderes\u201d a JavaScript puro, permitiendo capacidades modernas y potentes como la reactividad, sin necesidad de herramientas de compilaci\u00f3n ni pasos de build.<\/p>\n\n\n\n<p>Es una tecnolog\u00eda \u00fanica porque:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aporta reactividad a JavaScript puro.<\/li>\n\n\n\n<li>Funciona con un rendimiento sobresaliente gracias a la ausencia de algoritmos de diffing o rec\u00e1lculo.<\/li>\n\n\n\n<li>Ofrece herramientas potentes con una API m\u00ednima e intuitiva.<\/li>\n\n\n\n<li>Ayuda a mejorar tu comprensi\u00f3n de JavaScript puro.<\/li>\n\n\n\n<li>Se puede integrar con cualquier stack de backend sin fricciones.<\/li>\n\n\n\n<li>Aumenta la productividad del desarrollador en proyectos de tama\u00f1o peque\u00f1o a mediano.<\/li>\n\n\n\n<li>Combina lo mejor de herramientas como HTMX, Vue y Alpine.<\/li>\n\n\n\n<li>Su nombre refleja su objetivo: refinar JavaScript puro y elevarlo, sin alejarse demasiado de sus ra\u00edces.<\/li>\n<\/ul>\n\n\n\n<p>VanillaCreamJS es creado y mantenido por Riccardo Degni, un desarrollador web senior italiano. \ud83d\udc49 <a href=\"https:\/\/www.riccardodegni.com\/projects\/vanillacreamjs\">https:\/\/www.riccardodegni.com\/projects\/vanillacreamjs<\/a><\/p>\n\n\n\n<p>\ud83d\udce6 <strong>Instalaci\u00f3n<\/strong><\/p>\n\n\n\n<p>Simplemente incluye VanillaCreamJS a trav\u00e9s de un CDN:<\/p>\n\n\n\n<p>HTML<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/cdn.jsdelivr.net\/npm\/vanillacream\/dist\/vanillacream.min.js\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>O, inst\u00e1lalo v\u00eda NPM:<\/p>\n\n\n\n<p>Bash<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">npm install vanillacreamjs\n<\/code><\/span><\/pre>\n\n\n<p>\ud83d\udca5 <strong>S\u00faperpoderes para elementos del DOM<\/strong><\/p>\n\n\n\n<p>En el n\u00facleo de VanillaCream se encuentra la funci\u00f3n <code>$<\/code>. A primera vista puede recordarte a jQuery, pero es un universo completamente diferente \u2014y mucho m\u00e1s moderno\u2014 de funcionalidades.<\/p>\n\n\n\n<p>Esta funci\u00f3n devuelve un elemento (o un conjunto de elementos) con s\u00faperpoderes, incluyendo vinculaci\u00f3n reactiva de estado:<\/p>\n\n\n\n<p>HTML<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"app\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"el\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n  <span class=\"hljs-keyword\">const<\/span> &#91;el, s] = $(<span class=\"hljs-string\">'#el'<\/span>, { <span class=\"hljs-attr\">counter<\/span>: <span class=\"hljs-number\">10<\/span> })\n\n  el.text = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> s.counter\n  el.onClick(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> s.counter++)\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Aqu\u00ed, la funci\u00f3n <code>$<\/code> devuelve un elemento del DOM (en este caso <code>el<\/code>) y un objeto de estado reactivo <code>s<\/code>. Cada elemento potenciado por <code>$<\/code> expone propiedades poderosas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>text<\/code>: establecer contenido de texto<\/li>\n\n\n\n<li><code>html<\/code>: establecer contenido HTML interno<\/li>\n\n\n\n<li><code>class<\/code>: alternar clases CSS din\u00e1micamente<\/li>\n\n\n\n<li><code>on<\/code>: agregar listeners de eventos (como <code>onClick<\/code>, <code>onInput<\/code>, etc.)<\/li>\n\n\n\n<li><code>attr<\/code>: establecer atributos HTML<\/li>\n\n\n\n<li><code>data<\/code>: establecer atributos <code>data-*<\/code><\/li>\n<\/ul>\n\n\n\n<p>Cuando asignas una funci\u00f3n a una de estas propiedades, se vuelve reactiva, actualizando autom\u00e1ticamente el DOM cuando el estado cambia.<\/p>\n\n\n\n<p><strong>Ejemplo: alternar una clase CSS<\/strong><\/p>\n\n\n\n<p>HTML<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"app\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"el\"<\/span>&gt;<\/span>box<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n  <span class=\"hljs-keyword\">const<\/span> &#91;el, s] = $(<span class=\"hljs-string\">'#el'<\/span>, { <span class=\"hljs-attr\">hl<\/span>: <span class=\"hljs-literal\">true<\/span> })\n\n  el.class.highlighted = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> s.hl\n  el.on.click(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> s.hl = !s.hl)\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">style<\/span>&gt;<\/span><span class=\"css\">\n  <span class=\"hljs-selector-class\">.highlighted<\/span> { <span class=\"hljs-attribute\">background-color<\/span>: lightgreen; <span class=\"hljs-attribute\">padding<\/span>: <span class=\"hljs-number\">10px<\/span>; }\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">style<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Al hacer clic en el elemento se alterna el valor de <code>s.hl<\/code>, lo que a\u00f1ade o elimina din\u00e1micamente la clase <code>highlighted<\/code> \u2014sin manipulaci\u00f3n manual del DOM.<\/p>\n\n\n\n<p>\u2699\ufe0f <strong>Reactividad m\u00faltiple con <code>.set<\/code><\/strong><\/p>\n\n\n\n<p>Tambi\u00e9n puedes aplicar m\u00faltiples propiedades reactivas a la vez usando <code>.set<\/code>:<\/p>\n\n\n\n<p>JavaScript<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">el<\/span><span class=\"hljs-selector-class\">.css<\/span><span class=\"hljs-selector-class\">.set<\/span>({\n  <span class=\"hljs-attribute\">color<\/span>: <span class=\"hljs-string\">'blue'<\/span>,\n  backgroundColor: () =&gt; state.bg,\n  width: () =&gt; state.x + <span class=\"hljs-string\">'px'<\/span>\n})\n\n<span class=\"hljs-selector-tag\">el<\/span><span class=\"hljs-selector-class\">.class<\/span><span class=\"hljs-selector-class\">.set<\/span>({\n  <span class=\"hljs-attribute\">active<\/span>: () =&gt; state.active,\n  box: () =&gt; state.counter &gt;= <span class=\"hljs-number\">10<\/span>,\n  otherClass: () =&gt; state.active &amp;&amp; state.counter &gt;= <span class=\"hljs-number\">10<\/span>\n})\n\n<span class=\"hljs-selector-tag\">el<\/span><span class=\"hljs-selector-class\">.attr<\/span><span class=\"hljs-selector-class\">.set<\/span>({\n  <span class=\"hljs-attribute\">title<\/span>: () =&gt; `Title: ${state.title}`\n})\n\n<span class=\"hljs-selector-tag\">el<\/span><span class=\"hljs-selector-class\">.data<\/span><span class=\"hljs-selector-class\">.set<\/span>({\n  <span class=\"hljs-attribute\">x<\/span>: () =&gt; state.x * <span class=\"hljs-number\">10<\/span>\n})\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Refs: Desestructuraci\u00f3n poderosa<\/strong><\/p>\n\n\n\n<p>La funci\u00f3n <code>$.refs<\/code> acepta un elemento ra\u00edz y devuelve variables autom\u00e1ticamente enlazadas para cada ref del template, adem\u00e1s de un objeto de estado reactivo compartido:<\/p>\n\n\n\n<p>HTML<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"app\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"el\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"btn\"<\/span>&gt;<\/span>Actualizar estado<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n  <span class=\"hljs-keyword\">const<\/span> { el, btn, state } = $.refs(<span class=\"hljs-string\">'#app'<\/span>, { <span class=\"hljs-attr\">counter<\/span>: <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-attr\">bg<\/span>: <span class=\"hljs-string\">'lightblue'<\/span>, <span class=\"hljs-attr\">boxClass<\/span>: <span class=\"hljs-literal\">false<\/span> })\n\n  el.html = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> <span class=\"hljs-string\">`Counter: <span class=\"hljs-subst\">${state.counter}<\/span>`<\/span>\n  el.css.backgroundColor = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> state.bg\n  el.class.box = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> state.boxClass\n\n  btn.onClick(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n    state.counter++\n    <span class=\"hljs-keyword\">if<\/span> (state.bg !== <span class=\"hljs-string\">'lightgreen'<\/span>) state.bg = <span class=\"hljs-string\">'lightgreen'<\/span>\n    state.boxClass = !state.boxClass\n  })\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Incluso puedes usar namespaces en tus refs para una desestructuraci\u00f3n m\u00e1s organizada:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"btn.AZ\"<\/span>&gt;<\/span>Ordenar A-Z<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"btn.ZA\"<\/span>&gt;<\/span>Ordenar Z-A<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"btn.Random\"<\/span>&gt;<\/span>Aleatorio<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ul<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"el\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">ul<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-keyword\">const<\/span> { el, btn, state } = $.refs(<span class=\"hljs-string\">'#app'<\/span>, { <span class=\"hljs-comment\">\/* ... *\/<\/span> })\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>\ud83e\udde0 <strong>Reactividad profunda<\/strong><\/p>\n\n\n\n<p>El motor reactivo de VanillaCream soporta tanto tipos primitivos como referencias (arrays, objetos, matrices). Puedes activar reactividad simplemente modificando elementos de un array o propiedades de un objeto, incluso usando m\u00e9todos como <code>push<\/code>, <code>pop<\/code> o <code>splice<\/code>.<\/p>\n\n\n\n<p>HTML<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"app\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"box\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  Insertar fruta: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"fruit\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"btn\"<\/span>&gt;<\/span>A\u00f1adir fruta<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n  <span class=\"hljs-keyword\">const<\/span> { box, fruit, btn, state } = $.refs(<span class=\"hljs-string\">'#app'<\/span>, { <span class=\"hljs-attr\">fruits<\/span>: &#91;<span class=\"hljs-string\">'apple'<\/span>, <span class=\"hljs-string\">'pear'<\/span>, <span class=\"hljs-string\">'kiwi'<\/span>] })\n\n  box.text = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> <span class=\"hljs-string\">'Fruits: '<\/span> + state.fruits.join(<span class=\"hljs-string\">', '<\/span>)\n\n  btn.onClick(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n    state.fruits.push(fruit.attr.value)\n    fruit.attr.value = <span class=\"hljs-string\">''<\/span>\n  })\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Aqu\u00ed, actualizar el array actualiza autom\u00e1ticamente el DOM. No se necesitan hooks complejos ni l\u00f3gica de renderizado \u2014solo JavaScript puro.<\/p>\n\n\n\n<p><strong>Templates HTML reactivos<\/strong><\/p>\n\n\n\n<p>VanillaCream soporta expresiones reactivas directamente en tu HTML usando atributos <code>x-<\/code>:<\/p>\n\n\n\n<p>HTML<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"app\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">x-text<\/span>=<span class=\"hljs-string\">\"`Counter: ${state.counter}`\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">x-on.click<\/span>=<span class=\"hljs-string\">\"() =&gt; state.counter++\"<\/span>&gt;<\/span>Incrementar contador<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">x-if<\/span>=<span class=\"hljs-string\">\"state.counter === 10\"<\/span>&gt;<\/span>\u00a1El contador es 10!<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n  <span class=\"hljs-keyword\">const<\/span> { state } = $.refs(<span class=\"hljs-string\">'#app'<\/span>, { <span class=\"hljs-attr\">counter<\/span>: <span class=\"hljs-number\">0<\/span> })\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Solicitudes AJAX simplificadas<\/strong><\/p>\n\n\n\n<p>VanillaCream ofrece control total sobre AJAX con una sintaxis muy simple:<\/p>\n\n\n\n<p>JavaScript<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">el.post(<span class=\"hljs-string\">'https:\/\/jsonplaceholder.typicode.com\/posts\/'<\/span>, {\n  <span class=\"hljs-attr\">data<\/span>: {\n    <span class=\"hljs-attr\">title<\/span>: <span class=\"hljs-string\">'VanillaCream.js'<\/span>,\n    <span class=\"hljs-attr\">body<\/span>: <span class=\"hljs-string\">'Best Vanilla JS framework'<\/span>,\n    <span class=\"hljs-attr\">userId<\/span>: <span class=\"hljs-number\">1<\/span>\n  }\n})\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>\ud83e\udde9 <strong>Creaci\u00f3n de componentes reutilizables con VanillaCream<\/strong><\/p>\n\n\n\n<p>Una de las funcionalidades m\u00e1s potentes es la capacidad de construir componentes reactivos reutilizables en JavaScript puro, sin render functions personalizadas, hooks ni virtual DOM:<\/p>\n\n\n\n<p>JavaScript<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> Counter = {\n  <span class=\"hljs-attr\">state<\/span>: <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> ({ <span class=\"hljs-attr\">count<\/span>: <span class=\"hljs-number\">0<\/span> }),\n\n  <span class=\"hljs-attr\">template<\/span>: <span class=\"hljs-string\">`\n    &lt;p ref=\"p\"&gt;&lt;\/p&gt;\n    &lt;button ref=\"btn\"&gt;+&lt;\/button&gt;\n  `<\/span>,\n\n  setup({ refs, state }) {\n    <span class=\"hljs-keyword\">const<\/span> {p, btn} = refs\n    p.text = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> <span class=\"hljs-string\">`Count: <span class=\"hljs-subst\">${state.count}<\/span>`<\/span>\n    btn.onClick(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> state.count++)\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Para renderizar este componente en uno o varios lugares:<\/p>\n\n\n\n<p>JavaScript<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">$(<span class=\"hljs-string\">'#counter1, #counter2'<\/span>).component(Counter)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Componentes con par\u00e1metros<\/strong><\/p>\n\n\n\n<p>Los componentes de VanillaCream tambi\u00e9n pueden recibir datos personalizados:<\/p>\n\n\n\n<p>HTML<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"app\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"counter1\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"counter2\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n  <span class=\"hljs-keyword\">const<\/span> Counter = {\n    <span class=\"hljs-attr\">data<\/span>: {<span class=\"hljs-attr\">start<\/span>: <span class=\"hljs-number\">0<\/span>},\n    <span class=\"hljs-attr\">state<\/span>: <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> ({ <span class=\"hljs-attr\">count<\/span>: <span class=\"hljs-number\">0<\/span> }),\n    <span class=\"hljs-attr\">template<\/span>: <span class=\"hljs-string\">`&lt;p ref=\"p\"&gt;&lt;\/p&gt;&lt;button ref=\"btn\"&gt;+&lt;\/button&gt;`<\/span>,\n    setup({ refs, state, data }) {\n      state.count = data.start\n      refs.p.text = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> <span class=\"hljs-string\">`Count: <span class=\"hljs-subst\">${state.count}<\/span>`<\/span>\n      refs.btn.onClick(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> state.count++)\n    }\n  }\n\n  <span class=\"hljs-keyword\">const<\/span> {counter1, counter2} = $.refs(<span class=\"hljs-string\">'#app'<\/span>)\n  counter1.component(Counter, { <span class=\"hljs-attr\">data<\/span>: {<span class=\"hljs-attr\">start<\/span>: <span class=\"hljs-number\">5<\/span>} })\n  counter2.component(Counter, { <span class=\"hljs-attr\">data<\/span>: {<span class=\"hljs-attr\">start<\/span>: <span class=\"hljs-number\">100<\/span>} })\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Propiedades computadas<\/strong><\/p>\n\n\n\n<p>VanillaCream permite derivar valores basados en otros estados reactivos:<\/p>\n\n\n\n<p>HTML<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"app\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"box\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"input\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-keyword\">const<\/span> { box, input, state } = $.refs(<span class=\"hljs-string\">'#app'<\/span>, {\n  <span class=\"hljs-attr\">firstName<\/span>: <span class=\"hljs-string\">'John'<\/span>,\n  <span class=\"hljs-attr\">lastName<\/span>: <span class=\"hljs-string\">'Doe'<\/span>\n})\n\n<span class=\"hljs-keyword\">const<\/span> fullName = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> <span class=\"hljs-string\">`<span class=\"hljs-subst\">${state.firstName}<\/span> <span class=\"hljs-subst\">${state.lastName}<\/span>`<\/span>\n\nbox.text = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> <span class=\"hljs-string\">`\u00a1Hola, <span class=\"hljs-subst\">${fullName()}<\/span>!`<\/span>\n\ninput.onInput(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n  <span class=\"hljs-keyword\">const<\/span> &#91;fn, ln] = input.attr.value.split(<span class=\"hljs-string\">' '<\/span>)\n  state.firstName = fn\n  state.lastName = ln ?? <span class=\"hljs-string\">''<\/span>\n})\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Compatible con cualquier backend<\/strong><\/p>\n\n\n\n<p>Aunque VanillaCream soporta componentes, tambi\u00e9n puedes delegar el renderizado al backend. Se integra perfectamente con cualquier stack.<\/p>\n\n\n\n<p>Por ejemplo, en Laravel podr\u00edas tener una vista Blade que proporcione datos desde la base de datos:<\/p>\n\n\n\n<p>PHP<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"app\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"box\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  Insertar fruta: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"fruit\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"btn\"<\/span>&gt;<\/span>A\u00f1adir fruta<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n  <span class=\"hljs-keyword\">const<\/span> { box, fruit, btn, state } = $.refs(<span class=\"hljs-string\">'#app'<\/span>, {\n    <span class=\"hljs-attr\">fruits<\/span>: @json($fruits)\n  })\n\n  box.text = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> <span class=\"hljs-string\">'Fruits: '<\/span> + state.fruits.join(<span class=\"hljs-string\">', '<\/span>)\n\n  btn.onClick(<span class=\"hljs-keyword\">async<\/span> () =&gt; {\n    <span class=\"hljs-keyword\">const<\/span> v = fruit.attr.value\n\n    <span class=\"hljs-keyword\">await<\/span> $.<span class=\"hljs-keyword\">get<\/span>('\/my-backend\/add-fruit', {\n      <span class=\"hljs-attr\">data<\/span>: { <span class=\"hljs-attr\">fruit<\/span>: v }\n    })\n\n    state.fruits.push(v)\n    fruit.attr.value = <span class=\"hljs-string\">''<\/span>\n  })\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>\ud83d\ude80 <strong>\u00bfListo para probar VanillaCream?<\/strong><\/p>\n\n\n\n<p>Ya sea que est\u00e9s construyendo un prototipo r\u00e1pido, mejorando una app existente o simplemente quieras redescubrir la alegr\u00eda de escribir JavaScript reactivo limpio, VanillaCream.js ofrece una soluci\u00f3n ligera y elegante, sin pasos de build.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.riccardodegni.com\/projects\/vanillacreamjs\/docs\/quick-introduction\" target=\"_blank\" rel=\"noreferrer noopener\">\ud83d\udc49 <strong>Documentaci\u00f3n<\/strong><br><\/a><a href=\"https:\/\/www.riccardodegni.com\/projects\/vanillacreamjs\/demo\/demo-intro\" target=\"_blank\" rel=\"noreferrer noopener\">\ud83e\uddea <strong>Demos en vivo<\/strong><br><\/a><a href=\"https:\/\/codepen.io\/riccardodegni\/pen\/OPPRVPe\">\ud83d\udee0\ufe0f <strong>Playground<\/strong><\/a><\/p>\n\n\n\n<p>Pru\u00e9balo y experimenta el poder de la reactividad\u2026 \u00a1a la manera del vanilla JS!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>VanillaCreamJS es una biblioteca de JavaScript que literalmente otorga \u201cs\u00faperpoderes\u201d a JavaScript puro, permitiendo capacidades modernas y potentes como la reactividad, sin necesidad de herramientas de compilaci\u00f3n ni pasos de build. Es una tecnolog\u00eda \u00fanica porque: VanillaCreamJS es creado y mantenido por Riccardo Degni, un desarrollador web senior italiano. \ud83d\udc49 https:\/\/www.riccardodegni.com\/projects\/vanillacreamjs \ud83d\udce6 Instalaci\u00f3n Simplemente incluye&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/\">Read more<\/a><\/p>\n","protected":false},"author":94,"featured_media":33075,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10606],"tags":[],"collections":[12939,13012],"class_list":{"0":"post-34248","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-backend-es","8":"collections-desarrollo-web-es","9":"collections-top-of-the-week-es","10":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>VanillaCreamJS: S\u00faperpoderes para JavaScript nativo<\/title>\n<meta name=\"description\" content=\"VanillaCreamJS es una biblioteca de JavaScript que a\u00f1ade \u201cs\u00faperpoderes\u201d a JavaScript puro, permitiendo operaciones modernas como la reactividad sin necesidad de herramientas de compilaci\u00f3n.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"VanillaCreamJS: S\u00faperpoderes para JavaScript nativo\" \/>\n<meta property=\"og:description\" content=\"VanillaCreamJS es una biblioteca de JavaScript que a\u00f1ade \u201cs\u00faperpoderes\u201d a JavaScript puro, permitiendo operaciones modernas como la reactividad sin necesidad de herramientas de compilaci\u00f3n.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-20T11:48:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-20T11:48:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1792\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Riccardo Degni\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Riccardo Degni\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/\"},\"author\":{\"name\":\"Riccardo Degni\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/6912e00a94efa41fb20e92ba1bb050fb\"},\"headline\":\"VanillaCreamJS: S\u00faperpoderes para JavaScript nativo\",\"datePublished\":\"2025-10-20T11:48:55+00:00\",\"dateModified\":\"2025-10-20T11:48:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/\"},\"wordCount\":664,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c.webp\",\"articleSection\":[\"Backend\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/\",\"name\":\"VanillaCreamJS: S\u00faperpoderes para JavaScript nativo\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c.webp\",\"datePublished\":\"2025-10-20T11:48:55+00:00\",\"dateModified\":\"2025-10-20T11:48:57+00:00\",\"description\":\"VanillaCreamJS es una biblioteca de JavaScript que a\u00f1ade \u201cs\u00faperpoderes\u201d a JavaScript puro, permitiendo operaciones modernas como la reactividad sin necesidad de herramientas de compilaci\u00f3n.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c.webp\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c.webp\",\"width\":1792,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backend\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"VanillaCreamJS: S\u00faperpoderes para JavaScript nativo\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Codemotion.Italy\/\",\"https:\/\/x.com\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/6912e00a94efa41fb20e92ba1bb050fb\",\"name\":\"Riccardo Degni\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/10\/rd-image-book-pic-e1697717445644-150x150.jpg\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/10\/rd-image-book-pic-e1697717445644-150x150.jpg\",\"caption\":\"Riccardo Degni\"},\"description\":\"I am a senior web developer, active both on front-end and back-end, a teacher focused on modern programming, a Research Consultant for IT research, and a writer who creates programming articles and guides. I am both a developer with a strong foundation in new technologies such as full Javascript-based environments and object-oriented programming on the server-side (PHP, Node, and Java), and a designer who makes powerful, modern, fully-responsive, and WordPress-free templates.\",\"sameAs\":[\"http:\/\/www.riccardodegni.com\/\",\"https:\/\/www.linkedin.com\/in\/riccardodegni\/\"],\"url\":\"https:\/\/www.codemotion.com\/magazine\/author\/riccardo-degni\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"VanillaCreamJS: S\u00faperpoderes para JavaScript nativo","description":"VanillaCreamJS es una biblioteca de JavaScript que a\u00f1ade \u201cs\u00faperpoderes\u201d a JavaScript puro, permitiendo operaciones modernas como la reactividad sin necesidad de herramientas de compilaci\u00f3n.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/","og_locale":"en_US","og_type":"article","og_title":"VanillaCreamJS: S\u00faperpoderes para JavaScript nativo","og_description":"VanillaCreamJS es una biblioteca de JavaScript que a\u00f1ade \u201cs\u00faperpoderes\u201d a JavaScript puro, permitiendo operaciones modernas como la reactividad sin necesidad de herramientas de compilaci\u00f3n.","og_url":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2025-10-20T11:48:55+00:00","article_modified_time":"2025-10-20T11:48:57+00:00","og_image":[{"width":1792,"height":1024,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c.webp","type":"image\/webp"}],"author":"Riccardo Degni","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Riccardo Degni","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/"},"author":{"name":"Riccardo Degni","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/6912e00a94efa41fb20e92ba1bb050fb"},"headline":"VanillaCreamJS: S\u00faperpoderes para JavaScript nativo","datePublished":"2025-10-20T11:48:55+00:00","dateModified":"2025-10-20T11:48:57+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/"},"wordCount":664,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c.webp","articleSection":["Backend"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/","url":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/","name":"VanillaCreamJS: S\u00faperpoderes para JavaScript nativo","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c.webp","datePublished":"2025-10-20T11:48:55+00:00","dateModified":"2025-10-20T11:48:57+00:00","description":"VanillaCreamJS es una biblioteca de JavaScript que a\u00f1ade \u201cs\u00faperpoderes\u201d a JavaScript puro, permitiendo operaciones modernas como la reactividad sin necesidad de herramientas de compilaci\u00f3n.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c.webp","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c.webp","width":1792,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/vanillacreamjs-superpoderes-para-javascript-nativo\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Backend","item":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/"},{"@type":"ListItem","position":3,"name":"VanillaCreamJS: S\u00faperpoderes para JavaScript nativo"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/6912e00a94efa41fb20e92ba1bb050fb","name":"Riccardo Degni","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/10\/rd-image-book-pic-e1697717445644-150x150.jpg","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/10\/rd-image-book-pic-e1697717445644-150x150.jpg","caption":"Riccardo Degni"},"description":"I am a senior web developer, active both on front-end and back-end, a teacher focused on modern programming, a Research Consultant for IT research, and a writer who creates programming articles and guides. I am both a developer with a strong foundation in new technologies such as full Javascript-based environments and object-oriented programming on the server-side (PHP, Node, and Java), and a designer who makes powerful, modern, fully-responsive, and WordPress-free templates.","sameAs":["http:\/\/www.riccardodegni.com\/","https:\/\/www.linkedin.com\/in\/riccardodegni\/"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/riccardo-degni\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c-600x400.webp","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c-600x600.webp","author_info":{"display_name":"Riccardo Degni","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/riccardo-degni\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c.webp",1792,1024,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c-150x150.webp",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c-300x171.webp",300,171,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c-768x439.webp",768,439,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c-1024x585.webp",1024,585,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c-1536x878.webp",1536,878,true],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c.webp",1792,1024,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c-100x100.webp",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c-180x128.webp",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c-896x504.webp",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c-400x225.webp",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c-600x400.webp",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-22-11.53.51-A-horizontal-digital-illustration-of-a-modern-programmer-working-at-a-desk-in-a-tech-office.-The-programmer-is-focused-sitting-in-front-of-multiple-c-600x600.webp",600,600,true]},"uagb_author_info":{"display_name":"Riccardo Degni","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/riccardo-degni\/"},"uagb_comment_info":0,"uagb_excerpt":"VanillaCreamJS es una biblioteca de JavaScript que literalmente otorga \u201cs\u00faperpoderes\u201d a JavaScript puro, permitiendo capacidades modernas y potentes como la reactividad, sin necesidad de herramientas de compilaci\u00f3n ni pasos de build. Es una tecnolog\u00eda \u00fanica porque: VanillaCreamJS es creado y mantenido por Riccardo Degni, un desarrollador web senior italiano. \ud83d\udc49 https:\/\/www.riccardodegni.com\/projects\/vanillacreamjs \ud83d\udce6 Instalaci\u00f3n Simplemente incluye&#8230;&hellip;","lang":"es","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/34248","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/94"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=34248"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/34248\/revisions"}],"predecessor-version":[{"id":34252,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/34248\/revisions\/34252"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/33075"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=34248"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=34248"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=34248"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=34248"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}