From bcb2ae3f85c4972599af6abe1b43a60cc0194ba0 Mon Sep 17 00:00:00 2001 From: Misode Date: Fri, 6 May 2022 18:03:52 +0200 Subject: [PATCH] Code-split brace --- src/app/components/generator/SourcePanel.tsx | 74 ++++++++++++-------- src/brace.d.ts | 2 + tsconfig-eslint.json | 1 + 3 files changed, 47 insertions(+), 30 deletions(-) create mode 100644 src/brace.d.ts diff --git a/src/app/components/generator/SourcePanel.tsx b/src/app/components/generator/SourcePanel.tsx index 5e72a799..87d61eb0 100644 --- a/src/app/components/generator/SourcePanel.tsx +++ b/src/app/components/generator/SourcePanel.tsx @@ -1,7 +1,4 @@ import { DataModel } from '@mcschema/core' -import brace from 'brace' -import 'brace/mode/json' -import 'brace/mode/yaml' import json from 'comment-json' import yaml from 'js-yaml' import { useCallback, useEffect, useRef, useState } from 'preact/hooks' @@ -59,6 +56,7 @@ export function SourcePanel({ name, model, blockStates, doCopy, doDownload, doIm const [indent, setIndent] = useState(Store.getIndent()) const [format, setFormat] = useState(Store.getFormat()) const [highlighting, setHighlighting] = useState(Store.getHighlighting()) + const [braceLoaded, setBraceLoaded] = useState(false) const download = useRef(null) const retransform = useRef() const onImport = useRef<(e: any) => any>() @@ -109,32 +107,46 @@ export function SourcePanel({ name, model, blockStates, doCopy, doDownload, doIm useEffect(() => { if (highlighting) { - const braceEditor = brace.edit('editor') - braceEditor.setOptions({ - fontSize: 14, - showFoldWidgets: false, - highlightSelectedWord: false, - }) - braceEditor.$blockScrolling = Infinity - braceEditor.on('blur', e => onImport.current(e)) - braceEditor.getSession().setMode('ace/mode/json') - + setBraceLoaded(false) editor.current = { - getValue() { - return braceEditor.getSession().getValue() - }, - setValue(value) { - braceEditor.getSession().setValue(value) - }, - configure(indent, format) { - braceEditor.setOption('useSoftTabs', indent !== 'tabs') - braceEditor.setOption('tabSize', indent === 'tabs' ? 4 : INDENT[indent]) - braceEditor.getSession().setMode(`ace/mode/${format}`) - }, - select() { - braceEditor.selectAll() - }, + getValue() { return ''}, + setValue() {}, + configure() {}, + select() {}, } + import('brace').then(async (brace) => { + await Promise.all([ + import('brace/mode/json'), + import('brace/mode/yaml'), + ]) + const braceEditor = brace.edit('editor') + braceEditor.setOptions({ + fontSize: 14, + showFoldWidgets: false, + highlightSelectedWord: false, + }) + braceEditor.$blockScrolling = Infinity + braceEditor.on('blur', e => onImport.current(e)) + braceEditor.getSession().setMode('ace/mode/json') + + editor.current = { + getValue() { + return braceEditor.getSession().getValue() + }, + setValue(value) { + braceEditor.getSession().setValue(value) + }, + configure(indent, format) { + braceEditor.setOption('useSoftTabs', indent !== 'tabs') + braceEditor.setOption('tabSize', indent === 'tabs' ? 4 : INDENT[indent]) + braceEditor.getSession().setMode(`ace/mode/${format}`) + }, + select() { + braceEditor.selectAll() + }, + } + setBraceLoaded(true) + }) } else { editor.current = { getValue() { @@ -157,9 +169,11 @@ export function SourcePanel({ name, model, blockStates, doCopy, doDownload, doIm }, [model]) useEffect(() => { - editor.current.configure(indent, format) - retransform.current() - }, [indent, format, highlighting]) + if (!highlighting || braceLoaded) { + editor.current.configure(indent, format) + retransform.current() + } + }, [indent, format, highlighting, braceLoaded]) useEffect(() => { if (doCopy && model && blockStates) { diff --git a/src/brace.d.ts b/src/brace.d.ts new file mode 100644 index 00000000..15082fb9 --- /dev/null +++ b/src/brace.d.ts @@ -0,0 +1,2 @@ +declare module 'brace/mode/json' +declare module 'brace/mode/yaml' diff --git a/tsconfig-eslint.json b/tsconfig-eslint.json index a727fd41..37f5590e 100644 --- a/tsconfig-eslint.json +++ b/tsconfig-eslint.json @@ -2,6 +2,7 @@ "extends": "./tsconfig.json", "include": [ "./src", + "**/*.d.ts", "./cypress", "vite.config.js" ]