Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: SSR hydration error caused by useId #12719

Open
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

tolking
Copy link
Contributor

@tolking tolking commented Mar 23, 2024

Before submitting a pull request, please read the contributing guide.

在提交 pull request 之前,请阅读 贡献指南

Breaking change

使用 vue 3.5 的 useId 来生成 id

@codecov-commenter
Copy link

codecov-commenter commented Mar 23, 2024

Codecov Report

Attention: Patch coverage is 66.66667% with 1 line in your changes missing coverage. Please review.

Project coverage is 93.84%. Comparing base (bd90b6d) to head (23bbe7f).

Files with missing lines Patch % Lines
packages/vant/src/composables/use-id.ts 66.66% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #12719      +/-   ##
==========================================
+ Coverage   89.61%   93.84%   +4.23%     
==========================================
  Files         257      257              
  Lines        6999     7000       +1     
  Branches     1730     1732       +2     
==========================================
+ Hits         6272     6569     +297     
+ Misses        384      375       -9     
+ Partials      343       56     -287     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

return `${name}-${++current}`;
if (typeof window === 'undefined' && !inject(ID_INJECTION_KEY)) {
console.warn(
'[vant useId] Looks like you are using server rendering, we suggest injecting an initial value for the ID. eg: app.provide("van-id-injection", { current: 0 })',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

最好是不需要让用户注入内容,因为这样有点复杂了

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Vue 3.5 会提供一个 hook 来解决这个问题,参考 vuejs/rfcs#557

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

那先等等官方的实现吧。

目前我能够想到避免服务端缓存的最优的方案就是这个。像指令方案改动比较大,或者Nuxt的useId方案不适用于普通的组件库。

@yoyo837
Copy link
Contributor

yoyo837 commented Apr 29, 2024

有进展吗?每天看到无数这种警告。在SSR、SSG 下。

image

@yoyo837
Copy link
Contributor

yoyo837 commented Apr 29, 2024

哦,好吧,等vue那边。

@yoyo837
Copy link
Contributor

yoyo837 commented Sep 4, 2024

Hello, [email protected] is out, let's continue. 3.5.0里包含了SSR下稳定的useId()实现。

@yoyo837
Copy link
Contributor

yoyo837 commented Sep 10, 2024

是不是直接更新版本上来就解决了?🤔

建议把最低依赖升到3.5.0, 发布为一个minor版本。

@tolking
Copy link
Contributor Author

tolking commented Sep 11, 2024

已经修改成了通过 vue 的 useId 生成 id 了,生成的 id 格式和之前的 id 格式保持一致。

更新了 vue 的最低版本,可能对用户的影响比较大

@yoyo837
Copy link
Contributor

yoyo837 commented Sep 14, 2024

@chenjiahan 请帮忙看看

@inottn
Copy link
Collaborator

inottn commented Sep 15, 2024

是不是直接更新版本上来就解决了?🤔

建议把最低依赖升到3.5.0, 发布为一个minor版本。

如果使用 data-allow-mismatch,是不是可以在不更新版本的情况下,暂时解决这个问题 🤔

@yoyo837
Copy link
Contributor

yoyo837 commented Sep 15, 2024

是不是直接更新版本上来就解决了?🤔
建议把最低依赖升到3.5.0, 发布为一个minor版本。

如果使用 data-allow-mismatch,是不是可以在不更新版本的情况下,暂时解决这个问题 🤔

压制警告和让id在ssr和客户端一致应该不是同一回事吧?如果觉得压制警告就是解决问题的话,可以选择这样做,但原始问题应该是解决id不一致

@inottn
Copy link
Collaborator

inottn commented Sep 15, 2024

是不是直接更新版本上来就解决了?🤔
建议把最低依赖升到3.5.0, 发布为一个minor版本。

如果使用 data-allow-mismatch,是不是可以在不更新版本的情况下,暂时解决这个问题 🤔

压制警告和让id在ssr和客户端一致应该不是同一回事吧?如果觉得压制警告就是解决问题的话,可以选择这样做,但原始问题应该是解决id不一致

是不一样,所以我说的是暂时。因为必须升版本才能完全解决这个问题,但对用户而言并不是很友好。

@inottn
Copy link
Collaborator

inottn commented Sep 15, 2024

晚些时候我会创建一个 PR 使用 data-allow-mismatch 暂时消除警告,因为它不会引入任何副作用,如果我们决定升级版本,也可以之后将它移除。

@chenjiahan
Copy link
Member

同意~ 直接用 useId 对用户的 Vue 版本要求太高了,我倾向于过几个月再使用 useId,那个时候 3.5 应该有比较高的使用比例了。

现阶段用 data-allow-mismatch 是一个比较好的过渡方案

@yoyo837
Copy link
Contributor

yoyo837 commented Sep 15, 2024

那意味着我诉求id一致的话应该重新创建一个新issue?

@yoyo837
Copy link
Contributor

yoyo837 commented Sep 21, 2024

或者,能不能写兼容代码?如果是3.5.0的useId就优先使用,否则使用 data-allow-mismatch 压制警告

@chenjiahan
Copy link
Member

import { useId } from 'vue' 这种 import 语句没法写兼容代码

@tolking
Copy link
Contributor Author

tolking commented Sep 24, 2024

或者,能不能写兼容代码?如果是3.5.0的useId就优先使用,否则使用 data-allow-mismatch 压制警告

如果想使用 vue 中的 useId,现在你可以通过 pnpm patch 这类方式修改源码。或者一个插件

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants