Saltar al contenido
Meeko
Escribe para buscar en las guías y en la referencia de la API. Ábrela desde cualquier página con / o Ctrl K; muévete con las flechas y entra con Intro.
Empezar

Contenidos

En esta página

mountDevtoolsPanel

Monta en la página el panel de Meeko DevTools, aislado en Shadow DOM, con el árbol de instancias, las señales editables, la línea de tiempo y los puntos de parada.

API avanzada Desde 1.0.0 @meekojs/meeko/devtools-ui Código fuente
ts
import { mountDevtoolsPanel } from "@meekojs/meeko/devtools-ui";

mountDevtoolsPanel añade a la página el panel de Meeko DevTools: un árbol con las instancias de componentes vivas, el detalle de sus props y señales (con un editor para cambiarlas), una línea de tiempo filtrable de lecturas y escrituras con su archivo y su línea, el resaltado del elemento de cada instancia en la página y un punto de parada por instancia. Vive en un Shadow DOM, así que no hereda ni altera los estilos de la aplicación.

Desde 1.8, en una aplicación de meeko dev basta con devtools: true en meeko.config.ts: el framework lo monta sin este código. mountDevtoolsPanel sigue sirviendo para un host de Vite propio o un contenedor propio.

Lee el hook window.__MEEKO_DEVTOOLS__, que instala el código de desarrollo de los componentes al hidratarse con Vite en desarrollo. Si todavía no existe, el panel lo dice y se conecta solo en cuanto aparece.

Uso#

ts
// app/plugins/devtools.client.ts
import { definePlugin } from "@meekojs/meeko/framework";

export default definePlugin(async () => {
  if (!import.meta.env.DEV) return;
  const { mountDevtoolsPanel } = await import("@meekojs/meeko/devtools-ui");
  mountDevtoolsPanel();
});

El plugin .client.ts se ejecuta sólo en el navegador, antes de hidratar; el panel se conecta al hook cuando el primer componente se hidrata. Con import() dinámico dentro de import.meta.env.DEV, el panel no entra en el bundle de producción.

Tipo#

ts
function mountDevtoolsPanel(options?: DevtoolsPanelOptions): DevtoolsPanel

DevtoolsPanelOptions

ts
interface DevtoolsPanelOptions {
	container?: Element
	position?: DevtoolsPanelPosition
}

DevtoolsPanel

ts
interface DevtoolsPanel {
	refresh(): void
	unmount(): void
}

DevtoolsPanelPosition

ts
type DevtoolsPanelPosition = 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right'

Opciones#

Opción Tipo Por defecto Descripción
container Element document.body Elemento que recibe el host del Shadow DOM.
position "bottom-right" | "bottom-left" | "top-right" | "top-left" "bottom-right" Desde 1.8, esquina de la ventana en la que se fija el panel. Otro valor lanza TypeError.

Desde 1.8, el panel se minimiza a una pastilla con el número de eventos nuevos (su botón o Alt+Mayús+M) y se lleva a otra esquina con su asa (arrastrando o con las flechas). Recuerda el estado plegado y la esquina en localStorage (meeko:devtools-panel); una position distinta en la llamada manda sobre la esquina recordada. Véase Aspecto, minimizar y mover.

Valor devuelto#

Un DevtoolsPanel:

Miembro Descripción
refresh() Vuelve a buscar el hook y actualiza los datos. Es lo que hace el botón «Actualizar».
unmount() Quita el panel y libera sus suscripciones, sus eventos y el resaltado. El botón de cerrar hace lo mismo.

Lanza Error: Meeko DevTools requires a browser document si el contenedor no pertenece a un documento con ventana, y TypeError: Meeko DevTools: position must be one of bottom-right, bottom-left, top-right, top-left con otra position.

Ejemplos#

En un host de Vite propio#

ts
// src/entry-client.ts
import { hydrate } from "./App.meeko";

hydrate(document.getElementById("app")!, props, state);

