【问题标题】:How to use SSR with Vue 3如何在 Vue 3 中使用 SSR
【发布时间】:2021-01-22 03:22:26
【问题描述】:

我有一个带有服务器端渲染功能的 Vue 2 应用程序。现在我正在尝试升级到 Vue 3,但卡在 SSR 部分,因为 vue-server-renderer 包会引发以下错误:

Vue packages version mismatch: - vue@3.0.0 - vue-server-renderer@2.6.12 This may cause things to work incorrectly. Make sure to use the same version for both.

但是vue-server-renderer没有3.0.0版本...

通过谷歌搜索,我在 vue-next 存储库中发现了这个问题:https://github.com/vuejs/vue-next/issues/1327

但对我来说,如何使用 vue 版本 3 实现 SSR 仍不清楚。已经可以了吗?是否有一个如何在 Vue 3 中使用 SSR 的示例?

【问题讨论】:

    标签: vue.js server-side-rendering


    【解决方案1】:

    Vue-server-renderer 只能与 vue 第 2 版一起使用。第 3 版的一大变化是它现在支持 SSR。

    因此,您现在只需使用 vue 的createSSRApp,而不是使用 vue-2.0 服务器渲染器。 在服务器上,要将由此创建的应用程序呈现为可以发送到浏览器的字符串,您可以使用renderToString 方法,您可以从@vue/server-renderer 导入该方法(请注意,您必须单独安装此包)。

    作为一个超级基本(没有捆绑器或任何东西)的例子,这看起来像这样:

    const express = require('express');
    const { createSSRApp } = require('vue');
    const { renderToString } = require('@vue/server-renderer');
    
    const app = express();
    
    const example= {
      template: `
        <div>
          Hello World
        </div>`,
    };
    
    function renderVueApp(req, res) {
      const vueApp = createSSRApp(example);
    
      (async () => {
        const html = await renderToString(vueApp);
    
        res.send(`
          <!DOCTYPE html>
          <html lang="en">
            <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <script src="https://unpkg.com/vue@next"></script>
              <title>About blank</title>
            </head>
            <body>
              <div id="app">${html}</div>
              <script>
                const example = { template: '<div>Hello World</div>}; 
                Vue.createSSRApp(example).mount('#app', true);
              </script>
            </body>
          </html>
        `);
      })();
    }
    
    app.get('/', renderVueApp);
    
    const port = process.env.PORT || 8080;
    app.listen(port, () =>
      console.log(`Server started at localhost:${port}. Press ctrl+c to quit.`)
    );
    

    在前端,你让 vue 接管服务器的标记,即你在 hydration 模式下创建和挂载应用程序。

    您在问题中引用的捆绑渲染器或多或少只是从 vue-2.0 服务器渲染器中提取的。为了使用它,你必须使用 vue-2.0 server-renderer 包中的 client-plugin 和 server-plugin 并将它们插入你的 webpack 进程以获取 server-bundle 和客户端清单。

    请注意,使用此设置,捆绑渲染器只会注入带有 rel="preload" 的条目/初始脚本。现在,“新”vue-loader 不会将任何组件注册逻辑注入到组件中(就像“旧”vue 加载器一样)。尽管如此,vue-bundle-renderer 可以并且将使用 rel="preload" 注入异步块,只要它们在 ssrContext._registeredComponents 中被引用。因此,如果您的应用需要此功能,则必须自己编写该逻辑。

    当然,这是一种方法。我敢肯定还有更多的道路通往同一个目的地。

    我写了一个 vue3 版本的 vue2 hackernews 克隆,它使用了所有描述/提到的东西。

    你可以在这里找到它:https://github.com/raukaute/vue-hackernews-3.0

    【讨论】:

    • 有复杂案例的样本吗?例如:导入第三方组件库
    • 手头没有具体的例子。你看过 git repo 吗?我没有用任何组件库玩过这个,但我想你只是以常规方式插入它。我用 antd vue 3 构建了一个常规应用程序,我发现没有任何障碍可以阻止它在 ssr 设置中工作。希望有帮助
    • @UliKrause 如果我需要打字稿怎么办?
    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2021-10-29
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多