diff --git a/html.ts b/html.ts index ef55a23f1..80f0c89a5 100644 --- a/html.ts +++ b/html.ts @@ -1,65 +1,86 @@ -import util from './util.ts' +import util from "./util.ts"; export function createHtml({ - lang = 'en', + lang = "en", head = [], scripts = [], body, - minify = false + minify = false, }: { - lang?: string, - head?: string[], - scripts?: (string | { id?: string, type?: string, src?: string, innerText?: string, nomodule?: boolean, async?: boolean, preload?: boolean })[], - body: string, - minify?: boolean + lang?: string; + head?: string[]; + scripts?: + (string | { + id?: string; + type?: string; + src?: string; + innerText?: string; + nomodule?: boolean; + async?: boolean; + preload?: boolean; + })[]; + body: string; + minify?: boolean; }) { - const eol = minify ? '' : '\n' - const indent = minify ? '' : ' '.repeat(4) - const headTags = head.map(tag => tag.trim()) - .concat(scripts.map(v => { + const eol = minify ? "" : "\n"; + const indent = minify ? "" : " ".repeat(4); + const headTags = head.map((tag) => tag.trim()) + .concat(scripts.map((v) => { if (!util.isString(v) && util.isNEString(v.src)) { - if (v.type === 'module') { - return `` - } else if (v.async === true) { - return `` + if (v.type === "module") { + return ``; } + return ``; } - return '' - })).filter(Boolean) - const scriptTags = scripts.map(v => { + return ""; + })) + /*.concat( + [ + "/_aleph/-/deno.land/x/aleph/error.js", + "/_aleph/-/deno.land/x/aleph/aleph.js", + "/_aleph/-/deno.land/x/aleph/context.js", + "/_aleph/-/deno.land/x/aleph/events.js" + ].map((v) => + `` + ), + )*/ + .filter(Boolean); + const scriptTags = scripts.map((v) => { if (util.isString(v)) { - return `` + return ``; } else if (util.isNEString(v.innerText)) { - const { innerText, ...rest } = v - return `${eol}${innerText}${eol}${indent}` + const { innerText, ...rest } = v; + return `${eol}${innerText}${eol}${indent}`; } else if (util.isNEString(v.src) && !v.preload) { - return `` + return ``; } else { - return '' + return ""; } - }).filter(Boolean) + }).filter(Boolean); return [ - '', + "", ``, - '', + "", indent + '', - ...headTags.map(tag => indent + tag), - '', - '', + ...headTags.map((tag) => indent + tag), + "", + "", indent + body, - ...scriptTags.map(tag => indent + tag), - '', - '' - ].join(eol) + ...scriptTags.map((tag) => indent + tag), + "", + "", + ].join(eol); } function attrString(v: any): string { - return Object.keys(v).map(k => { + return Object.keys(v).map((k) => { if (v[k] === true) { - return ` ${k}` + return ` ${k}`; } else { - return ` ${k}=${JSON.stringify(String(v[k]))}` + return ` ${k}=${JSON.stringify(String(v[k]))}`; } - }).join('') + }).join(""); } diff --git a/project.ts b/project.ts index 73e1b1554..26470d6d9 100644 --- a/project.ts +++ b/project.ts @@ -260,6 +260,18 @@ export class Project { return [status, data] } + getPreloadScripts(baseUrl: string) { + const scripts = [ + '-/deno.land/x/aleph/aleph.js', + '-/deno.land/x/aleph/context.js', + '-/deno.land/x/aleph/error.js', + '-/deno.land/x/aleph/events.js', + '-/deno.land/x/aleph/routing.js,', + '-/deno.land/x/aleph/util.js' + ] + return scripts.map(src => ({ src: `${baseUrl}${src}`, type: 'module', preload: true })) + } + async getPageHtml(loc: { pathname: string, search?: string }): Promise<[number, string, Record | null]> { if (!this.isSSRable(loc.pathname)) { const [url] = this.#routing.createRouter(loc) @@ -275,7 +287,7 @@ export class Project { scripts: [ data ? { type: 'application/json', innerText: JSON.stringify(data), id: 'ssr-data' } : '', { src: util.cleanPath(`${baseUrl}/_aleph/main.${mainModule.hash.slice(0, hashShort)}.js`), type: 'module' }, - { src: util.cleanPath(`${baseUrl}/_aleph/-/deno.land/x/aleph/nomodule.js${this.isDev ? '?dev' : ''}`), nomodule: true }, + ...this.getPreloadScripts(baseUrl), ...scripts ], body, @@ -293,6 +305,7 @@ export class Project { scripts: [ { src: util.cleanPath(`${baseUrl}/_aleph/main.${mainModule.hash.slice(0, hashShort)}.js`), type: 'module' }, { src: util.cleanPath(`${baseUrl}/_aleph/-/deno.land/x/aleph/nomodule.js${this.isDev ? '?dev' : ''}`), nomodule: true }, + ...this.getPreloadScripts(baseUrl) ], head: customLoading?.head || [], body: `
${customLoading?.body || ''}
`, @@ -379,6 +392,7 @@ export class Project { data ? { type: 'application/json', innerText: JSON.stringify(data), id: 'ssr-data' } : '', { src: util.cleanPath(`${baseUrl}/_aleph/main.${mainModule.hash.slice(0, hashShort)}.js`), type: 'module' }, { src: util.cleanPath(`${baseUrl}/_aleph/-/deno.land/x/aleph/nomodule.js${this.isDev ? '?dev' : ''}`), nomodule: true }, + ...this.getPreloadScripts(baseUrl), ...scripts ], body,