no longer depend on virtual-dom