3.7 KiB
🔌 Application Mounter: $.mount( )
The $.mount function is the entry point of your reactive world. It bridges the gap between your SigPro logic and the browser's Real DOM by injecting a component into the document.
1. Function Signature
$.mount(node: Function | HTMLElement, target?: string | HTMLElement): RuntimeObject
| Parameter | Type | Default | Description |
|---|---|---|---|
node |
Function or Node |
Required | The component function or DOM element to render. |
target |
string or Node |
document.body |
CSS selector or DOM element where the app will live. |
Returns: A Runtime object containing the container and a destroy() method.
2. Common Usage Scenarios
A. The "Clean Slate" (SPA Entry)
In a modern Single Page Application, you typically want SigPro to manage the entire view. By default, if no target is provided, it mounts to document.body.
import { $ } from './sigpro.js';
import App from './App.js';
// Mounts your main App component directly to the body
$.mount(App);
B. Targeting a Specific Container
If your HTML has a predefined structure, you can tell SigPro exactly where to render by passing a CSS selector or a direct reference.
<div id="sidebar"></div>
<main id="app-root"></main>
// Mount using a CSS selector
$.mount(MyComponent, '#app-root');
// Mount using a direct DOM reference
const sidebar = document.querySelector('#sidebar');
$.mount(SidebarComponent, sidebar);
C. Creating "Reactive Islands"
SigPro is excellent for "sprinkling" reactivity onto legacy or static pages. You can inject small reactive widgets into any part of an existing HTML layout.
// A small reactive widget
const CounterWidget = () => {
const count = $(0);
return Button({ onclick: () => count(c => c + 1) }, [
"Clicks: ", count
]);
};
// Mount it into a specific div in your static HTML
$.mount(CounterWidget, '#counter-container');
3. How it Works (Lifecycle)
When $.mount is executed, it performs these critical steps:
- Resolution & Wrapping: If you pass a Function, SigPro wraps it in a
$.view(). This starts tracking all internal signals and effects. - Target Clearance: It uses
target.replaceChildren(). This efficiently wipes any existing HTML or "zombie" nodes inside the target before mounting. - Injection: The component's container is appended to the target.
- Memory Management: It stores the
Runtimeinstance associated with that DOM element. If you call$.mountagain on the same target, SigPro automatically destroys the previous app to prevent memory leaks.
4. Global vs. Local Scope
The "Framework" Way (Global)
By importing your core in your entry file, SigPro automatically initializes global Tag Constructors (Div, Span, H1, etc.). This allows for a clean, declarative DX across your entire project.
// main.js
import './sigpro.js';
// Now any file can simply do:
$.mount(() => H1("Global SigPro App"));
The "Library" Way (Local)
If you prefer to avoid global variables, you can use the low-level $.html factory to create elements locally.
import { $ } from './sigpro.js';
const myNode = $.html('div', { class: 'widget' }, 'Local Instance');
$.mount(myNode, '#widget-target');
5. Summary Cheat Sheet
| Goal | Code Pattern |
|---|---|
| Mount to body | $.mount(App) |
| Mount to ID | $.mount(App, '#root') |
| Mount to Element | $.mount(App, myElement) |
| Mount raw Node | $.mount(Div("Hello"), '#id') |
| Unmount/Destroy | const app = $.mount(App); app.destroy(); |