IMO, rotary encoder is hard to handle.
First, it can't be processed in polling mode, unless the system runs nearly nothing.
Second, the debounce capacitors are needed, but even with the debounce capacitors, it doesn't feel like silk smooth.
The solo advantage I know is that only one small opening is needed.
I've supported the rotary encoder by IO expander, but I would rather use the web interface, which is easy and simple.
That's not strictly true. Debouncing capacitors are not needed as the output of the encoder is a Gray code, where only one bit changes at a time. So a bounce will move you between two valid states, eventually settling on the new state. Also, the software can be polled or interrupt-driven. Polling with a rate of a few milliseconds is fine (my code sleeps 1ms between polling).
My rotary encoder has about 12 or 16 physical clicks per revolution, but each click cycles through all four Gray codes. So I track the codes to get direction and an 'internal' count, then I divide the internal count by four for the reported count.