Lieues diatoméennes

Nodoj

Ce document s’adresse principalement aux personnes qui programment en JavaScript, que ce soit pour des projets web ou des applications à interface graphique rendue par un navigateur web.

Nodoj est une bibliothèque JavaScript légère conçue pour simplifier la manipulation du DOM. Le DOM est l’interface programmée qui permet de manipuler le HTML (le code utilisé pour afficher les pages sur Internet). Avec Nodoj, on peut facilement créer, modifier et supprimer des éléments du DOM. Nodoj ne nécessite que quelques minutes d’apprentissage. Toute sa documentation tient sur cette page.

Minifié, Nodoj pèse 1,7 ko et allège considérablement les applications.

Installation

Pour utiliser Nodoj, il suffit d’ajouter nodoj.js au projet et de le lier au HTML : <script src="nodoj.js"></script>.

Utilisation

Méthodes d’insertion dans le DOM

Ces méthodes reçoivent une liste d’objets élément (els) et un nœud DOM de référence (node). Elles insèrent les éléments créés dans le DOM et renvoient les nœuds créés sous forme de tableau.

Méthodes utilitaires

Ces méthodes créent ou récupèrent des nœuds DOM sans insertion directe.

Structure d’un objet élément (els)

Chaque objet dans le tableau els définit un nœud DOM à créer, avec des propriétés optionnelles pour spécifier la balise, le contenu, les attributs, les styles, les événements, les enfants, et des fonctions spéciales.

Démonstration (liste de tâches)

let tasks = [], uid = 0

const bt = (textContent, on_click) => ({
  tag: 'button', textContent, on_click
})

const addTask = txt => {
  const id = uid++
  const liId = `task_${id}`
  const nameId = `${liId}_name`
  tasks.push({id, txt})
  n.end([
    {id: liId, tag: 'li', c: [
      bt('Edit', () => {
        const task = tasks.find(t => t.id === id)
        task.txt = prompt('Modifier la tâche', task.txt)
        n.get(nameId).$edit(task.txt)
      }),
      bt('Supprimer', () => {
        tasks = tasks.filter(t => t.id !== id)
        n.get(liId).remove()
      }),
      {text: ' — '},
      {id: nameId, tag: 'span', $edit: [
        function (name) {this.textContent = name},
        txt
      ]}
    ]}
  ], n.get('todoList'))
}

n.start([
  {id: 'todoList', tag: 'ul'},
  bt('Nouvelle tâche…', () => {
    addTask(prompt('Ajouter une tâche'))
  })
], document.body)

const initTasks = ['Manger 🍭', 'Jouer 🛷', 'Dormir 🧸']
for (const task of initTasks) addTask(task)

Notes sur l’utilisation de els

On peut inclure null dans els pour ignorer conditionnellement un élément.
Si on insére un seul élément, l’envelopper dans un tableau est facultatif.

const show = true
n.start(
  show ? {text: 'Visible'} : null,
  document.body
)

Au‑delà de l’insertion DOM

Nodoj n’est pas un cadre de travail. Il ne gère ni état, ni réactivité, ni composants, ni routage. Il crée et insère simplement des nœuds DOM à partir d’objets déclaratifs. On contrôle entièrement la structure de notre application, en utilisant du JavaScript pur et le DOM réel — sans DOM virtuel ni couches d’abstraction.

Exemple de composant

const Component = node => n.start(
  {tag: 'h2', textContent: 'Bonjour depuis un composant'},
  node
)
Component(document.body)

Exemple de routage

const route = page =>
  n.inner({textContent: page}, document.body)
route('Accueil')

Exemple de gestion d’état

let value = 0
n.start([
  {id: 'count', $update: [
    function () {this.textContent = `${value} clic(s)`},
    value
  ]},
  {tag: 'button', textContent: '+', on_click: () => {
    value ++
    n.get('count').$update()
  }}
], document.body)