React version: 18.2.0 ## Reproduction ```ts import { lazy, useState, useInsertionEffect, Suspense } from "react"; export default function App() { const [show, setShow] = useState(false); return ( <div> <Suspense>{show ? <LazyComp2 /> : <LazyComp1 />}</Suspense> <button onClick={() => setShow((s) => !s)}>Toggle</button> </div> ); } const MyComp = () => { useInsertionEffect(() => { console.log("start1"); return () => { console.log("stop1"); }; }, []); }; const MyComp2 = () => { useInsertionEffect(() => { console.log("start2"); return () => { console.log("stop2"); }; }, []); }; const LazyComp1 = lazy(() => Promise.resolve({ default: MyComp })); const LazyComp2 = lazy(() => Promise.resolve({ default: MyComp2 })); ``` Click the button twice. Link to code example: https://codesandbox.io/s/focused-burnell-ewgso1?file=/src/App.js:0-773 ## The current behavior Logs: ``` start1 start2 stop2 start1 ``` ## The expected behavior ``` start1 stop1 start2 stop2 start1 ``` This is also the behavior of `useLayoutEffect` if not in strict mode.