if (import.meta.env.DEV) {
  const { mountDevtoolsPanel } = await import("@meekojs/meeko/devtools-ui");
  const panel = mountDevtoolsPanel();
  import.meta.hot?.dispose(() => panel.unmount());
}

import.meta.hot.dispose quita el panel antes de que HMR vuelva a ejecutar la entrada, para no acumular paneles.

En un contenedor propio#

ts
const panel = mountDevtoolsPanel({ container: document.querySelector("#devtools") ?? document.body });

Mostrarlo con un atajo de teclado#

ts
let panel: { unmount(): void } | undefined;
window.addEventListener("keydown", async (event) => {
  if (!(event.ctrlKey && event.shiftKey && event.key === "M")) return;
  if (panel) { panel.unmount(); panel = undefined; return; }
  const { mountDevtoolsPanel } = await import("@meekojs/meeko/devtools-ui");
  panel = mountDevtoolsPanel();
});

Errores comunes#

Montarlo en producción#

Incorrectots
import { mountDevtoolsPanel } from "@meekojs/meeko/devtools-ui";
mountDevtoolsPanel();

En producción el compilador no instala el hook: el panel sólo muestra Hook no disponible. Abre una página Meeko con Vite en desarrollo y pulsa Actualizar., y el import estático mete su código en el bundle de producción.

Correctots
if (import.meta.env.DEV) {
  const { mountDevtoolsPanel } = await import("@meekojs/meeko/devtools-ui");
  mountDevtoolsPanel();
}

Llamarlo en el servidor#

Incorrectots
// app/plugins/devtools.ts (sin .client), que también se ejecuta en el SSR
export default definePlugin(async () => {
  const { mountDevtoolsPanel } = await import("@meekojs/meeko/devtools-ui");
  mountDevtoolsPanel();
});

En el servidor no hay document: la llamada lanza ReferenceError: document is not defined y la petición falla.

Correctots
// app/plugins/devtools.client.ts
export default definePlugin(async () => {
  if (!import.meta.env.DEV) return;
  const { mountDevtoolsPanel } = await import("@meekojs/meeko/devtools-ui");
  mountDevtoolsPanel();
});

Montarlo dos veces con HMR#

Incorrectots
// src/entry-client.ts
if (import.meta.env.DEV) mountDevtoolsPanel();

Cada vez que HMR vuelve a ejecutar la entrada se añade otro panel encima del anterior.

Correctots
if (import.meta.env.DEV) {
  const panel = mountDevtoolsPanel();
  import.meta.hot?.dispose(() => panel.unmount());
}

Notas#

  • Sólo en desarrollo. El hook existe sólo con los componentes compilados por Vite en modo desarrollo; meeko build no lo incluye.
  • Versión. El panel comprueba la versión del protocolo del hook: con otro @meekojs/meeko en la página, muestra Versión de protocolo DevTools no compatible y pide usar el mismo paquete para el panel y la aplicación.
  • Seguridad. El panel puede leer y cambiar las señales de la página: no lo montes donde lo vea un usuario final.
  • Estilos. El panel está aislado en su Shadow DOM, con all: initial en su host y, desde 1.8, los colores de Meeko en claro u oscuro (el del sistema o el data-theme de <html>), y se dibuja por encima de todo (z-index máximo). Cada llamada crea un panel nuevo: no hay comprobación de uno ya montado (la opción devtools sí respeta un panel que la aplicación ya montó).
  • Chrome. La extensión Meeko DevTools ofrece el mismo panel dentro de Chrome DevTools, sin tocar el código de la aplicación.

Relacionado#

¿Te sirvió esta página?

Añadir un comentario

Se envía al elegir «Sí» o «No». Solo se guardan la página, tu respuesta y el comentario: ni cookies ni datos tuyos.

0 de 2000 caracteres

Editar en GitHub: docs/reference/advanced/mountdevtoolspanel.md