首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Vue 3中使用SSR

问如何在Vue 3中使用SSR
EN

Stack Overflow用户
提问于 2020-10-07 15:42:03
回答 1查看 8.5K关注 0票数 10

我有一个工作的Vue 2应用程序与服务器端渲染。现在我正在尝试升级到Vue 3,但仍然停留在SSR部分,因为vue-server-renderer包抛出了以下错误:

代码语言:javascript
复制
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的例子?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-01 19:43:59

Vue-server-renderer只能与vue版本2一起使用。版本3最大的变化之一是它现在加入了SSR支持。

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

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

代码语言:javascript
复制
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接管服务器的标记,也就是说,你在水合模式下创建和挂载应用程序。

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

请注意,使用此设置,包渲染器将仅注入带有rel=“预加载”的入口/初始脚本。现在,'new‘vue-loader不会向组件注入任何组件注册逻辑(就像'old’vue loader一样)。尽管如此,只要在ssrContext._registeredComponents中引用了异步块,vue-bundle-renderer就可以并将使用rel=“预加载”注入这些块。因此,如果您的应用程序中需要此功能,则必须自己编写该逻辑。

当然,这是一种方法。我相信有更多的路通向相同的目的地。

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

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

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64239478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档