[Vue 警告]:客户端呈现的虚拟 DOM 树与服务器呈现的内容不匹配(Nuxt/Vue/lerna monorepo)
[Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content ( Nuxt / Vue / lerna monorepo )
我正在尝试 运行 一个带有外部 Vue 组件的基本 Nuxt 应用程序,该组件是在 lerna monorepo 中使用 vue-cli 构建的。
页面短暂显示组件内容(服务器呈现),然后消失并抛出以下错误。
"export 'default' (imported as 'Header') was not found in 'a2b-header'
接着是
Mismatching childNodes vs. VNodes: NodeList(7) [svg, text, div#app, text, h2.subtitle, text, div.links] (7) [VNode, VNode, VNode, VNode, VNode, VNode, VNode]
最后是红色 Vue 警告
[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.
我用于外部组件的设置是package.json:
{
"name": "a2b-header",
"version": "0.1.0",
"private": true,
"main": "./dist/a2b-header.umd.js",
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build --target lib --name a2b-header src/main.js",
"lint": "vue-cli-service lint"
},
"dependencies": {
"core-js": "^3.4.3",
"vue": "^2.6.10"
},
...
}
我的 main.js 如下所示:
import Header from './Header.vue'
export default Header
和组件文件本身 Header.vue 是:
<template>
<div id="app">
<h1>Welcome to Your Vue.js App</h1>
</div>
</template>
<script>
export default {
name: 'Header'
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
所有内容都被导入到 Nuxt 项目 index.vue 中,使用简单:
import Header from 'a2b-header'
而且....它不起作用。我认为 SSR 与客户端的不匹配与不正确的导出有关,可能可以通过某些 webpack 配置解决,但在尝试了许多不同的事情之后,我在这里苦苦挣扎。
我想让它运行的原因是,在 monorepo 中,我们计划拥有各种 Vue 应用程序(包括 SPA 和 Nuxt),并且将通用代码封装在可跨不同项目重用的组件中的能力至关重要。
您可以尝试使用 包装组件,或将所有 dom 操作移动到已安装的生命周期挂钩。
https://github.com/nuxt/nuxt.js/issues/1700#issuecomment-331099596
这 可能会对您有所帮助
好吧,折腾了好久,解决方法如下。在nuxt.config.js
中,在extend函数的build block中我们需要添加:
extend (config, ctx) {
config.resolve.symlinks = false
}
此设置最终正确构建了一个符号链接到 Nuxt 项目的共享包 node_modules。导出默认错误已消失,因此所有不匹配的 SSR 与 Vnode 警告。
用<ClientOnly> <YourComponent> </ClientOnly>
包装你的组件
前往官方 nuxt 文档了解更多信息:
https://nuxtjs.org/docs/2.x/features/nuxt-components#the-client-only-component
我正在尝试 运行 一个带有外部 Vue 组件的基本 Nuxt 应用程序,该组件是在 lerna monorepo 中使用 vue-cli 构建的。
页面短暂显示组件内容(服务器呈现),然后消失并抛出以下错误。
"export 'default' (imported as 'Header') was not found in 'a2b-header'
接着是
Mismatching childNodes vs. VNodes: NodeList(7) [svg, text, div#app, text, h2.subtitle, text, div.links] (7) [VNode, VNode, VNode, VNode, VNode, VNode, VNode]
最后是红色 Vue 警告
[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.
我用于外部组件的设置是package.json:
{
"name": "a2b-header",
"version": "0.1.0",
"private": true,
"main": "./dist/a2b-header.umd.js",
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build --target lib --name a2b-header src/main.js",
"lint": "vue-cli-service lint"
},
"dependencies": {
"core-js": "^3.4.3",
"vue": "^2.6.10"
},
...
}
我的 main.js 如下所示:
import Header from './Header.vue'
export default Header
和组件文件本身 Header.vue 是:
<template>
<div id="app">
<h1>Welcome to Your Vue.js App</h1>
</div>
</template>
<script>
export default {
name: 'Header'
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
所有内容都被导入到 Nuxt 项目 index.vue 中,使用简单:
import Header from 'a2b-header'
而且....它不起作用。我认为 SSR 与客户端的不匹配与不正确的导出有关,可能可以通过某些 webpack 配置解决,但在尝试了许多不同的事情之后,我在这里苦苦挣扎。
我想让它运行的原因是,在 monorepo 中,我们计划拥有各种 Vue 应用程序(包括 SPA 和 Nuxt),并且将通用代码封装在可跨不同项目重用的组件中的能力至关重要。
您可以尝试使用 包装组件,或将所有 dom 操作移动到已安装的生命周期挂钩。
https://github.com/nuxt/nuxt.js/issues/1700#issuecomment-331099596
这
好吧,折腾了好久,解决方法如下。在nuxt.config.js
中,在extend函数的build block中我们需要添加:
extend (config, ctx) {
config.resolve.symlinks = false
}
此设置最终正确构建了一个符号链接到 Nuxt 项目的共享包 node_modules。导出默认错误已消失,因此所有不匹配的 SSR 与 Vnode 警告。
用<ClientOnly> <YourComponent> </ClientOnly>
前往官方 nuxt 文档了解更多信息:
https://nuxtjs.org/docs/2.x/features/nuxt-components#the-client-only-component