vue.js 使用Nuxt 2中包含的esi

b1uwtaje  于 2023-01-31  发布在  Vue.js
关注(0)|答案(1)|浏览(225)

我的目标:将Nuxt 3呈现的代码粘贴到我用Nuxt 2编写的旧应用程序中。粘贴将是Varnish,并使用<esi:includes
我的问题:我有.vue文件

<template>
  <div>
    <esi:include src="/from/nuxt-3-app" method="GET" />
  </div>
</template>

它确实工作了几秒钟,然后就消失了!
我得到的错误:

1. Mismatching childNodes vs. VNodes:  NodeList(15) [text, meta, text, meta, link, link, link, link, link, text, div#__nuxt, script, script, script, text] (3) [VNode, VNode, VNode...

2. [Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>. Bailing hydration and performing full client-side render.

3. [Vue warn]: Unknown custom element: .... <- resolved by adding `v-pre` in <esi:include ... v-pre />

注意:它们按顺序显示^
我所做的:

  • 使用v-pre
  • ignoredElements?-〉我试着像这样声明它:
nuxt.config.js

...
Vue: {
  config: {
    ignoredElements: ["esi:include"]
  }
}

^但似乎不起作用

  • <client-only> ... </client-only>包裹<esi:include ... />("nuxt":"^2.15.8")

^副作用,它不显示或渲染我的<esi:include中的内容
我将要尝试的是:

  • 代理控制头-Reference,但似乎不是我需要的,因为我已经默认声明了do_esi=true。如果你想看的话,下面是我的VCL:
backend test {
  .host = "host.docker.internal";
  .port = "3101";
}

sub vcl_backend_response {
  set beresp.ttl = 1s;
  set beresp.do_esi = true;
}

sub vcl_recv {
  unset req.http.cookie;

  if (req.url ~ "^/from/nuxt-3-app") {
    set req.backend_hint = test;
    return (hash);
  }
}

我只想要:渲染<esi:includes ... />内部的内容,而不删除它

jgovgodb

jgovgodb1#

虽然我不喜欢无条件ESI解析,也不喜欢我在the answer you're referring to中解释的ESI内容协商,但我们必须首先弄清楚为什么ESI根本没有得到解析。
请运行以下命令并将输出附加到原始问题:

sudo varnishlog -g request -q "ReqUrl eq '/'"

我假设/是包含ESI标记的页面的URL,如果不是这样,请在-q过滤器中调整URL。
根据您可能提供的varnishlog输出,我将尝试提供适当的解决方案。

相关问题