uiwjs / react-markdown-editor

A markdown editor with preview, implemented with React.js and TypeScript.
https://uiwjs.github.io/react-markdown-editor
MIT License
337 stars 34 forks source link

Editor becomes unresponsive when content is long #200

Open tnhu opened 1 year ago

tnhu commented 1 year ago

Try on https://uiwjs.github.io/react-markdown-editor/ with a very long document (Let's say you duplicate the content until it reaches 1000 lines), the editor becomes slower and slower. If you double or triple the lines, it becomes very unresponsive. Type something and it shows up after some seconds.

I tested the same contents on https://codemirror.net/try/?example=Markdown%20code%20block%20highlighting. It does not have the same problem. I guess the issue stays in this library's implementation.

Note that I tested with Preview OFF, plus under an incognito Chrome window.

jaywcjlove commented 1 year ago

https://github.com/uiwjs/react-markdown-editor/blob/2d3f45079c79616b867ef03681a8ba9799169921/src/index.tsx#L192-L198

@tnhu This is due to the rendering of long text by react-markdown. Use renderPreview to lazily load and display the markdown text.

tnhu commented 1 year ago

@jaywcjlove I pass renderPreview as an empty function. Test locally and the slowness is still there... Also FYI, I use 5.11.1.

jaywcjlove commented 1 year ago

https://codesandbox.io/embed/react-markdown-editor-https-github-com-uiwjs-react-markdown-editor-issues-200-zsdt58?fontsize=14&hidenavigation=1&theme=dark

@tnhu Quick speed boost if you render custom

<MarkdownEditor
  height={300}
  value={markdown}
+  renderPreview={() => <div />}
/>
yusufozturk commented 1 year ago

To improve performance, is it possible to disable renderPreview completely while preview section is not visible? @jaywcjlove

jaywcjlove commented 1 year ago

@yusufozturk

import React from 'react';
import MarkdownEditor from '@uiw/react-markdown-editor';

const mdStr = `# This is a H1  \n## This is a H2  \n###### This is a H6`;

const Dome = () => {
  return (
    <MarkdownEditor
      value={mdStr}
+      renderPreview={() => null}
      onChange={(value, viewUpdate) => {

      }}
    />
  )
};
yusufozturk commented 1 year ago

🤦‍♂️ thanks 😄🙏