A USB comm port is a relatively easy device to implement. You mainly need a data interface with a bulk IN and a bulk out pipe. That's about enough to make Mac OS or Linux happy. To make Windows happy you also need a communications-control interface, which has an interrupt endpoint which is never used and respond to several Abstract control model requests, ours implements GET_LINE_CODING, SET_LINE_CODING and SET_CONTROL_LINE_STATE. It doesn't have to do anything with these requests, just accept them.
I'm not sure what your getting at by "take care of data loss in UART", as Jan mentioned there is no UART. You have to know what you're going to do if the data you need to send overruns. There is no guarantee that the host will read your endpoint in time. When your internal buffering is full, what happens? Our implementation just drops characters.