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

feat!: useId の独自実装を削除し、React 18 未満のサポートを終了する #4920

Merged
merged 2 commits into from
Sep 17, 2024

Conversation

s-sasaki-0529
Copy link
Contributor

@s-sasaki-0529 s-sasaki-0529 commented Sep 13, 2024

関連URL

https://smarthr.atlassian.net/browse/SHRUI-1047

概要

React 17 以下にも提供していた独自の userId の仕組みを廃止します。これによって事実上 React 18 未満のサポートを終了します。

変更内容

SmartHR UI が提供する useId は、React 組み込みの useId をラップし、一部機能を拡張して提供しています。

その中で、useId が存在しない React 18 未満でも使用できるように、同等の機能を独自実装していました。

独自実装では useContext が使われていますが、これによって、 useId を使用している各種コンポーネントがサーバーコンポーネントとして利用できない問題が発生しています。

RSC 対応を進めたいという気持ちと、React 18 未満のサポートはぼちぼち終了しても良さそうという背景から、独自実装を廃止し、React 18 のみをサポートするように変更します。

確認方法

React 18 を使用している場合には影響は一切ありません。

React 17 以下を使用している場合、SmartHR UI を使用することができなくなるため、SmartHR UI のバージョンアップを止めるか、React をバージョンアップしてください。

Copy link

pkg-pr-new bot commented Sep 13, 2024

Open in Stackblitz

pnpm add https://pkg.pr.new/kufu/smarthr-ui@4920

commit: 38bd8ee

@s-sasaki-0529 s-sasaki-0529 self-assigned this Sep 13, 2024
@@ -127,6 +127,3 @@ export { defaultBreakpoint } from './themes/createBreakpoint'

// constants
export { FONT_FAMILY, CHART_COLORS, OTHER_CHART_COLOR } from './constants'

// utils
export { SequencePrefixIdProvider } from './hooks/useId'
Copy link
Contributor Author

Choose a reason for hiding this comment

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

こちらもリポジトリ内及び社内では一切使用されていなかったのであわせて削除してます。

}
return <IdContext.Provider value={value}>{children}</IdContext.Provider>
// eslint-disable-next-line react-hooks/rules-of-hooks
return React.useId()
Copy link
Contributor Author

Choose a reason for hiding this comment

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

ここ、 if (defaultId) 分岐の下に Hooks が登場するので、Hooks の制約違反で警告が出てしまうので無視してます。

修正前 (return ('useId' in React ? React.useId : useId_OLD)()) は動的にコードを組み立ててた都合、さすがの ESLint も検知できなかったようです。

コンポーネント内で defaultId を渡すか渡さないかが描画ごとに異なる場合におかしな挙動になる可能性があるなぁと感じますが、これまで異常がなかったので大丈夫かなと思ってます。

Copy link
Contributor Author

@s-sasaki-0529 s-sasaki-0529 Sep 13, 2024

Choose a reason for hiding this comment

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

あるいはこうすることで回避するほうが安全かも…?

export const useId = (defaultId?: string): string => {
  const id = React.useId()
  return defaultId || id
}

Copy link
Contributor

@atzzCokeK atzzCokeK Sep 17, 2024

Choose a reason for hiding this comment

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

@s-sasaki-0529 上記でいただいているコードのほうが良いと思いました!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

厳密には挙動が変わることになるからためらってたんですが、少なくとも悪化することは無さそうなのでそうしちゃいます!

"react": "16.13.0 || ^17.0.1 || ^18.0.0",
"react-dom": "16.13.0 || ^17.0.1 || ^18.0.0",
"react": "^18.0.0",
"react-dom": "^18.0.0",
Copy link
Contributor Author

@s-sasaki-0529 s-sasaki-0529 Sep 17, 2024

Choose a reason for hiding this comment

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

事実上、React 17 以下で使えないコンポーネントが生まれることになるのでここも変えちゃってよいですよね。
のでこっちのほうがインパクト強いという意味で、PRタイトルに含めてます。

@s-sasaki-0529 s-sasaki-0529 marked this pull request as ready for review September 17, 2024 01:04
@s-sasaki-0529 s-sasaki-0529 requested a review from a team as a code owner September 17, 2024 01:04
@s-sasaki-0529 s-sasaki-0529 requested review from atzzCokeK and hiroki0525 and removed request for a team September 17, 2024 01:04
Copy link
Contributor

@atzzCokeK atzzCokeK left a comment

Choose a reason for hiding this comment

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

提案いただいているhooks部分だけは修正したほうが良いとおもいました〜!

}
return <IdContext.Provider value={value}>{children}</IdContext.Provider>
const id = React.useId()
return defaultId || id
Copy link
Contributor Author

Choose a reason for hiding this comment

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

#4920 (comment)
この辺のやりとりもあって実装ちょっと調整してます。

Copy link
Collaborator

Choose a reason for hiding this comment

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

defaultId を渡す機構は必要なのか気になりました。

Copy link
Contributor Author

Choose a reason for hiding this comment

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

プロダクト側からIDを明示したい場合にそれを使用して、指定がなければランダム値を使うみたいな用途っぽいですね。

useId がその機構を持たずに、コンポーネント側に分岐を書けば良いという説はあるし、そのほうが健全な気もします。

Copy link
Contributor

@atzzCokeK atzzCokeK left a comment

Choose a reason for hiding this comment

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

自分はgogoに見えています!

Copy link
Contributor

@Qs-F Qs-F left a comment

Choose a reason for hiding this comment

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

シュッとしてて良さそうでした!

Copy link
Collaborator

@uknmr uknmr left a comment

Choose a reason for hiding this comment

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

kufu 内を調べてみましたが、useId(someId) の形で使っているのは、smarthr-ui のみ(Checkbox、RadioButton、Switch)でいずれも someId || useId() と同等の使い方でした。
useId() に defaultId を渡した場合に、存在すれば defaultId が返ってくるのは useId の責務ではないと考えられるので、消しても良いと思います。
https://github.com/search?q=org%3Akufu+useId&type=code

@s-sasaki-0529
Copy link
Contributor Author

@uknmr

useId() に defaultId を渡した場合に、存在すれば defaultId が返ってくるのは useId の責務ではないと考えられるので、消しても良いと思います。

仰るとおりなのでやっていきなんですが、PR は分けても良いですか…?

React 17 で使えなくなるのはユーザー影響ありありですが、内部での id の決定方法はユーザー影響を出さないリファクタになるし、検証観点も異なってくるので切り分けて扱いたいです!

Copy link
Collaborator

@uknmr uknmr left a comment

Choose a reason for hiding this comment

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

@s-sasaki-0529 分けるで 👌 です!

@s-sasaki-0529
Copy link
Contributor Author

レビューありがとうございました!
このあとちょっと時間取れそうなので続けて次のPR出せるようトライしますが、とりあえずここまでマージしちゃいます!

@s-sasaki-0529 s-sasaki-0529 merged commit 28e590e into master Sep 17, 2024
10 checks passed
@s-sasaki-0529 s-sasaki-0529 deleted the SHRUI-1047 branch September 17, 2024 05:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants