| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- "use strict";
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.renderPage = void 0;
- const path_1 = __importDefault(require("path"));
- const fs_extra_1 = __importDefault(require("fs-extra"));
- const config_1 = require("../config");
- const escape = require('escape-html');
- async function renderPage(config, page, // foo.md
- result, appChunk, cssChunk, pageToHashMap, hashMapStirng) {
- const { createApp } = require(path_1.default.join(config.tempDir, `_assets/app.js`));
- const { app, router } = createApp();
- const routePath = `/${page.replace(/\.md$/, '')}`;
- const siteData = config_1.resolveSiteDataByRoute(config.site, routePath);
- router.go(routePath);
- // lazy require server-renderer for production build
- const content = await require('@vue/server-renderer').renderToString(app);
- const pageName = page.replace(/\//g, '_');
- // server build doesn't need hash
- const pageServerJsFileName = pageName + '.js';
- // for any initial page load, we only need the lean version of the page js
- // since the static content is already on the page!
- const pageHash = pageToHashMap[pageName];
- const pageClientJsFileName = pageName + `.` + pageHash + '.lean.js';
- // resolve page data so we can render head tags
- const { __pageData } = require(path_1.default.join(config.tempDir, `_assets`, pageServerJsFileName));
- const pageData = JSON.parse(__pageData);
- const assetPath = `${siteData.base}_assets/`;
- const preloadLinks = [
- // resolve imports for index.js + page.md.js and inject script tags for
- // them as well so we fetch everything as early as possible without having
- // to wait for entry chunks to parse
- ...resolvePageImports(config, page, result, appChunk),
- pageClientJsFileName,
- appChunk.fileName
- ]
- .map((file) => {
- return `<link rel="modulepreload" href="${assetPath}${file}">`;
- })
- .join('\n ');
- const html = `
- <!DOCTYPE html>
- <html lang="${siteData.lang}">
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width,initial-scale=1">
- <title>
- ${pageData.title ? pageData.title + ` | ` : ``}${siteData.title}
- </title>
- <meta name="description" content="${siteData.description}">
- <link rel="stylesheet" href="${assetPath}${cssChunk.fileName}">
- ${preloadLinks}
- ${renderHead(siteData.head)}
- ${renderHead(pageData.frontmatter.head)}
- </head>
- <body>
- <div id="app">${content}</div>
- <script>__VP_HASH_MAP__ = JSON.parse(${hashMapStirng})</script>
- <script type="module" async src="${assetPath}${appChunk.fileName}"></script>
- </body>
- </html>`.trim();
- const htmlFileName = path_1.default.join(config.outDir, page.replace(/\.md$/, '.html'));
- await fs_extra_1.default.ensureDir(path_1.default.dirname(htmlFileName));
- await fs_extra_1.default.writeFile(htmlFileName, html);
- }
- exports.renderPage = renderPage;
- function resolvePageImports(config, page, result, indexChunk) {
- // find the page's js chunk and inject script tags for its imports so that
- // they are start fetching as early as possible
- const srcPath = path_1.default.resolve(config.root, page);
- const pageChunk = result.assets.find((chunk) => chunk.type === 'chunk' && chunk.facadeModuleId === srcPath);
- return Array.from(new Set([...indexChunk.imports, ...pageChunk.imports]));
- }
- function renderHead(head) {
- if (!head || !head.length) {
- return '';
- }
- return head
- .map(([tag, attrs = {}, innerHTML = '']) => {
- const openTag = `<${tag}${renderAttrs(attrs)}>`;
- if (tag !== 'link' && tag !== 'meta') {
- return `${openTag}${innerHTML}</${tag}>`;
- }
- else {
- return openTag;
- }
- })
- .join('\n ');
- }
- function renderAttrs(attrs) {
- return Object.keys(attrs)
- .map((key) => {
- return ` ${key}="${escape(attrs[key])}"`;
- })
- .join('');
- }
- //# sourceMappingURL=render.js.map
|