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.GUIgui.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.GUIgui.__controllerslil-gui
gui.controllers
gui.__folders
dat.GUIgui.__folderslil-gui
gui.foldersDodatkowo:
- dat.GUI zwracało obiekt (mapę)
- lil-gui zwraca tablicę
remove()
dat.GUIgui.remove(controller);lil-gui
controller.destroy();
removeFolder()
dat.GUIgui.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:
- Usuń dat.gui
- Zainstaluj lil-gui
- 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.