Editor Availability by Framework

EditorReactSvelteNotes
ProseMirrorWrappersDirect useFramework-agnostic core. Works everywhere.
TiptapOfficialCommunityReact gets more attention. Svelte works but less polished.
CodeMirror 6WrappersDirect useFramework-agnostic. Easy to wrap in either framework.
LexicalOfficialNo supportReact-only by design. DecoratorNodes use React components.
SlateRequiredNo supportDeeply coupled to React. Rendering IS React.
PlateRequiredNo supportBuilt on Slate. Inherits React dependency.
BlockNoteRequiredNo supportReact-only Notion-like editor.
MilkdownOfficialOfficialFramework adapters for both. Equal support.
Editor.jsWrappersDirect useVanilla JS. Works anywhere.
QuillWrappersWrappersFramework-agnostic core.

Bundle Size

SvelteKit (empty)
~25KB
React + ReactDOM
~45KB
+ CodeMirror 6
~150KB
+ Tiptap
~250KB
+ Monaco
~2-4MB

Approximate gzipped bundle sizes

Developer Experience

React

  • Largest ecosystem of editor components
  • Most examples and tutorials target React
  • Hooks-based integration (useEditor, etc.)
  • Virtual DOM can conflict with editor DOM management
  • Need to be careful about re-renders
  • Mature but verbose component model

SvelteKit

  • Fewer ready-made editor wrappers
  • Direct DOM access via actions/onMount — cleaner integration
  • No virtual DOM conflicts
  • Smaller bundle overhead
  • Reactive stores work well with editor state
  • Less boilerplate, more concise

Integration Patterns

tsx
// React: useEditor hook (Tiptap)
import { useEditor, EditorContent } from '@tiptap/react';
import StarterKit from '@tiptap/starter-kit';

function MyEditor() {
  const editor = useEditor({
    extensions: [StarterKit],
    content: '<p>Hello</p>'
  });
  return <EditorContent editor={editor} />;
}
svelte
<!-- Svelte: onMount + bind (Tiptap/CodeMirror/ProseMirror) -->
<script>
  import { onMount } from 'svelte';
  let container;

  onMount(() => {
    // Direct DOM access — no virtual DOM conflicts
    const editor = new Editor({
      element: container,
      extensions: [StarterKit],
      content: '<p>Hello</p>'
    });
    return () => editor.destroy();
  });
</script>

<div bind:this={container}></div>

Verdict

When to choose React

  • You need Lexical, Slate, Plate, or BlockNote (React-only)
  • Your team already uses React
  • You need the largest possible ecosystem of editor components

When to choose SvelteKit

  • You're using framework-agnostic editors (CodeMirror 6, ProseMirror, Editor.js)
  • Bundle size matters
  • You want cleaner DOM integration (no virtual DOM conflicts)
  • You prefer less boilerplate and simpler reactivity
  • Your editor needs are standard (not needing React-specific features)

Our Recommendation

SvelteKit with CodeMirror 6 for markdown editing, and SvelteKit with Tiptap/ProseMirror for rich text. The framework-agnostic editors work beautifully with Svelte's direct DOM model. React-only editors (Lexical, Slate) are excellent but not worth switching frameworks for.