¿Qué es EmulatorJS? Un motor de emulación, explicado

EmulatorJS es el envoltorio JavaScript de código abierto que permite que los núcleos libretro se ejecuten en cualquier navegador moderno. Aquí se explica qué hace, por qué importa y qué puede y qué no puede emular.

Revisado por última vez por Mira Köhler el

Definición

EmulatorJS es una interfaz frontal JavaScript de código abierto que envuelve núcleos emuladores libretro compilados a WebAssembly. Se lanzó por primera vez en 2017 y ahora es mantenido por una comunidad de colaboradores en GitHub. Expone una API pequeña y estable — cargar ROM , configurar controles, guardar estado, capturar pantalla — y oculta la complejidad del núcleo subyacente.

Cómo funciona internamente

libretro es un proyecto que estandariza la interfaz entre un núcleo emulador (el programa que simula la CPU, la memoria y los gráficos de una consola) y una interfaz frontal (la interfaz de usuario que conecta controles, audio y un lienzo). EmulatorJS toma los núcleos libretro existentes escritos en C/C++ — por ejemplo, Snes9x para SNES, FCEUmm para NES, mGBA para Game Boy Advance — y los compila a WebAssembly utilizando Emscripten.

Cuando carga un juego, EmulatorJS transmite el núcleo apropiado a un Web Worker, le entrega los bytes de la ROM y expone un lienzo en el que el núcleo renderiza 60 veces por segundo. El audio se enruta a través del AudioWorklet de Web Audio para una reproducción de baja latencia. La entrada proviene del teclado, una superposición táctil en pantalla o la Gamepad API.

Sistemas compatibles

EmulatorJS admite una amplia gama de hardware de la era de cartuchos y del inicio de la era de discos:

  • Nintendo: NES, SNES, Game Boy, Game Boy Color, Game Boy Advance, Nintendo 64
  • Sega: Master System, Genesis/Mega Drive, Sega CD, 32X, Saturn
  • NEC: PC Engine / TurboGrafx-16, PC-FX
  • Atari: 2600, 5200, 7800, Lynx, Jaguar
  • Sony: PlayStation 1
  • SNK: Neo Geo, Neo Geo Pocket / Color
  • Otros: Arcade (MAME), MSX, ColecoVision, Vectrex, WonderSwan

Lo que no puede emular (aún)

EmulatorJS está limitado por lo que funciona cómodamente en un navegador. PlayStation 2, GameCube, Xbox, Wii y 3DS están fuera de la cuestión — requieren controladores GPU, compilación JIT que los navegadores restringen por seguridad, y gigabytes de RAM. Eventualmente lo lograrán conforme WebGPU y SharedArrayBuffer maduren, pero a mediados de 2026 siguen siendo solo para plataformas nativas.

EmulatorJS vs RetroArch vs puertos WASM personalizados

RetroArch es la interfaz frontal de escritorio y móvil para libretro — es el análogo más cercano a EmulatorJS pero se ejecuta de forma nativa en lugar de en un navegador. Los puertos WebAssembly personalizados (por ejemplo, una compilación de Snes9x ajustada manualmente) a veces superan a EmulatorJS en rendimiento puro porque eliminan la capa de abstracción libretro, pero sacrifican la amplia cobertura de sistemas. EmulatorJS es la opción práctica predeterminada para cualquier sitio basado en navegador que desee admitir más de dos o tres plataformas.

Preguntas frecuentes

¿Es EmulatorJS el único emulador de navegador?
No, pero es el más ampliamente implementado. Existen puertos WebAssembly personalizados de núcleos individuales (Snes9x, mGBA, FCEUmm), así como motores propietarios construidos por servicios de emulación en streaming.
¿Es EmulatorJS de código abierto?
Sí. Tiene licencia MIT y el código fuente se encuentra en GitHub. Los núcleos libretro que envuelve tienen licencias individuales (la mayoría son GPL).
¿Funciona EmulatorJS sin conexión?
Una vez que el núcleo y la ROM se han cargado, el emulador se ejecuta completamente en su navegador sin llamadas de red. Cerrar y volver a abrir la pestaña requeriría descargar nuevamente el núcleo a menos que el sitio anfitrión utilice un service worker para almacenarlo en caché.