The declarative layer is an extremely thin abstraction. A-Frame has feature parity with three.js given its extensibility and entity-component pattern. I'd give it a deeper look.