diff --git a/packages/hydrooj/src/loader.ts b/packages/hydrooj/src/loader.ts index b311cdd2d..048af3316 100644 --- a/packages/hydrooj/src/loader.ts +++ b/packages/hydrooj/src/loader.ts @@ -73,7 +73,9 @@ export class Loader { const original = plugin.apply; const apply = (...args) => { const start = Date.now(); - const result = Promise.resolve(original(...args)).catch((e) => logger.error(e)); + const result = Promise.resolve() + .then(() => original(...args)) + .catch((e) => logger.error(e)); Promise.race([ result, new Promise((resolve) => { diff --git a/packages/ui-default/.eslintrc.js b/packages/ui-default/.eslintrc.js index 09749154a..b4b233bb4 100644 --- a/packages/ui-default/.eslintrc.js +++ b/packages/ui-default/.eslintrc.js @@ -60,6 +60,7 @@ module.exports = { '@typescript-eslint/return-await': 'off', '@typescript-eslint/no-shadow': 'warn', 'no-shadow': 'off', + 'guard-for-in': 'off', '@typescript-eslint/quotes': ['warn', 'single', { avoidEscape: true }], // FIXME A bug with eslint-parser diff --git a/packages/ui-default/backendlib/builder.ts b/packages/ui-default/backendlib/builder.ts index 72a5386f7..39ceb0536 100644 --- a/packages/ui-default/backendlib/builder.ts +++ b/packages/ui-default/backendlib/builder.ts @@ -71,6 +71,7 @@ const build = async (contents: string) => { }; export async function buildUI() { + console.log(1, 'building'); const start = Date.now(); let totalSize = 0; const entryPoints: string[] = []; @@ -85,28 +86,33 @@ export async function buildUI() { if (/\.lazy\.[jt]sx?$/.test(target)) lazyModules.push(join(publicPath, target)); } } + function addFile(name: string, content: string) { + vfs[name] = content; + hashes[name] = sha1(content).substring(0, 8); + logger.info('+ %s-%s: %s', name, hashes[name].substring(0, 6), size(content.length)); + newFiles.push(name); + totalSize += content.length; + } for (const m of lazyModules) { const name = basename(m).split('.')[0]; const { outputFiles } = await build(`window.lazyModuleResolver['${name}'](require('${relative(tmp, m)}'))`); for (const file of outputFiles) { - const key = basename(m).replace(/\.[tj]sx?$/, '.js'); - vfs[key] = file.text; - hashes[key] = sha1(file.text).substring(0, 8); - logger.info('+ %s-%s: %s', key.split('.lazy.')[0], hashes[key].substring(0, 6), size(file.text.length)); - newFiles.push(key); - totalSize += file.text.length; + addFile(basename(m).replace(/\.[tj]sx?$/, '.js'), file.text); } } + for (const lang in global.Hydro.locales) { + if (!/^[a-zA-Z_]+$/.test(lang)) continue; + const str = `window.LOCALES=${JSON.stringify(global.Hydro.locales[lang][Symbol.for('iterate')])};`; + addFile(`lang-${lang}.js`, str); + } const entry = await build([ `window.lazyloadMetadata = ${JSON.stringify(hashes)};`, ...entryPoints.map((i) => `import '${relative(tmp, i)}';`), ].join('\n')); const pages = entry.outputFiles.map((i) => i.text); const str = `window.LANGS=${JSON.stringify(SettingModel.langs)};${pages.join('\n')}`; - vfs['entry.js'] = str; - UiContextBase.constantVersion = hashes['entry.js'] = sha1(str).substring(0, 8); - logger.info('+ %s-%s: %s', 'entry', hashes['entry.js'].substring(0, 6), size(str.length)); - totalSize += str.length; + addFile('entry.js', str); + UiContextBase.constantVersion = hashes['entry.js']; for (const key in vfs) { if (newFiles.includes(key)) continue; delete vfs[key]; @@ -132,6 +138,7 @@ class UiConstantsHandler extends Handler { export async function apply(ctx: Context) { ctx.Route('constant', '/constant/:version', UiConstantsHandler); ctx.Route('constant', '/lazy/:version/:name', UiConstantsHandler); + ctx.Route('constant', '/resource/:version/:name', UiConstantsHandler); ctx.on('app/started', updateLogo); ctx.on('app/started', buildUI); const debouncedBuildUI = debounce(buildUI, 2000, { trailing: true }); diff --git a/packages/ui-default/build/config/webpack.ts b/packages/ui-default/build/config/webpack.ts index 236cbfa82..a97212d2a 100644 --- a/packages/ui-default/build/config/webpack.ts +++ b/packages/ui-default/build/config/webpack.ts @@ -190,9 +190,11 @@ export default function (env: { watch?: boolean, production?: boolean, measure?: automaticNameDelimiter: '-', cacheGroups: { style: { - test: /\.(css|styl|less|s[ac]ss)$/, priority: 99, - name: 'style', + name: 'theme', + type: 'css/mini-extract', + chunks: 'all', + enforce: true, }, vendors: { test: /[\\/]node_modules[\\/].+\.([jt]sx?|json|yaml)$/, diff --git a/packages/ui-default/build/main.ts b/packages/ui-default/build/main.ts index f9c2cf44f..e13128715 100644 --- a/packages/ui-default/build/main.ts +++ b/packages/ui-default/build/main.ts @@ -120,8 +120,8 @@ async function main() { if (fs.existsSync('public/polyfill.js')) { fs.copyFileSync('public/polyfill.js', `public/polyfill-${pkg.version}.js`); } - if (fs.existsSync('public/default.theme.css')) { - fs.copyFileSync('public/default.theme.css', `public/default-${pkg.version}.theme.css`); + if (fs.existsSync('public/theme.css')) { + fs.copyFileSync('public/theme.css', `public/theme-${pkg.version}.css`); } if (argv.options.production) { for (const f of ['echarts', 'graphviz', 'mermaid', 'mathjax']) { diff --git a/packages/ui-default/index.ts b/packages/ui-default/index.ts index 1ad31c837..9cb8fedf7 100644 --- a/packages/ui-default/index.ts +++ b/packages/ui-default/index.ts @@ -78,24 +78,11 @@ class MarkdownHandler extends Handler { } } -class ResourceHandler extends Handler { +class SWConfigHandler extends Handler { noCheckPermView = true; - async prepare() { - this.response.addHeader('Cache-Control', 'public, max-age=86400'); - } -} - -class LanguageHandler extends ResourceHandler { - async all({ lang }) { - if (!global.Hydro.locales[lang]) lang = SystemModel.get('server.language'); - this.response.body = `window.LOCALES=${JSON.stringify(global.Hydro.locales[lang][Symbol.for('iterate')])};`; - this.response.type = 'application/javascript'; - } -} - -class SWConfigHandler extends ResourceHandler { async get() { + this.response.addHeader('Cache-Control', 'public, max-age=86400'); this.response.body = { preload: SystemModel.get('ui-default.preload'), hosts: [ @@ -174,7 +161,6 @@ export function apply(ctx: Context) { ctx.Route('set_legacy', '/legacy', LegacyModeHandler); ctx.Route('markdown', '/markdown', MarkdownHandler); ctx.Route('config_schema', '/manage/config/schema.json', SystemConfigSchemaHandler, PRIV.PRIV_EDIT_SYSTEM); - ctx.Route('lang', '/l/:lang', LanguageHandler); ctx.Route('sw_config', '/sw-config', SWConfigHandler); ctx.Route('media', '/media', RichMediaHandler); ctx.plugin(require('./backendlib/builder')); diff --git a/packages/ui-default/templates/layout/html5.html b/packages/ui-default/templates/layout/html5.html index 0423be024..df0678c31 100644 --- a/packages/ui-default/templates/layout/html5.html +++ b/packages/ui-default/templates/layout/html5.html @@ -37,10 +37,10 @@ {% endif %} {% if process.env.DEV %} - + + {% else %} - - + {% endif %} {% if not isIE(handler.request.headers['user-agent']) and not handler.session.legacy %} - - {% if process.env.DEV %} + {% else %} + {% endif %} {% endif %}