mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
ui: external module support
This commit is contained in:
1 parent
f020923d35
commit
86ead663df
8 files changed
+29
-11
No files matched your search
@@ -42,6 +42,7 @@ module.exports = {
|
|||||||
__webpack_require__: true,
|
__webpack_require__: true,
|
||||||
UiContext: true,
|
UiContext: true,
|
||||||
UserContext: true,
|
UserContext: true,
|
||||||
|
externalModules: true,
|
||||||
LOCALES: true,
|
LOCALES: true,
|
||||||
window: true,
|
window: true,
|
||||||
JQuery: true,
|
JQuery: true,
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import loadExternalModule from 'vj/utils/loadModule';
|
||||||
|
|
||||||
let loaded;
|
let loaded;
|
||||||
const loaders = {
|
const loaders = {
|
||||||
i18n: async () => {
|
i18n: async () => {
|
||||||
@@ -16,6 +18,11 @@ const loaders = {
|
|||||||
markdown: () => import('./languages/markdown'),
|
markdown: () => import('./languages/markdown'),
|
||||||
typescript: () => import('./languages/typescript'),
|
typescript: () => import('./languages/typescript'),
|
||||||
yaml: () => import('./languages/yaml'),
|
yaml: () => import('./languages/yaml'),
|
||||||
|
external: async (monaco, feat) => {
|
||||||
|
let apply = await loadExternalModule(window.externalModules[`monaco-${feat}`]);
|
||||||
|
if (typeof apply !== 'function') apply = apply.default || apply.apply;
|
||||||
|
if (typeof apply === 'function') await apply(monaco);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export async function load(features = ['markdown']) {
|
export async function load(features = ['markdown']) {
|
||||||
@@ -26,18 +33,19 @@ export async function load(features = ['markdown']) {
|
|||||||
}
|
}
|
||||||
const res = await import('./index');
|
const res = await import('./index');
|
||||||
if (!loaded) {
|
if (!loaded) {
|
||||||
console.log('Loaded monaco editor in ', Date.now() - s, 'ms');
|
console.log('Loaded monaco editor in', Date.now() - s, 'ms');
|
||||||
loaded = [];
|
loaded = [];
|
||||||
}
|
}
|
||||||
for (const feat of features) {
|
for (const feat of features) {
|
||||||
if (loaded.includes(feat)) continue;
|
if (loaded.includes(feat)) continue;
|
||||||
if (!loaders[feat]) {
|
if (!loaders[feat] && !window.externalModules[`monaco-${feat}`]) {
|
||||||
console.error('Unknown monaco feature:', feat);
|
console.error('Unknown monaco feature:', feat);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
s = Date.now();
|
s = Date.now();
|
||||||
console.log('Loading monaco feature:', feat);
|
console.log('Loading monaco feature:', feat);
|
||||||
await loaders[feat]();
|
if (loaders[feat]) await loaders[feat]();
|
||||||
|
else await loaders.external(res.default, feat);
|
||||||
console.log('Loaded monaco feature:', feat, 'in', Date.now() - s, 'ms');
|
console.log('Loaded monaco feature:', feat, 'in', Date.now() - s, 'ms');
|
||||||
loaded.push(feat);
|
loaded.push(feat);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,7 +79,6 @@ function handleNavbar() {
|
|||||||
if (!$(navItems[navItem]).children('a').hasClass('nav--active')) {
|
if (!$(navItems[navItem]).children('a').hasClass('nav--active')) {
|
||||||
$(navItems[navItem]).removeClass('nav__list-item').addClass('menu__item');
|
$(navItems[navItem]).removeClass('nav__list-item').addClass('menu__item');
|
||||||
$(navItems[navItem]).children('a').removeClass('nav__item').addClass('menu__link');
|
$(navItems[navItem]).children('a').removeClass('nav__item').addClass('menu__link');
|
||||||
console.log('hide', navItems[navItem]);
|
|
||||||
$(menu).prepend($(navItems[navItem]));
|
$(menu).prepend($(navItems[navItem]));
|
||||||
}
|
}
|
||||||
navItem--;
|
navItem--;
|
||||||
@@ -91,7 +90,6 @@ function handleNavbar() {
|
|||||||
const ele = menu.children(0);
|
const ele = menu.children(0);
|
||||||
$(ele).addClass('nav__list-item').removeClass('menu__item');
|
$(ele).addClass('nav__list-item').removeClass('menu__item');
|
||||||
$(ele).children('a').addClass('nav__item').removeClass('menu__link');
|
$(ele).children('a').addClass('nav__item').removeClass('menu__link');
|
||||||
console.log('show', ele);
|
|
||||||
ele.insertBefore(trigger);
|
ele.insertBefore(trigger);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -103,7 +101,6 @@ function handleNavbar() {
|
|||||||
if (!$(navItems[navItem]).children('a').hasClass('nav--active')) {
|
if (!$(navItems[navItem]).children('a').hasClass('nav--active')) {
|
||||||
$(navItems[navItem]).removeClass('nav__list-item').addClass('menu__item');
|
$(navItems[navItem]).removeClass('nav__list-item').addClass('menu__item');
|
||||||
$(navItems[navItem]).children('a').removeClass('nav__item').addClass('menu__link');
|
$(navItems[navItem]).children('a').removeClass('nav__item').addClass('menu__link');
|
||||||
console.log('hide', navItems[navItem]);
|
|
||||||
$(menu).prepend($(navItems[navItem]));
|
$(menu).prepend($(navItems[navItem]));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -111,7 +108,6 @@ function handleNavbar() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('children', menu.children());
|
|
||||||
if (!menu.children().length) trigger.hide();
|
if (!menu.children().length) trigger.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,9 +25,8 @@ export default connect(mapStateToProps, mapDispatchToProps)(class MonacoEditor e
|
|||||||
const value = this.props.value || '';
|
const value = this.props.value || '';
|
||||||
const { language, theme } = this.props;
|
const { language, theme } = this.props;
|
||||||
const { load } = await import('vj/components/monaco/loader');
|
const { load } = await import('vj/components/monaco/loader');
|
||||||
console.log(load);
|
|
||||||
const { monaco, registerAction } = await load([language]);
|
const { monaco, registerAction } = await load([language]);
|
||||||
this.model = monaco.editor.createModel(value, language, monaco.Uri.parse('file://model'));
|
this.model = monaco.editor.createModel(value, language, monaco.Uri.parse(`file:///${UiContext.pdoc.pid || UiContext.pdoc.docId}.${language}`));
|
||||||
if (this.containerElement) {
|
if (this.containerElement) {
|
||||||
/** @type {monaco.editor.IStandaloneEditorConstructionOptions} */
|
/** @type {monaco.editor.IStandaloneEditorConstructionOptions} */
|
||||||
const config = {
|
const config = {
|
||||||
@@ -108,7 +107,9 @@ export default connect(mapStateToProps, mapDispatchToProps)(class MonacoEditor e
|
|||||||
width: '100%',
|
width: '100%',
|
||||||
}}
|
}}
|
||||||
className="ScratchpadMonacoEditor"
|
className="ScratchpadMonacoEditor"
|
||||||
/>
|
>
|
||||||
|
<div className="loader-container"><div className="loader"></div></div>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -5,6 +5,7 @@ window.Hydro = {
|
|||||||
utils: {},
|
utils: {},
|
||||||
node_modules: {},
|
node_modules: {},
|
||||||
};
|
};
|
||||||
|
window.externalModules = {};
|
||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
'%c%s%c%s',
|
'%c%s%c%s',
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ declare global {
|
|||||||
Hydro: any;
|
Hydro: any;
|
||||||
// eslint-disable-next-line camelcase
|
// eslint-disable-next-line camelcase
|
||||||
node_modules: any;
|
node_modules: any;
|
||||||
|
externalModules: Record<string, string>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@hydrooj/ui-default",
|
"name": "@hydrooj/ui-default",
|
||||||
"version": "4.29.0",
|
"version": "4.29.1",
|
||||||
"author": "undefined <i@undefined.moe>",
|
"author": "undefined <i@undefined.moe>",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"main": "hydro.js",
|
"main": "hydro.js",
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
export default async function loadExternalModule(target: string) {
|
||||||
|
const ele = document.createElement('script');
|
||||||
|
ele.src = target;
|
||||||
|
await new Promise((resolve, reject) => {
|
||||||
|
ele.onload = resolve;
|
||||||
|
ele.onerror = reject;
|
||||||
|
document.head.appendChild(ele);
|
||||||
|
});
|
||||||
|
return window.exports;
|
||||||
|
}
|
||||||
Reference in new issue
Block a user