I have a framework-agnostic document viewer package. It works by mounting into a DOM element: import { UDocClient } from "@docmentis/udoc-viewer"; const client = await UDocClient.create(); const viewer = await client.createViewer({ container: "#viewer", }); await viewer.load("/path/to/document.pdf"); In React, it’s pretty straightforward to use with a ref/effect: import { useEffect, useRef } from "react"; import { UDocClient } from "@docmentis/udoc-viewer"; function DocumentViewer({ src }) { const containerRef = useRef(null); useEffect(() => { let client; let viewer; async function init() { client = await UDocClient.create(); viewer = await client.createViewer({ container: containerRef.current, }); await viewer.load(src); } init(); return () => { viewer?.destroy(); client?.destroy(); }; }, [src]); return ; } This works fine, and I like keeping the package framework-agnostic. But I’m not sure what React developers expect these days.…