Modern HTML5 Game Engine โ ES Module packages, esbuild powered.
Egret Engine R is a modernized version of the Egret HTML5 game engine, repackaged as ES Module npm packages with esbuild as the build toolchain. It provides 2D rendering (Canvas/WebGL), an EUI component library, audio, networking, resource management, and more.
| Package | Description | Size (min) |
|---|---|---|
@egret-r/core |
Core engine: DisplayList, Events, Media, Net, Rendering | 309 KB |
@egret-r/eui |
UI component library: Button, List, Scroller, Layouts, EXML | 190 KB |
@egret-r/game |
Game extensions: MovieClip, URLLoader, ScrollView | 33 KB |
@egret-r/tween |
Easing animation: Tween, Ease (chain, parallel, wait) | 10 KB |
@egret-r/socket |
WebSocket wrapper | 3 KB |
@egret-r/assetsmanager |
Resource loading & management | โ |
@egret-r/resource |
Legacy RES module | โ |
Extension packages (
eui,game,tween,socket,assetsmanager,resource) declare@egret-r/coreas peerDependency โinstall core once, no duplication.
๐ Online Demos ยท ๐ API Docs
npm install @egret-r/core # required
npm install @egret-r/eui @egret-r/game @egret-r/tween @egret-r/socket # optional extensionsnpm create vite@latest my-game -- --template vanilla-ts
cd my-game
npm install @egret-r/core @egret-r/eui @egret-r/game// src/main.ts
import { egret } from '@egret-r/core';
import '@egret-r/eui';
class Main extends egret.DisplayObjectContainer {
constructor() {
super();
this.once(egret.Event.ADDED_TO_STAGE, () => {
this.stage.frameRate = 60;
}, this);
}
}
window.Main = Main;
window.addEventListener('DOMContentLoaded', () => {
const container = document.getElementById('game-container') as HTMLDivElement | null;
if (!container) return;
container.classList.add('egret-player');
container.setAttribute('data-entry-class', 'Main');
container.setAttribute('data-scale-mode', egret.StageScaleMode.NO_SCALE);
container.setAttribute('data-frame-rate', '60');
container.setAttribute('data-content-width', String(container.clientWidth || window.innerWidth));
container.setAttribute('data-content-height', String(container.clientHeight || window.innerHeight));
egret.runEgret({ renderMode: 'webgl' });
});# from repository root โ one command
npm run dev
# or manually:
npm install
npm run build
cd examples/basic && npx vite --host 127.0.0.1 --port 3005 --strictPortOpen http://127.0.0.1:3005/ in your browser. Use the top-right dropdown to switch between 23 test cases covering all packages.
| Module | Cases |
|---|---|
| Core | Geometry, Event/Touch, Graphics, Text, Transform, RenderTexture, BlendMode, Benchmarkร3, HttpRequest, Sound, Video, ImageLoader |
| EUI | ArrayCollection, Button, CheckBox/RadioButton, List/Scroller |
| Game | URLVariables, MovieClip |
| Tween | Easing, Multi-target |
| Socket | WebSocket |
Standalone playable games in examples/:
| Project | Directory | Dev Server |
|---|---|---|
| ๐งช Basic | examples/basic/ |
npm -w examples/basic run dev โ http://localhost:3000 |
| ๐ฆ Flappy Bird | examples/flappy-bird/ |
npm -w examples/flappy-bird run dev โ http://localhost:3001 |
| ๐งฑ Breakout | examples/breakout/ |
npm -w examples/breakout run dev โ http://localhost:3002 |
| ๐ข 2048 | examples/2048/ |
npm -w examples/2048 run dev โ http://localhost:3003 |
| ๐ Snake | examples/snake/ |
npm -w examples/snake run dev โ http://localhost:3005 |
| ๐ Shooter | examples/shooter/ |
npm -w examples/shooter run dev โ http://localhost:3006 |
| ๐ Match-3 | examples/match3/ |
npm -w examples/match3 run dev โ http://localhost:3008 |
| ๐ Link | examples/link/ |
npm -w examples/link run dev โ http://localhost:3009 |
| ๐ฑ Mini-Game | examples/minigame/ |
Multi-platform Flappy Bird (WeChat/Douyin/Kuaishou/QQ) |
Single command (build + dev server):
npm run devFor fast iteration during development, open two terminals:
| Terminal 1 | Terminal 2 |
|---|---|
npm run watch |
npm -w examples/basic run dev |
Watches src/ changes โauto-rebuilds packages |
Vite dev server โHMR auto-refreshes browser |
# Copy the template from the egret-r repository
cp -r templates/vite-game my-game
cd my-game
# Install dependencies
npm install
# Link local packages (monorepo dev)
npm link ../../packages/core ../../packages/eui ../../packages/game ../../packages/tween
# Start dev server
npm run devThe template (templates/vite-game/) includes a ready-to-run game skeleton with Stage, Button, Label and Tween animation examples. See templates/vite-game/README.md for details.
<script type="module">
import { egret } from './node_modules/@egret-r/core/dist/index.js';
import { eui } from './node_modules/@egret-r/eui/dist/index.js';
const stage = egret.Stage.getInstance();
// ...
</script>Egret Engine R supports WeChat, Douyin, Kuaishou, QQ, and Alipay mini-games out of the box. A single codebase can target all five platforms.
# Copy the multi-platform template
cp -r examples/minigame my-minigame
cd my-minigame
# Install & build for WeChat
npm install
npm run build:wx # โ dist/wx/
# Or build for all platforms at once
npm run build:all # โ dist/wx/ dist/tt/ dist/ks/ dist/qq/ dist/my/Then import the dist/{platform}/ folder into the corresponding developer tool.
minigame/
โโโ package.json # @egret-r/core + @egret-r/game
โโโ build.mjs # Multi-platform bundler (--platform wx|tt|ks|qq)
โโโ platforms/ # Per-platform config files
โ โโโ wx/ game.json + project.config.json
โ โโโ tt/ game.json + project.config.json
โโโ src/
โ โโโ game.ts # Platform-agnostic game code
โโโ dist/
โโโ wx/ โ import in WeChat DevTools
โโโ tt/ โ import in Douyin DevTools
// src/game.ts
import { egret } from '@egret-r/core';
import '@egret-r/game';
class Main extends egret.DisplayObjectContainer {
constructor() {
super();
this.addEventListener(egret.Event.ADDED_TO_STAGE, () => {
const stage = this.stage!;
// stage.$stageWidth / stage.$stageHeight = actual screen size
// ... your game setup ...
}, this);
}
}
(globalThis as any).Main = Main;
egret.startMiniGame({ entryClass: 'Main' });egret.startMiniGame() auto-detects the platform (wx/tt/ks/qq/my global) and sets up canvas, touch, WebGL rendering, and the game loop for you.
| Command | Target |
|---|---|
npm run build:wx |
WeChat Mini Game โ dist/wx/ |
npm run build:tt |
Douyin Mini Game โ dist/tt/ |
npm run build:ks |
Kuaishou Mini Game โ dist/ks/ |
npm run build:qq |
QQ Mini Game โ dist/qq/ |
npm run build:my |
Alipay Mini Game โ dist/my/ |
npm run build:all |
All five platforms at once |
Or use the build script directly:
node build.mjs --platform wx
node build.mjs --platform tt
node build.mjs --allThe engine provides a cross-platform sound effect API that works on Web (Web Audio API) and all mini-game platforms (WAV file playback):
// Play a simple tone
egret.playTone(440, 100); // 440 Hz (A4), 100ms
egret.playTone(800, 150); // 800 Hz, 150msNo platform-specific code needed โ the engine selects the right playback method automatically.
- Create
platforms/{name}/game.jsonandplatforms/{name}/project.config.json - Add a
build:{name}script inpackage.json
The engine's adapter system handles the rest. See src/egret/platform/ for details.
import { egret } from '@egret-r/core';
// Display objects
const bitmap = new egret.Bitmap(texture);
const shape = new egret.Shape();
shape.graphics.beginFill(0xff0000);
shape.graphics.drawRect(0, 0, 100, 100);
// Stage
const stage = egret.Stage.getInstance();
stage.addChild(bitmap);
// Events
bitmap.addEventListener(egret.TouchEvent.TOUCH_TAP, () => {
console.log('Tapped!');
}, this);
// HTTP
const request = new egret.HttpRequest();
request.open('https://api.example.com/data.json', egret.HttpMethod.GET);
request.addEventListener(egret.Event.COMPLETE, () => {
const data = JSON.parse(request.response);
}, this);
request.send();
// Sound
const sound = new egret.Sound();
sound.load('https://example.com/click.mp3');
sound.play();import { eui } from '@egret-r/eui';
// Components
const list = new eui.List();
const scroller = new eui.Scroller();
const panel = new eui.Panel();
// Layout
const layout = new eui.HorizontalLayout();
layout.gap = 10;
scroller.layout = layout;
// Data binding
const collection = new eui.ArrayCollection([
{ label: 'Item 1', value: 1 },
{ label: 'Item 2', value: 2 },
]);
list.dataProvider = collection;import { Tween, Ease } from '@egret-r/tween';
// Basic tween
Tween.get(target)
.to({ x: 200, y: 300 }, 500)
.to({ scaleX: 1.5, scaleY: 1.5 }, 300, Ease.backOut);
// Chain
Tween.get(obj1)
.to({ alpha: 0 }, 400)
.wait(200)
.call(() => console.log('Done!'));import { egret } from '@egret-r/core';
import { game } from '@egret-r/game';
// MovieClip
const mcData = game.MovieClipDataFactory.generateMovieClipData(jsonData, texture);
const mc = new game.MovieClip(mcData);
mc.gotoAndPlay('walk');
// URLLoader
const loader = new game.URLLoader();
loader.dataFormat = game.URLLoaderDataFormat.TEXT;
loader.load(new game.URLRequest('https://example.com/data.txt'));egret-r/
โโโ packages/
โ โโโ core/ # @egret-r/core
โ โโโ eui/ # @egret-r/eui
โ โโโ game/ # @egret-r/game
โ โโโ tween/ # @egret-r/tween
โ โโโ socket/ # @egret-r/socket
โ โโโ assetsmanager/ # @egret-r/assetsmanager
โ โโโ resource/ # @egret-r/resource
โโโ src/ # ESM source (namespaceโESM migration)
โโโ scripts/ # Build tooling (ESM .mjs)
โโโ examples/ # 9 game demos + testbed + mini-game template
โโโ docs/api/ # API reference (TypeDoc)
โโโ package.json # Monorepo root (npm workspaces)
npm install # Install dependencies
npm run build # Build all 7 packages (Web target)
npm run build:minigame# Build all packages (Mini-Game target)
npm run build:examples# Build all example demos
npm run dev # Build + start example dev server
npm run docs # Generate API docs (TypeDoc)
npm run clean # Remove all dist/ directories
npm test # Run all testsnpm publish --workspacessrc/egret/*.ts src/extension/*.ts (ESM source)
โ
โโโ Defines.debug.ts โ injected first (debug constants)
โโโ Kahn topological sort โ resolve dependency order
โโโ Auto-generated ESM entry (_esm_entry.ts)
โโโ Namespace bridging โ namespace โ ESM re-exports
โ
โโโ esbuild
โโโ bundle + ESM โ dist/index_tmp.js
โโโ IIFE wrap โ var hoisting for class extends
โโโ inline namespace assignments โ dist/index.js
| Platform | Status | Adapter |
|---|---|---|
| Chrome, Edge, Firefox, Safari | โ Full | WebAdapter (auto) |
| iOS Safari, Android Chrome | โ Full | WebAdapter (auto) |
| WeChat Mini Game | โ | WxAdapter |
| Douyin Mini Game | โ | TtAdapter |
| Kuaishou Mini Game | โ | KsAdapter |
| QQ Mini Game | โ | QqAdapter |
| Alipay Mini Game | โ | AlipayAdapter |
| Facebook Instant Games | โฌ | Planned |
All mini-game adapters share the same
GenericMiniGameAdapterbase class. Adding a new platform is ~5 lines of code. See src/egret/platform.
- ๐ฎ Online Demos playable examples & test cases
- ๐ API Docs full TypeDoc reference
- ๐ฆ GitHub source & issues
BSD License โ see LICENSE.md for details.