mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
ui: monaco: lazy load resources
This commit is contained in:
1 parent
538862de07
commit
f020923d35
8 files changed
+57
-26
No files matched your search
@@ -36,7 +36,8 @@ export default class Editor extends DOMAttachedObject {
|
||||
}
|
||||
|
||||
async initMonaco() {
|
||||
const { default: monaco, registerAction } = await import('vj/components/monaco/index');
|
||||
const { load } = await import('vj/components/monaco/loader');
|
||||
const { monaco, registerAction } = await load(['markdown']);
|
||||
const {
|
||||
onChange, language = 'markdown',
|
||||
theme = UserContext.monacoTheme || 'vs-light',
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
|
||||
import loadFormatter from 'vj/components/wastyle/index';
|
||||
import Notification from 'vj/components/notification';
|
||||
import './languages/markdown';
|
||||
import './languages/typescript';
|
||||
import './languages/yaml';
|
||||
import './monaco.css';
|
||||
|
||||
export default monaco;
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
let loaded;
|
||||
const loaders = {
|
||||
i18n: async () => {
|
||||
const { setLocaleData } = await import('vj/components/monaco/nls');
|
||||
let resource;
|
||||
const lang = UserContext.viewLang;
|
||||
if (lang === 'zh') {
|
||||
resource = await import('monaco-editor-nls/locale/zh-hans.json');
|
||||
} else if (lang === 'zh_TW') {
|
||||
resource = await import('monaco-editor-nls/locale/zh-hant.json');
|
||||
} else if (lang === 'ko') {
|
||||
resource = await import('monaco-editor-nls/locale/ko.json');
|
||||
}
|
||||
if (resource) setLocaleData(resource);
|
||||
},
|
||||
markdown: () => import('./languages/markdown'),
|
||||
typescript: () => import('./languages/typescript'),
|
||||
yaml: () => import('./languages/yaml'),
|
||||
};
|
||||
|
||||
export async function load(features = ['markdown']) {
|
||||
let s = Date.now();
|
||||
if (!loaded) {
|
||||
await loaders.i18n();
|
||||
console.log('Loading monaco editor');
|
||||
}
|
||||
const res = await import('./index');
|
||||
if (!loaded) {
|
||||
console.log('Loaded monaco editor in ', Date.now() - s, 'ms');
|
||||
loaded = [];
|
||||
}
|
||||
for (const feat of features) {
|
||||
if (loaded.includes(feat)) continue;
|
||||
if (!loaders[feat]) {
|
||||
console.error('Unknown monaco feature:', feat);
|
||||
continue;
|
||||
}
|
||||
s = Date.now();
|
||||
console.log('Loading monaco feature:', feat);
|
||||
await loaders[feat]();
|
||||
console.log('Loaded monaco feature:', feat, 'in', Date.now() - s, 'ms');
|
||||
loaded.push(feat);
|
||||
}
|
||||
return { monaco: res.default, registerAction: res.registerAction };
|
||||
}
|
||||
export default load;
|
||||
@@ -18,10 +18,9 @@ export default function DataInputComponent(props) {
|
||||
className="scratchpad__data-input"
|
||||
style={{ overflowY: 'scroll' }}
|
||||
wrap="off"
|
||||
contentEditable
|
||||
>
|
||||
{/* eslint-disable-next-line react/no-danger */}
|
||||
<pre dangerouslySetInnerHTML={{ __html: value }} />
|
||||
<pre dangerouslySetInnerHTML={{ __html: value }} contentEditable />
|
||||
</div>
|
||||
) : (
|
||||
<textarea
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import monaco, { registerAction } from 'vj/components/monaco/index';
|
||||
|
||||
const mapStateToProps = (state) => ({
|
||||
value: state.editor.code,
|
||||
@@ -22,9 +21,12 @@ const mapDispatchToProps = (dispatch) => ({
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(class MonacoEditor extends React.PureComponent {
|
||||
disposable = [];
|
||||
|
||||
componentDidMount() {
|
||||
async componentDidMount() {
|
||||
const value = this.props.value || '';
|
||||
const { language, theme } = this.props;
|
||||
const { load } = await import('vj/components/monaco/loader');
|
||||
console.log(load);
|
||||
const { monaco, registerAction } = await load([language]);
|
||||
this.model = monaco.editor.createModel(value, language, monaco.Uri.parse('file://model'));
|
||||
if (this.containerElement) {
|
||||
/** @type {monaco.editor.IStandaloneEditorConstructionOptions} */
|
||||
@@ -53,7 +55,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(class MonacoEditor e
|
||||
}
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps) {
|
||||
async componentDidUpdate(prevProps) {
|
||||
const {
|
||||
value, language, theme, mainSize, recordSize, pretestSize,
|
||||
} = this.props;
|
||||
@@ -73,6 +75,8 @@ export default connect(mapStateToProps, mapDispatchToProps)(class MonacoEditor e
|
||||
editor.pushUndoStop();
|
||||
this.__prevent_trigger_change_event = false;
|
||||
}
|
||||
const { load } = await import('vj/components/monaco/loader');
|
||||
const { monaco } = await load([language]);
|
||||
if (prevProps.language !== language) {
|
||||
monaco.editor.setModelLanguage(model, language);
|
||||
editor.updateOptions({ mode: language });
|
||||
|
||||
Reference in new issue
Block a user