Speed up editor by lazily loading CodeMirror - Second try (#1776)

* Revert "Revert "Speed up editor by lazily loading CodeMirror (#1766)""

This reverts commit b0a2884f19.

* Pass in options via action update + Make access to editor optional
This commit is contained in:
Henrik Giesel 2022-04-09 05:25:54 +02:00 committed by GitHub
parent 4a6767b1fc
commit f3f5a42218
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 12 deletions

View file

@ -30,6 +30,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
export let configuration: CodeMirrorLib.EditorConfiguration; export let configuration: CodeMirrorLib.EditorConfiguration;
export let code: Writable<string>; export let code: Writable<string>;
export let hidden = false;
const defaultConfiguration = { const defaultConfiguration = {
rtlMoveVisually: true, rtlMoveVisually: true,
@ -50,9 +51,6 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
const direction = getContext<Writable<"ltr" | "rtl">>(directionKey); const direction = getContext<Writable<"ltr" | "rtl">>(directionKey);
$: setOption("direction", $direction);
$: setOption("theme", $pageTheme.isDark ? darkTheme : lightTheme);
let apiPartial: Partial<CodeMirrorAPI>; let apiPartial: Partial<CodeMirrorAPI>;
export { apiPartial as api }; export { apiPartial as api };
@ -77,8 +75,14 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
tabindex="-1" tabindex="-1"
hidden hidden
use:openCodeMirror={{ use:openCodeMirror={{
configuration: { ...configuration, ...defaultConfiguration }, configuration: {
...configuration,
...defaultConfiguration,
direction: $direction,
theme: $pageTheme.isDark ? darkTheme : lightTheme,
},
resolve, resolve,
hidden,
}} }}
/> />
</div> </div>

View file

@ -63,26 +63,40 @@ export function focusAndSetCaret(
interface OpenCodeMirrorOptions { interface OpenCodeMirrorOptions {
configuration: CodeMirror.EditorConfiguration; configuration: CodeMirror.EditorConfiguration;
resolve(editor: CodeMirror.EditorFromTextArea): void; resolve(editor: CodeMirror.EditorFromTextArea): void;
hidden: boolean;
} }
export function openCodeMirror( export function openCodeMirror(
textarea: HTMLTextAreaElement, textarea: HTMLTextAreaElement,
{ configuration, resolve }: Partial<OpenCodeMirrorOptions>, options: Partial<OpenCodeMirrorOptions>,
): { update: (options: Partial<OpenCodeMirrorOptions>) => void; destroy: () => void } { ): { update: (options: Partial<OpenCodeMirrorOptions>) => void; destroy: () => void } {
const editor = CodeMirror.fromTextArea(textarea, configuration); let editor: CodeMirror.EditorFromTextArea | null = null;
resolve?.(editor);
return { function update({
update({ configuration }: Partial<OpenCodeMirrorOptions>): void { configuration,
resolve,
hidden,
}: Partial<OpenCodeMirrorOptions>): void {
if (editor) {
for (const key in configuration) { for (const key in configuration) {
editor.setOption( editor.setOption(
key as keyof CodeMirror.EditorConfiguration, key as keyof CodeMirror.EditorConfiguration,
configuration[key], configuration[key],
); );
} }
}, } else if (!hidden) {
editor = CodeMirror.fromTextArea(textarea, configuration);
resolve?.(editor);
}
}
update(options);
return {
update,
destroy(): void { destroy(): void {
editor.toTextArea(); editor?.toTextArea();
editor = null;
}, },
}; };
} }

View file

@ -136,7 +136,13 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
class:hidden class:hidden
on:focusin={() => ($focusedInput = api)} on:focusin={() => ($focusedInput = api)}
> >
<CodeMirror {configuration} {code} bind:api={codeMirror} on:change={onChange} /> <CodeMirror
{configuration}
{code}
{hidden}
bind:api={codeMirror}
on:change={onChange}
/>
</div> </div>
<style lang="scss"> <style lang="scss">