梗概

  • renderer目录下定义指定页面对应的渲染方法
  • 当页面被请求到的时候,会找对对应的页面,并执行页面脚本,得到页面对应的pageContext
    • .page.server.js服务端中执行
    • .page.client.js客户端中执行
  • 页面和pageContext会被传递给定义好的渲染方法

实例

// /renderer/_default.page.server.js
// Environment: Node.js
import { createSSRApp, h } from "vue";
import { renderToString } from "@vue/server-renderer";
import { escapeInject, dangerouslySkipEscape } from "vite-plugin-ssr";
export { render };
async function render(pageContext) {
  const { Page, pageProps } = pageContext;
  const app = createSSRApp({
    render: () => h(Page, pageProps),//渲染传入的页面
  });
  const appHtml = await renderToString(app);
  const title = "Vite SSR";
  return escapeInject`<!DOCTYPE html>
    <html>
      <head>
        <title>${title}</title>
      </head>
      <body>
        <div id="app">${dangerouslySkipEscape(appHtml)}</div>
      </body>
    </html>`;
}
// /renderer/_default.page.client.js
// Environment: Browser
import { createSSRApp, h } from "vue";
export { render };
async function render(pageContext) {
  const { Page, pageProps } = pageContext;
  const app = createSSRApp({
    render: () => h(Page, pageProps),
  });
  app.mount("#app");
}

Nuxt 将这一点抽象出来,让我们可以更快上手,但也意味着我们失去了对应用程序架构核心部分的控制, 我们最终会在 Nuxt 限制性的黑盒上失去更多时间 这种级别的控制使我们 轻松自然 地集成我们想要的任何工具(Vuex, GraphQL, Service Worker, …)