1
0
mirror of https://github.com/jaandrle/deka-dom-el synced 2025-07-29 07:00:16 +02:00

🔤 T now uses DocumentFragment

This commit is contained in:
2025-03-13 12:58:38 +01:00
parent 25d475ec04
commit 0a2d17ac6f
14 changed files with 330 additions and 328 deletions

View File

@@ -17,19 +17,19 @@ const fileURL= url=> new URL(url, import.meta.url);
export function page({ pkg, info }){
const page_id= info.id;
return el(simplePage, { info, pkg }).append(
el("p").append(...T`
el("p").append(T`
Debugging is an essential part of application development. This guide provides techniques
and best practices for debugging applications built with dd<el>, with a focus on signals.
`),
el(h3, t`Debugging signals`),
el("p").append(...T`
el("p").append(T`
Signals are reactive primitives that update the UI when their values change. When debugging signals,
you need to track their values, understand their dependencies, and identify why updates are or aren't happening.
`),
el("h4", t`Inspecting signal values`),
el("p").append(...T`
el("p").append(T`
The simplest way to debug a signal is to log its current value by calling the get method:
`),
el(code, { content: `
@@ -38,7 +38,7 @@ export function page({ pkg, info }){
// without triggering updates
console.log('Current value:', signal.valueOf());
`, page_id }),
el("p").append(...T`
el("p").append(T`
You can also monitor signal changes by adding a listener:
`),
el(code, { content: `
@@ -47,7 +47,7 @@ export function page({ pkg, info }){
`, page_id }),
el("h4", t`Debugging derived signals`),
el("p").append(...T`
el("p").append(T`
With derived signals (created with ${el("code", "S(() => computation))")}), debugging is a bit more complex
because the value depends on other signals. To understand why a derived signal isnt updating correctly:
`),
@@ -69,7 +69,7 @@ export function page({ pkg, info }){
el(code, { src: fileURL("./components/examples/debugging/mutations.js"), page_id }),
el("h4", t`Memory leaks with signal listeners`),
el("p").append(...T`
el("p").append(T`
Signal listeners can cause memory leaks if not properly cleaned up. Always use AbortSignal
to cancel listeners.
`),
@@ -84,12 +84,12 @@ export function page({ pkg, info }){
el(code, { src: fileURL("./components/examples/debugging/debouncing.js"), page_id }),
el(h3, t`Browser DevTools tips for dd<el>`),
el("p").append(...T`
el("p").append(T`
When debugging in the browser, dd<el> provides several helpful DevTools-friendly features:
`),
el("h4", t`Identifying components in the DOM`),
el("p").append(...T`
el("p").append(T`
dd<el> marks components in the DOM with special comment nodes to help you identify component boundaries.
Components created with ${el("code", "el(ComponentFunction)")} are marked with comment nodes
${el("code", `<!--<dde:mark type="component" name="MyComponent" host="parentElement"/>-->`)} and
@@ -102,23 +102,23 @@ export function page({ pkg, info }){
),
el("h4", t`Finding reactive elements in the DOM`),
el("p").append(...T`
el("p").append(T`
When using ${el("code", "S.el()")}, dd<el> creates reactive elements in the DOM
that are automatically updated when signal values change. These elements are wrapped in special
comment nodes for debugging (to be true they are also used internally, so please do not edit them by hand):
`),
el(code, { src: fileURL("./components/examples/debugging/dom-reactive-mark.html"), page_id }),
el("p").append(...T`
el("p").append(T`
This is particularly useful when debugging why a reactive section isnt updating as expected.
You can inspect the elements between the comment nodes to see their current state and the
signal connections through \`__dde_reactive\` of the host element.
`),
el("h4", t`DOM inspection properties`),
el("p").append(...T`
el("p").append(T`
Elements created with the dd<el> library have special properties to aid in debugging:
`),
el("p").append(...T`
el("p").append(T`
${el("code", "<element>.__dde_reactive")} - An array property on DOM elements that tracks signal-to-element
relationships. This allows you to quickly identify which elements are reactive and what signals theyre
bound to. Each entry in the array contains:
@@ -128,14 +128,14 @@ export function page({ pkg, info }){
el("li", t`Additional context information about the element or attribute`),
el("li", t`Automatically managed by signal.el(), signal.observedAttributes(), and processReactiveAttribute()`)
),
el("p").append(...T`
el("p").append(T`
These properties make it easier to understand the reactive structure of your application when inspecting
elements.
`),
el(example, { src: fileURL("./components/examples/signals/debugging-dom.js"), page_id }),
el("h4", t`Examining signal connections`),
el("p").append(...T`
el("p").append(T`
${el("code", "<signal>.__dde_signal")} - A Symbol property used to identify and store the internal state of
signal objects. It contains the following information:
`),
@@ -147,10 +147,10 @@ export function page({ pkg, info }){
el("li", t`defined: Stack trace information for debugging`),
el("li", t`readonly: Boolean flag indicating if the signal is read-only`)
),
el("p").append(...T`
el("p").append(T`
…to determine the current value of the signal, call ${el("code", "signal.valueOf()")}.
`),
el("p").append(...T`
el("p").append(T`
You can inspect (host) element relationships and bindings with signals in the DevTools console using
${el("code", "$0.__dde_reactive")} (for currently selected element). In the console you will see a list of
${el("code", `[ [ signal, listener ], element, property ]`)}, where:
@@ -161,26 +161,26 @@ export function page({ pkg, info }){
el("li", t`element — the DOM element that is bound to the signal`),
el("li", t`property — the attribute or property name which is changing based on the signal`),
),
el("p").append(...T`
el("p").append(T`
…the structure of \`__dde_reactive\` utilizes the browsers behavior of packing the first field,
so you can see the element and property that changes in the console right away.
`),
el("h4", t`Debugging with breakpoints`),
el("p").append(...T`
el("p").append(T`
Effective use of breakpoints can help track signal flow:
`),
el("ul").append(
el("li").append(...T`
el("li").append(T`
Set breakpoints in signal update methods to track when values change
`),
el("li").append(...T`
el("li").append(T`
Use conditional breakpoints to only break when specific signals change to certain values
`),
el("li").append(...T`
el("li").append(T`
Set breakpoints in your signal computation functions to see when derived signals recalculate
`),
el("li").append(...T`
el("li").append(T`
Use performance profiling to identify bottlenecks in signal updates
`)
),