renderer.mjs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. import process from 'node:process';globalThis._importMeta_=globalThis._importMeta_||{url:"file:///_entry.js",env:process.env};import { getRequestDependencies, getPreloadLinks, getPrefetchLinks, createRenderer } from 'file://D:/zwj/nuxt/sannongzixunwang_web/node_modules/vue-bundle-renderer/dist/runtime.mjs';
  2. import { eventHandler, setResponseHeader, send, getResponseStatus, setResponseStatus, setResponseHeaders, getQuery, createError, appendResponseHeader, getResponseStatusText } from 'file://D:/zwj/nuxt/sannongzixunwang_web/node_modules/h3/dist/index.mjs';
  3. import { stringify, uneval } from 'file://D:/zwj/nuxt/sannongzixunwang_web/node_modules/devalue/index.js';
  4. import { joinRelativeURL, joinURL, withoutTrailingSlash } from 'file://D:/zwj/nuxt/sannongzixunwang_web/node_modules/ufo/dist/index.mjs';
  5. import { renderToString } from 'file://D:/zwj/nuxt/sannongzixunwang_web/node_modules/vue/server-renderer/index.mjs';
  6. import { propsToString, renderSSRHead } from 'file://D:/zwj/nuxt/sannongzixunwang_web/node_modules/@unhead/ssr/dist/index.mjs';
  7. import { u as useRuntimeConfig, a as useNitroApp, b as useStorage, g as getRouteRules } from '../routes/index.mjs';
  8. import { createServerHead as createServerHead$1, CapoPlugin } from 'file://D:/zwj/nuxt/sannongzixunwang_web/node_modules/unhead/dist/index.mjs';
  9. import { version, unref } from 'file://D:/zwj/nuxt/sannongzixunwang_web/node_modules/vue/index.mjs';
  10. import { defineHeadPlugin } from 'file://D:/zwj/nuxt/sannongzixunwang_web/node_modules/@unhead/shared/dist/index.mjs';
  11. function defineRenderHandler(handler) {
  12. const runtimeConfig = useRuntimeConfig();
  13. return eventHandler(async (event) => {
  14. if (event.path === `${runtimeConfig.app.baseURL}favicon.ico`) {
  15. setResponseHeader(event, "Content-Type", "image/x-icon");
  16. return send(
  17. event,
  18. "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
  19. );
  20. }
  21. const response = await handler(event);
  22. if (!response) {
  23. const _currentStatus = getResponseStatus(event);
  24. setResponseStatus(event, _currentStatus === 200 ? 500 : _currentStatus);
  25. return send(
  26. event,
  27. "No response returned from render handler: " + event.path
  28. );
  29. }
  30. const nitroApp = useNitroApp();
  31. await nitroApp.hooks.callHook("render:response", response, { event });
  32. if (response.headers) {
  33. setResponseHeaders(event, response.headers);
  34. }
  35. if (response.statusCode || response.statusMessage) {
  36. setResponseStatus(event, response.statusCode, response.statusMessage);
  37. }
  38. return response.body;
  39. });
  40. }
  41. const Vue3 = version[0] === "3";
  42. function resolveUnref(r) {
  43. return typeof r === "function" ? r() : unref(r);
  44. }
  45. function resolveUnrefHeadInput(ref) {
  46. if (ref instanceof Promise || ref instanceof Date || ref instanceof RegExp)
  47. return ref;
  48. const root = resolveUnref(ref);
  49. if (!ref || !root)
  50. return root;
  51. if (Array.isArray(root))
  52. return root.map((r) => resolveUnrefHeadInput(r));
  53. if (typeof root === "object") {
  54. const resolved = {};
  55. for (const k in root) {
  56. if (!Object.prototype.hasOwnProperty.call(root, k)) {
  57. continue;
  58. }
  59. if (k === "titleTemplate" || k[0] === "o" && k[1] === "n") {
  60. resolved[k] = unref(root[k]);
  61. continue;
  62. }
  63. resolved[k] = resolveUnrefHeadInput(root[k]);
  64. }
  65. return resolved;
  66. }
  67. return root;
  68. }
  69. const VueReactivityPlugin = defineHeadPlugin({
  70. hooks: {
  71. "entries:resolve": (ctx) => {
  72. for (const entry of ctx.entries)
  73. entry.resolvedInput = resolveUnrefHeadInput(entry.input);
  74. }
  75. }
  76. });
  77. const headSymbol = "usehead";
  78. function vueInstall(head) {
  79. const plugin = {
  80. install(app) {
  81. if (Vue3) {
  82. app.config.globalProperties.$unhead = head;
  83. app.config.globalProperties.$head = head;
  84. app.provide(headSymbol, head);
  85. }
  86. }
  87. };
  88. return plugin.install;
  89. }
  90. function createServerHead(options = {}) {
  91. const head = createServerHead$1(options);
  92. head.use(VueReactivityPlugin);
  93. head.install = vueInstall(head);
  94. return head;
  95. }
  96. const unheadPlugins = true ? [CapoPlugin({ track: true })] : [];
  97. const renderSSRHeadOptions = {"omitLineBreaks":false};
  98. const appHead = {"meta":[{"name":"viewport","content":"width=device-width, initial-scale=1"},{"charset":"utf-8"}],"link":[],"style":[],"script":[],"noscript":[]};
  99. const appRootTag = "div";
  100. const appRootAttrs = {"id":"__nuxt"};
  101. const appTeleportTag = "div";
  102. const appTeleportAttrs = {"id":"teleports"};
  103. const componentIslands = false;
  104. const appId = "nuxt-app";
  105. function baseURL() {
  106. return useRuntimeConfig().app.baseURL;
  107. }
  108. function buildAssetsDir() {
  109. return useRuntimeConfig().app.buildAssetsDir;
  110. }
  111. function buildAssetsURL(...path) {
  112. return joinRelativeURL(publicAssetsURL(), buildAssetsDir(), ...path);
  113. }
  114. function publicAssetsURL(...path) {
  115. const app = useRuntimeConfig().app;
  116. const publicBase = app.cdnURL || app.baseURL;
  117. return path.length ? joinRelativeURL(publicBase, ...path) : publicBase;
  118. }
  119. globalThis.__buildAssetsURL = buildAssetsURL;
  120. globalThis.__publicAssetsURL = publicAssetsURL;
  121. const getClientManifest = () => import('../build/client.manifest.mjs').then((r) => r.default || r).then((r) => typeof r === "function" ? r() : r);
  122. const getEntryIds = () => getClientManifest().then((r) => Object.values(r).filter(
  123. (r2) => (
  124. // @ts-expect-error internal key set by CSS inlining configuration
  125. r2._globalCSS
  126. )
  127. ).map((r2) => r2.src));
  128. const getServerEntry = () => import('../build/server.mjs').then((r) => r.default || r);
  129. const getSSRStyles = lazyCachedFunction(() => import('../build/styles.mjs').then((r) => r.default || r));
  130. const getSSRRenderer = lazyCachedFunction(async () => {
  131. const manifest = await getClientManifest();
  132. if (!manifest) {
  133. throw new Error("client.manifest is not available");
  134. }
  135. const createSSRApp = await getServerEntry();
  136. if (!createSSRApp) {
  137. throw new Error("Server bundle is not available");
  138. }
  139. const options = {
  140. manifest,
  141. renderToString: renderToString$1,
  142. buildAssetsURL
  143. };
  144. const renderer = createRenderer(createSSRApp, options);
  145. async function renderToString$1(input, context) {
  146. const html = await renderToString(input, context);
  147. return APP_ROOT_OPEN_TAG + html + APP_ROOT_CLOSE_TAG;
  148. }
  149. return renderer;
  150. });
  151. const getSPARenderer = lazyCachedFunction(async () => {
  152. const manifest = await getClientManifest();
  153. const spaTemplate = await import('../virtual/_virtual_spa-template.mjs').then((r) => r.template).catch(() => "").then((r) => APP_ROOT_OPEN_TAG + r + APP_ROOT_CLOSE_TAG);
  154. const options = {
  155. manifest,
  156. renderToString: () => spaTemplate,
  157. buildAssetsURL
  158. };
  159. const renderer = createRenderer(() => () => {
  160. }, options);
  161. const result = await renderer.renderToString({});
  162. const renderToString = (ssrContext) => {
  163. const config = useRuntimeConfig(ssrContext.event);
  164. ssrContext.modules = ssrContext.modules || /* @__PURE__ */ new Set();
  165. ssrContext.payload.serverRendered = false;
  166. ssrContext.config = {
  167. public: config.public,
  168. app: config.app
  169. };
  170. return Promise.resolve(result);
  171. };
  172. return {
  173. rendererContext: renderer.rendererContext,
  174. renderToString
  175. };
  176. });
  177. const payloadCache = useStorage("internal:nuxt:prerender:payload") ;
  178. useStorage("internal:nuxt:prerender:island") ;
  179. useStorage("internal:nuxt:prerender:island-props") ;
  180. const HAS_APP_TELEPORTS = !!(appTeleportAttrs.id);
  181. const APP_TELEPORT_OPEN_TAG = HAS_APP_TELEPORTS ? `<${appTeleportTag}${propsToString(appTeleportAttrs)}>` : "";
  182. const APP_TELEPORT_CLOSE_TAG = HAS_APP_TELEPORTS ? `</${appTeleportTag}>` : "";
  183. const APP_ROOT_OPEN_TAG = `<${appRootTag}${propsToString(appRootAttrs)}>`;
  184. const APP_ROOT_CLOSE_TAG = `</${appRootTag}>`;
  185. const PAYLOAD_URL_RE = /\/_payload.json(\?.*)?$/ ;
  186. const PRERENDER_NO_SSR_ROUTES = /* @__PURE__ */ new Set(["/index.html", "/200.html", "/404.html"]);
  187. const renderer = defineRenderHandler(async (event) => {
  188. const nitroApp = useNitroApp();
  189. const ssrError = event.path.startsWith("/__nuxt_error") ? getQuery(event) : null;
  190. if (ssrError && ssrError.statusCode) {
  191. ssrError.statusCode = Number.parseInt(ssrError.statusCode);
  192. }
  193. if (ssrError && !("__unenv__" in event.node.req)) {
  194. throw createError({
  195. statusCode: 404,
  196. statusMessage: "Page Not Found: /__nuxt_error"
  197. });
  198. }
  199. const isRenderingIsland = componentIslands;
  200. const islandContext = void 0;
  201. let url = ssrError?.url || islandContext?.url || event.path;
  202. const isRenderingPayload = PAYLOAD_URL_RE.test(url) && !isRenderingIsland;
  203. if (isRenderingPayload) {
  204. url = url.substring(0, url.lastIndexOf("/")) || "/";
  205. event._path = url;
  206. event.node.req.url = url;
  207. if (await payloadCache.hasItem(url)) {
  208. return payloadCache.getItem(url);
  209. }
  210. }
  211. const routeOptions = getRouteRules(event);
  212. const head = createServerHead({
  213. plugins: unheadPlugins
  214. });
  215. const headEntryOptions = { mode: "server" };
  216. {
  217. head.push(appHead, headEntryOptions);
  218. }
  219. const ssrContext = {
  220. url,
  221. event,
  222. runtimeConfig: useRuntimeConfig(event),
  223. noSSR: event.context.nuxt?.noSSR || routeOptions.ssr === false && !isRenderingIsland || (PRERENDER_NO_SSR_ROUTES.has(url) ),
  224. head,
  225. error: !!ssrError,
  226. nuxt: void 0,
  227. /* NuxtApp */
  228. payload: ssrError ? { error: ssrError } : {},
  229. _payloadReducers: /* @__PURE__ */ Object.create(null),
  230. modules: /* @__PURE__ */ new Set(),
  231. islandContext
  232. };
  233. const _PAYLOAD_EXTRACTION = !ssrContext.noSSR && !isRenderingIsland;
  234. const payloadURL = _PAYLOAD_EXTRACTION ? joinURL(ssrContext.runtimeConfig.app.cdnURL || ssrContext.runtimeConfig.app.baseURL, url, "_payload.json" ) + "?" + ssrContext.runtimeConfig.app.buildId : void 0;
  235. {
  236. ssrContext.payload.prerenderedAt = Date.now();
  237. }
  238. const renderer = ssrContext.noSSR ? await getSPARenderer() : await getSSRRenderer();
  239. {
  240. for (const id of await getEntryIds()) {
  241. ssrContext.modules.add(id);
  242. }
  243. }
  244. const _rendered = await renderer.renderToString(ssrContext).catch(async (error) => {
  245. if (ssrContext._renderResponse && error.message === "skipping render") {
  246. return {};
  247. }
  248. const _err = !ssrError && ssrContext.payload?.error || error;
  249. await ssrContext.nuxt?.hooks.callHook("app:error", _err);
  250. throw _err;
  251. });
  252. await ssrContext.nuxt?.hooks.callHook("app:rendered", { ssrContext, renderResult: _rendered });
  253. if (ssrContext._renderResponse) {
  254. return ssrContext._renderResponse;
  255. }
  256. if (ssrContext.payload?.error && !ssrError) {
  257. throw ssrContext.payload.error;
  258. }
  259. if (isRenderingPayload) {
  260. const response2 = renderPayloadResponse(ssrContext);
  261. {
  262. await payloadCache.setItem(url, response2);
  263. }
  264. return response2;
  265. }
  266. if (_PAYLOAD_EXTRACTION) {
  267. appendResponseHeader(event, "x-nitro-prerender", joinURL(url, "_payload.json" ));
  268. await payloadCache.setItem(withoutTrailingSlash(url), renderPayloadResponse(ssrContext));
  269. }
  270. const inlinedStyles = await renderInlineStyles(ssrContext.modules ?? []) ;
  271. const NO_SCRIPTS = routeOptions.experimentalNoScripts;
  272. const { styles, scripts } = getRequestDependencies(ssrContext, renderer.rendererContext);
  273. if (_PAYLOAD_EXTRACTION && !NO_SCRIPTS && !isRenderingIsland) {
  274. head.push({
  275. link: [
  276. { rel: "preload", as: "fetch", crossorigin: "anonymous", href: payloadURL }
  277. ]
  278. }, headEntryOptions);
  279. }
  280. if (inlinedStyles.length) {
  281. head.push({ style: inlinedStyles });
  282. }
  283. {
  284. const link = [];
  285. for (const style in styles) {
  286. const resource = styles[style];
  287. {
  288. link.push({ rel: "stylesheet", href: renderer.rendererContext.buildAssetsURL(resource.file) });
  289. }
  290. }
  291. if (link.length) {
  292. head.push({ link }, headEntryOptions);
  293. }
  294. }
  295. if (!NO_SCRIPTS && !isRenderingIsland) {
  296. head.push({
  297. link: getPreloadLinks(ssrContext, renderer.rendererContext)
  298. }, headEntryOptions);
  299. head.push({
  300. link: getPrefetchLinks(ssrContext, renderer.rendererContext)
  301. }, headEntryOptions);
  302. head.push({
  303. script: _PAYLOAD_EXTRACTION ? renderPayloadJsonScript({ ssrContext, data: splitPayload(ssrContext).initial, src: payloadURL }) : renderPayloadJsonScript({ ssrContext, data: ssrContext.payload })
  304. }, {
  305. ...headEntryOptions,
  306. // this should come before another end of body scripts
  307. tagPosition: "bodyClose",
  308. tagPriority: "high"
  309. });
  310. }
  311. if (!routeOptions.experimentalNoScripts && !isRenderingIsland) {
  312. head.push({
  313. script: Object.values(scripts).map((resource) => ({
  314. type: resource.module ? "module" : null,
  315. src: renderer.rendererContext.buildAssetsURL(resource.file),
  316. defer: resource.module ? null : true,
  317. // if we are rendering script tag payloads that import an async payload
  318. // we need to ensure this resolves before executing the Nuxt entry
  319. tagPosition: _PAYLOAD_EXTRACTION && !true ? "bodyClose" : "head",
  320. crossorigin: ""
  321. }))
  322. }, headEntryOptions);
  323. }
  324. const { headTags, bodyTags, bodyTagsOpen, htmlAttrs, bodyAttrs } = await renderSSRHead(head, renderSSRHeadOptions);
  325. const htmlContext = {
  326. island: isRenderingIsland,
  327. htmlAttrs: htmlAttrs ? [htmlAttrs] : [],
  328. head: normalizeChunks([headTags]),
  329. bodyAttrs: bodyAttrs ? [bodyAttrs] : [],
  330. bodyPrepend: normalizeChunks([bodyTagsOpen, ssrContext.teleports?.body]),
  331. body: [
  332. _rendered.html,
  333. APP_TELEPORT_OPEN_TAG + (HAS_APP_TELEPORTS ? joinTags([ssrContext.teleports?.[`#${appTeleportAttrs.id}`]]) : "") + APP_TELEPORT_CLOSE_TAG
  334. ],
  335. bodyAppend: [bodyTags]
  336. };
  337. await nitroApp.hooks.callHook("render:html", htmlContext, { event });
  338. const response = {
  339. body: renderHTMLDocument(htmlContext),
  340. statusCode: getResponseStatus(event),
  341. statusMessage: getResponseStatusText(event),
  342. headers: {
  343. "content-type": "text/html;charset=utf-8",
  344. "x-powered-by": "Nuxt"
  345. }
  346. };
  347. return response;
  348. });
  349. function lazyCachedFunction(fn) {
  350. let res = null;
  351. return () => {
  352. if (res === null) {
  353. res = fn().catch((err) => {
  354. res = null;
  355. throw err;
  356. });
  357. }
  358. return res;
  359. };
  360. }
  361. function normalizeChunks(chunks) {
  362. return chunks.filter(Boolean).map((i) => i.trim());
  363. }
  364. function joinTags(tags) {
  365. return tags.join("");
  366. }
  367. function joinAttrs(chunks) {
  368. if (chunks.length === 0) {
  369. return "";
  370. }
  371. return " " + chunks.join(" ");
  372. }
  373. function renderHTMLDocument(html) {
  374. return `<!DOCTYPE html><html${joinAttrs(html.htmlAttrs)}><head>${joinTags(html.head)}</head><body${joinAttrs(html.bodyAttrs)}>${joinTags(html.bodyPrepend)}${joinTags(html.body)}${joinTags(html.bodyAppend)}</body></html>`;
  375. }
  376. async function renderInlineStyles(usedModules) {
  377. const styleMap = await getSSRStyles();
  378. const inlinedStyles = /* @__PURE__ */ new Set();
  379. for (const mod of usedModules) {
  380. if (mod in styleMap) {
  381. for (const style of await styleMap[mod]()) {
  382. inlinedStyles.add(style);
  383. }
  384. }
  385. }
  386. return Array.from(inlinedStyles).map((style) => ({ innerHTML: style }));
  387. }
  388. function renderPayloadResponse(ssrContext) {
  389. return {
  390. body: stringify(splitPayload(ssrContext).payload, ssrContext._payloadReducers) ,
  391. statusCode: getResponseStatus(ssrContext.event),
  392. statusMessage: getResponseStatusText(ssrContext.event),
  393. headers: {
  394. "content-type": "application/json;charset=utf-8" ,
  395. "x-powered-by": "Nuxt"
  396. }
  397. };
  398. }
  399. function renderPayloadJsonScript(opts) {
  400. const contents = opts.data ? stringify(opts.data, opts.ssrContext._payloadReducers) : "";
  401. const payload = {
  402. "type": "application/json",
  403. "innerHTML": contents,
  404. "data-nuxt-data": appId,
  405. "data-ssr": !(opts.ssrContext.noSSR)
  406. };
  407. {
  408. payload.id = "__NUXT_DATA__";
  409. }
  410. if (opts.src) {
  411. payload["data-src"] = opts.src;
  412. }
  413. const config = uneval(opts.ssrContext.config);
  414. return [
  415. payload,
  416. {
  417. innerHTML: `window.__NUXT__={};window.__NUXT__.config=${config}`
  418. }
  419. ];
  420. }
  421. function splitPayload(ssrContext) {
  422. const { data, prerenderedAt, ...initial } = ssrContext.payload;
  423. return {
  424. initial: { ...initial, prerenderedAt },
  425. payload: { data, prerenderedAt }
  426. };
  427. }
  428. const renderer$1 = /*#__PURE__*/Object.freeze({
  429. __proto__: null,
  430. default: renderer
  431. });
  432. export { buildAssetsURL as a, baseURL as b, renderer$1 as r };
  433. //# sourceMappingURL=renderer.mjs.map