Przejście z dat.GUI do lil-gui

Jeśli masz istniejący projekt wykorzystujący dat.GUI, migracja do lil-gui jest bardzo łatwa. Biblioteka została zaprojektowana jako niemal bezpośredni zamiennik, dlatego w większości przypadków wystarczy zmienić import.

Dlaczego warto przejść na lil-gui?

  • dat.GUI nie jest już aktywnie rozwijane i wspierane,
  • lil-gui jest lżejsze, nowocześniejsze i używane w oficjalnych przykładach Three.js,
  • API jest niemal identyczne,
  • lil-gui ma lepsze wsparcie TypeScript.

Krok 1 - Instalacja biblioteki

Jeśli używasz npm:
npm uninstall dat.gui
npm install lil-gui

Krok 2 - Zmiana importu

dat.GUI
import { GUI } from 'dat.gui';

const gui = new GUI();
lil-gui
import GUI from 'lil-gui';

const gui = new GUI();
To najważniejsza zmiana.

Krok 3 - Podstawowe kontrolki

Kod praktycznie się nie zmienia. dat.GUI
const params = {
    speed:,
    visible: true
};

gui.add(params, 'speed', 0,0);
gui.add(params, 'visible');
lil-gui
const params = {
    speed:,
    visible: true
};

gui.add(params, 'speed', 0,0);
gui.add(params, 'visible');

Krok 4 - Kolory

dat.GUI
gui.addColor(params, 'color');
lil-gui
gui.addColor(params, 'color');
Tak samo jak wcześniej.

Krok 5 - Foldery

dat.GUI
const folder = gui.addFolder('Transform');

folder.add(mesh.position, 'x', -10,0);
folder.add(mesh.position, 'y', -10,0);

folder.open();
lil-gui
const folder = gui.addFolder('Transform');

folder.add(mesh.position, 'x', -10,0);
folder.add(mesh.position, 'y', -10,0);
W lil-gui foldery są domyślnie otwarte. Jeśli chcesz zamknięty folder:
folder.close();

Krok 6 - onChange()

Bez zmian.
gui.add(params, 'speed', 0,0)
   .onChange(value => {
       console.log(value);
   });

Krok 7 - Nazwy kontrolek

Bez zmian.
gui.add(params, 'speed')
   .name('Prędkość');

Krok 8 - Niszczenie GUI

W lil-gui zalecane jest używanie:
gui.destroy();
Przykład:
window.addEventListener('beforeunload', () => {
    gui.destroy();
});

Najczęstsze problemy przy migracji

gui.__controllers

dat.GUI
gui.__controllers
lil-gui
gui.controllers

gui.__folders

dat.GUI
gui.__folders
lil-gui
gui.folders
Dodatkowo:
  • dat.GUI zwracało obiekt (mapę)
  • lil-gui zwraca tablicę

remove()

dat.GUI
gui.remove(controller);
lil-gui
controller.destroy();

removeFolder()

dat.GUI
gui.removeFolder(folder);
lil-gui
folder.destroy();

Przykład Three.js

import * as THREE from 'three';
import GUI from 'lil-gui';

const scene = new THREE.Scene();

const cube = new THREE.Mesh(
    new THREE.BoxGeometry(),
    new THREE.MeshNormalMaterial()
);

scene.add(cube);

const gui = new GUI();

const params = {
    rotationSpeed: 0.01,
    wireframe: false
};

gui.add(params, 'rotationSpeed', 0, 0.1, 0.001)
   .name('Rotation');

gui.add(params, 'wireframe')
   .onChange(value => {
       cube.material.wireframe = value;
   });

function animate() {
    requestAnimationFrame(animate);

    cube.rotation.x += params.rotationSpeed;
    cube.rotation.y += params.rotationSpeed;

    renderer.render(scene, camera);
}

animate();
W większości projektów migracja wygląda następująco:
  1. Usuń dat.gui
  2. Zainstaluj lil-gui
  3. Zmień:
import { GUI } from 'dat.gui';
na
import GUI from 'lil-gui';
W około 95% przypadków kod będzie działał bez dalszych zmian. Problemy pojawiają się głównie wtedy, gdy korzystasz z wewnętrznych pól typu __controllers, __folders lub manipulujesz DOM generowanym przez GUI.