1.2.3 ⢠Published 9 months ago
@forest-js/core v1.2.3
š² forest-js
A tiny, real DOM-based UI engine written in pure JavaScript ā minimal, fast, and framework-free.
š Official Links
| Type | Link |
|---|---|
| GitHub Repository | GrangbelrLurain/forest-js |
| Documentation | Forest.js Docs |
š¦ Packages
| Package | Description |
|---|---|
@forest-js/core | Core DOM engine (no virtual DOM) |
@forest-js/cli | Internal CLI logic for scaffolding apps |
create-forest | Lightweight installer for templates via npx |
⨠Features
- ā Real DOM (no VDOM diffing)
- ā” Ultra-lightweight (~7kB bundled)
- š Explicit
update()per element - š§ Fully JavaScript-based, no JSX, no Babel
- š” Tiny reactive
store()built-in - š SSR-friendly (with flexibility)
- š§° Framework-free & zero dependency
š Getting Started
npx create-forest my-app
cd my-app
pnpm install
pnpm devš§© Core Example
import { createStore, addEvent, decorate, tree, addChild } from "@forest-js/core";
const CountButton = () => {
const count = createStore(0);
const ButtonRef = tree("button");
return decorate(
ButtonRef,
addChild({ count }, ({ count }) => count),
addEvent("click", () => count.update((n) => n + 1))
);
};
export default CountButton;š³ Core API
createForest()
Initializes the application by rendering the root element.
createForest("#app", () => dom("div", { children: "Hello, Forest!" })); // start in target elementor
createForest(() => dom("div", { children: "Hello, Forest!" })); // replace all htmltree()
Creates a single DOM element without attributes.
const div = tree("div"); // create div element examplecreateStore()
Creates a reactive store for state management.
const counter = createStore(0);
counter.subscribe(() => console.log(counter.get())); // action when counter change
counter.set((last) => last + 5); // count changeš Template Project
Default template is based on pure JavaScript, using Vite. The project structure follows the Feature-Sliced Design (FSD) architecture methodology:
Feature-Sliced Design Official Documentation
src/
āāā main.ts # Application Entry Point
āāā app/
ā āāā global.css
āāā entities/
ā āāā exampeCode/
ā ā āāā ui/
ā ā āāā CodeCard/
ā ā ā āāā index.ts
ā ā āāā CountButton/
ā ā āāā index.ts
ā āāā layout/
ā āāā ui/
ā āāā BackgroundImage/
ā ā āāā index.ts
ā āāā Header.ts/
ā āāā index.ts
āāā pages/
ā āāā 404/
ā ā āāā index.ts
ā āāā about/
ā ā āāā index.ts
ā āāā home/
ā āāā index.ts
āāā shared/
āāā constant/
ā āāā index.ts
ā āāā text-contents.ts
āāā lib/
ā āāā router/
ā āāā index.ts
āāā ui/
āāā Button.ts
āāā Card.ts
āāā LinkButton.ts
āāā OuterLink.tsš Philosophy
forest-js is not a framework ā
it's a small set of rules to control the real DOM in a structured way.
- Declarative thinking without hiding the DOM
- Tiny enough to debug by reading the source
- Encourages learning and composable UI patterns
š License
MIT Ā© lurain grangbelr