Incremental Migration:
React → Svelte 5
A Practical Guide from Production Experience
Scan for slides
A Practical Guide from Production Experience
Scan for slides
🎯 Product Manager at dipp
🛠️ Engineering Lead for the past 2 years
🌟 Contributing to esbuild, vite and Svelte ecosystem since 2021
📦 Authored esbuild-plugin-pino which has 70k weekly downloads on npm
"6 month rewrite"
"Stop all features"
"Big bang release"
"Ship incrementally"
"Measure each step"
"Prove value and gain confidence"
Focus on user-facing metrics, not just technical ones
// 1. Create wrapper hook
export default function useSvelte(Component: Component) {
const svelteRef = useRef(null);
return (props: Props) => {
useLayoutEffect(() => {
mount(Component, {
target: svelteRef.current,
props,
});
}, []);
return ;
};
}
// 2. Use memo() to prevent unnecessary remounts
export default memo(function MyComponent(props) {
const SvelteComponent = useSvelte(Component);
return ;
});
<script lang="ts">
import { onMount } from "svelte";
import { createRoot } from "react-dom/client";
import React from "react";
let { component, ...reactProps } = $props();
let container = $state<HTMLDivElement>();
let root = $state<ReturnType<typeof createRoot>>();
onMount(() => {
if (container) {
root = createRoot(container);
root.render(React.createElement(component, reactProps));
}
return () => root?.unmount();
});
</script>
X: @davipon
🦋 Bluesky: davipon.bsky.social
Scan for code examples & documentation
Let's discuss your migration challenges
Remember: Technology migrations don't have to be all-or-nothing