使用client-only 解决组件不兼容SSR问题

目录

前言

一、解决方案

1.基于Nuxt 框架的SSR应用 

2.基于vue2框架的应用

3.基于vue3框架的应用 

二、总结

往期回顾


我的博客原文:使用client-only 解决组件不兼容SSR问题

前言

最近在我的单页面SSR应用上开发JSON编辑器功能,在引入组件后直接客户端跳转OK,但是在直接加载服务端渲染的时候一直报这个错误:[vite] Error when evaluating SSR module /node_modules/json-editor-vue3/lib/json-editor.vue: failed to import "jsoneditor"

经过查阅资料才知道是组件不兼容SSR,下面我总结了下该问题的解决方案,希望能帮到大家! 

一、解决方案

1.基于Nuxt 框架的SSR应用 

Nuxt框架提供了client-only插件来解决这个问题。

npm:https://www.npmjs.com/package/client-only

SSR场景下只需要将组件包裹起来就ok啦! 

2.基于vue2框架的应用

Vue2提供了vue-client-only插件来解决这个问题。

npm:https://www.npmjs.com/package/vue-client-only 

那么怎么使用呢?

插件安装

yarn add vue-client-only

 模板使用

<template>
  <div id="app">
    <h1>My Website</h1>
    <client-only>
      <!-- this component will only be rendered on client-side -->
      <comments />
    </client-only>
  </div>
</template>

<script>
  import ClientOnly from 'vue-client-only'

  export default {
    components: {
      ClientOnly
    }
  }
</script>

注意:这个是基于vue2的插件,vue3可能不适用。

3.基于vue3框架的应用 

vue3有大神解决了vue不兼容的问题。使用@duannx/vue-client-only插件来修复。

npm:https://www.npmjs.com/package/@duannx/vue-client-only

插件安装

npm install --save @duannx/vue-client-only
or
yarn add @duannx/vue-client-only

 模板使用

<template>
  <client-only>
    <json-editor-vue
      v-model="resultInfo"
      :show-btns="false"
      :mode="'tree'"
      lang="zh"
      :expanded-on-start="true"
      @json-change="onJsonChange" @json-save="onJsonSave"
    />
  </client-only>
</template>

<script lang="ts">
import ClientOnly from '@duannx/vue-client-only';
import JsonEditorVue from 'json-editor-vue3';
export default defineComponent({
  name: 'JsonFormat',
  components:{
    JsonEditorVue,
    ClientOnly
  },
  setup() {
    // json编辑器内容变化
    const onJsonChange = (value:any) => {
      console.log('value:', value);
    };
    // json编辑器内容保存
    const onJsonSave = (value:any) => {
      console.log('value:', value);
    };
    // 返回
    return {
      onJsonChange,
      onJsonSave,
      	// 在data中添加测试数据
      resultInfo: {
        'test1': '1234',
        'test2': '5678'
      }
    };
  }
});
</script>

 问题完美修复啦!YYDS!

二、总结

client-only 被挂载之前, 使用此属性作为文本占位符,组件只会在客户端被渲染,所以服务端加载不会再报错。今天就分享到这里啦!欢迎在评论区交流。如果文章对你有所帮助,❤️关注+点赞❤️鼓励一下博主会持续更新。。。。

往期回顾

 css实现元素居中的6种方法 

Angular8升级至Angular13遇到的问题

前端vscode必备插件(强烈推荐)

Webpack性能优化

vite构建如何兼容低版本浏览器

前端性能优化9大策略(面试一网打尽)!

vue3.x使用prerender-spa-plugin预渲染达到SEO优化

 vite构建打包性能优化

 vue3.x使用prerender-spa-plugin预渲染达到SEO优化

 ES6实用的技巧和方法有哪些?

 css超出部分显示省略号

vue3使用i18n 实现国际化

vue3中使用prismjs或者highlight.js实现代码高亮

什么是 XSS 攻击?什么是 CSRF?什么是点击劫持?如何防御

  • 53
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用Nuxt.js设置客户端渲染时,可能会出现DOM不一致的错误。这是因为在服务器端渲染时,Nuxt.js会生成HTML字符串,并将其发送到客户端。但是,在客户端加载并渲染时,由于客户端和服务器端的环境不同,可能会导致DOM不一致的问题。 为了解决这个问题,可以使用`<client-only>`标签来包装只在客户端渲染的组件或代码。这样,在服务器端渲染时,这些组件或代码将被忽略,只会在客户端加载和渲染时执行。 例如,在页面中使用`<client-only>`包装动态加载的组件: ```html <template> <div> <h1>My Page</h1> <<client-only> <DynamicComponent /> </client-only> </div> </template> <script> export default { components: { DynamicComponent: () => import('@/components/DynamicComponent.vue') } } </script> ``` 在这个例子中,`<DynamicComponent>`组件只会在客户端加载和渲染时执行,避免了在服务器端渲染时出现DOM不一致的问题。 如果仍然出现DOM不一致的错误,可以尝试使用`<no-ssr>`标签来包装只在客户端渲染的代码。`<no-ssr>`标签与`<client-only>`标签类似,但是它会在服务器端渲染时渲染,只有在客户端加载和渲染时才会执行其中的代码。 ```html <template> <div> <h1>My Page</h1> <<no-ssr> <DynamicComponent /> </no-ssr> </div> </template> <script> export default { components: { DynamicComponent: () => import('@/components/DynamicComponent.vue') } } </script> ``` 使用`<no-ssr>`标签可能会导致服务器端渲染时加载的速度变慢,因为它会在服务器端渲染时执行其中的代码。因此,应该根据具体情况选择使用`<client-only>`或`<no-ssr>`标签。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

富朝阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值