Ref callbackとcleanup functions
Ref callback、React v19で追加されたクリーンアップ関数、useEffectとの違いについて。また特にクリーンアップ関数を使ったRef callbackの実装例。
入力して検索を開始
Ref callback、React v19で追加されたクリーンアップ関数、useEffectとの違いについて。また特にクリーンアップ関数を使ったRef callbackの実装例。
React v19ではグローバルなJSX名前空間が削除されたため、これを利用している場合に型の変更が必要になる。
Next.jsを利用したサービスでPlaywrightテストをローカル実行する際に、ReactDevOverlayを非表示する方法について
個人的には出来る限りスコープ外の関数としてコンポーネントを切り出すべきだと考えている。パフォーマンス、コードとしての質、将来性の観点から説明を行った
React v19でstyleタグと@scopeを使って、いくつかのCSS-in-JSライブラリのようにclassNameを指定せずにスタイルのカプセル化が出来るのかを検証した。
React Routerを利用している環境で、一度エラーが表示された後に、パスパラメーターが異なるURLに遷移しても、ErrorBoundaryによって表示されたエラーが画面から消えないと相談を受けた。その理由と対応策について書いた。
公式ドキュメントを十分に読んでいないと理解が難しいと思われるParallel routesが404になる理由やdefault.jsの意味について、タブの実装を例に書いた。
React公式ドキュメントを見ながらReact 19の新機能を見る会を主催した際のメモです。多くは最低限このくらいの理解はしておいた方がいいという内容を事前に羅列しておいたものですが、一部その場で話題になった内容も含まれています。
ESLintで特定のpropsを禁止にしたい場合の設定方法について説明する。
ESLintで特定の要素の利用を禁止したい場合の設定方法について説明する。
ESLint v9がリリースされたが、ESLint pluginのESLint v9対応が出来ていないpluginが複数あり、その対応状況を調査した。
Propsから受け取ったrefを内部的なrefとマージする方法を紹介する。
refが取れないので非制御コンポーネントに出来ないという相談を受けたので、非制御コンポーネントとrefの関係について説明した
useRefでステートを管理する是非について質問を受けたので、個人的な意見をまとめた。
useEventの後継として提案されているuseEffectEventについてのメモ。
data-属性やaria-属性などは、型定義がJSXに含まれていなくても型エラーになりません。この理由や型エラーになるケースについて紹介します。
ReactコンポーネントをJSX形式ではなく、ただの関数として呼ぶとバグの原因になる場合がある。これが原因のバグの相談を度々受けるので、問題になる例と対策をまとめた。
React v18.2.0時点ではexperimentalなuseFormStatusを利用すると、重複送信を防ぐボタンを簡単に実装できる。
reactwg/server-componentsのDiscussionsで公開された`Why do Client Components get SSR'd to HTML? `のRSCの説明が分かりやすい。
React Router v6に移行する際に気を付けるべき点や、移行時に受けた質問をまとめました。
ReactのRouterライブラリなどでパスの書き間違いを防ぎたいと聞かれたので、いくつかの方法を提示した際のメモ。
ページにフォーカスを戻すと入力要素に入力していた内容が吹き飛ぶ場合があるという相談を受けたため、その調査と対応についてまとめた。
Playwrightを利用したE2Eテストで稀に要素が取得できなくなり失敗すると相談を受けた際の対応についてまとめた。
Reactの状態管理ライブラリであるJotai、Recoil、Redux、Zustandについて比較した雑感。
React Router v6でパスパラメータが変更された際も再レンダリングをトリガーする方法を紹介する。
Prism.jsを利用していると対応言語に書かれているがハイライトされない言語がいくつかあった。これはprism-react-rendererからprismjs本来の機能を使うように移行した際のメモです。
Reactのイベント型について書いた。React.MouseEvent、React.ChangeEvent、React.SyntheticEvent、NativeのEvent型、React.XXXEventHandlerなどについて、どれを使うべきか。
ReactのFunction Componentの型は、歴史的な理由などにより様々な記述ができる。React.FunctionComponent、React.FC、React.VFC、(props: SomeComponentProps): JSX.Elementなどがある。
Reactのpropsをunion typeにする方法をいくつか紹介する。ただし、これらの利用やそもそもunion typeをpropsに使うこと自体が適切かどうかは慎重に検討する必要がある。
ReactとTypeScriptでHTML属性を拡張する方法について書いた。React.ComponentPropsWithoutRefやReact.ComponentPropsWithRef、React.ComponentProps、JSX.IntrinsicElements、React.DetailedHTMLProps、React.ButtonHTMLAttributes、React.HTMLProps、React.AllHTMLAttributes、React.HTMLAttributesなど。
Fire-and-forgetパターンつまりuseEffectOnceのようなコードをuseEventでどのように置き換えられるか
会社にて、ほとんどのサービスのReactのバージョンをアップグレードするイベントを開催した際のQ&Aなどをまとめました。
要素を返す前にstateを更新すると何が起きるかのクイズ。
リリースされたばかりのReact Router V6のOutletを使って、ページコンポーネントを遅延読み込みするいい感じの方法を考えた。
React-Routerでリダイレクトさせる際にreplaceさせないと、リダイレクトされるページの前にいたページに戻れなくなるのは当たり前だと思うが、質問があったのでまとめた。
ReactにおいてgetElementByIdやquerySelectorを避けた方が良い理由の説明。
useEffectのdepsに依存関係を入れる理由について解説する。
Chrome 135でサポートされたCSS Overflow Module Level 5によるCSSカルーセルの実装方法
list-styleを無効化したul要素にlistロールを指定すべきという方針はアンチパターンである可能性が高い。
CSSがサポートしている色空間の特性や歴史的な経緯、カラーパレットを生成する場合にOKLCH色空間の利用を推奨する理由について解説する。
React v19でstyleタグと@scopeを使って、いくつかのCSS-in-JSライブラリのようにclassNameを指定せずにスタイルのカプセル化が出来るのかを検証した。
overflow-yを指定したら、縦スクロールバーが表示されるようになる状況の解説と対処法について書いた。
textareaにfield-sizing: content; width: 100%;などを指定しても親要素の幅を超えてしまうという相談を受けたので、その原因と対応についてまとめた。
position: stickyが効かないという質問を受けたことが度々あったので、その原因と解決策についてまとめた。
Chrome 124からaspect-ratioが指定されたgridアイテムがoverflowするようになったという報告があったので、その理由と対処方法についてまとめた。
file-selector-buttonを利用してinput[type="file"]を装飾する方法とその是非について。
動的的にコンテンツが増えるようなサービスでは、クラシックスクロールバーによって画面が崩れたような印象を与えてしまう場合がある。この記事では、クラシックスクロールバーとオーバーレイスクロールバーの軽い説明と、scrollbar-gutterによる対策を説明する。
Noto Sansを使った際に、他のフォントと比べて下にずれたように見える問題についての調査をまとめた。
iPhoneで見るとフォーム画面が崩れる問題について調査した結果をまとめた。
CSS Media Query、特にmin-widthまたはmax-widthを利用する場合に気を付けた方が良いパターンや知見について紹介する。これらのメディア特性が自由に扱われているスタイルは破綻しやすい。
2022年10月時点でのCSS in JSについてのメモ。Zero Runtime CSS in JSやZero-runtime CSS in JSライブラリの比較など。
@media printや@page、break-inside、break-before、break-after、print-color-adjustなどを利用して印刷時の見た目を調整する方法を紹介する。
CSS変数に色をそのまま宣言するのではなく、パラメーターを持たせておくことで、`rgb()`や`hsl()`、`lch()`などの関数に渡して、色を生成する方法を紹介する。
Safari 16でサポートされ、全ての主要なブラウザで利用できるようになったtext-align-lastについて紹介する。
OIDC Trusted publishingを用いたnpmパッケージの公開方法およびTrusted publishingのメリットと制約について。
GitHub CLIを利用してリリースノートを生成する方法とGitHub Actionsでの使用例の紹介
Botなどが作成したPull Requestに対して、GitHub Actionsを利用して通常より多くのApproveを要求する方法
NetlifyにはDeployを自動的に削除する機能があるが、よりコントロールしたい場合にはNetlify APIが利用できる。この記事では、Github Actionsで自動的にNetlifyのDeployを削除する方法について紹介する。
QRコードを生成するライブラリは多く存在する。また、一時的なもので良ければURLで生成できるサービスもある。
gh pr createでレビュワーをチームにする場合、追加で`read:org`の権限が必要になるため、デフォルトのsecrets.GITHUB_TOKENでは動作しなくなる。`repo`と`read:org`の権限を持ったPersonal Access Tokenを使うことで解決できる。
Github Actionsのmatrixのアイテムを条件によって切り替える方法について
Githubの検索については公式ドキュメントが十分にまとめられている。しかし、少し辿りにくいようなので、人に共有しやすいように公式ドキュメントのリンクや一部の記述についてまとめた。
Github ActionsにおけるNode.jsパッケージのキャッシュについて、actions/setup-nodeの推奨する方法やnode_modulesをキャッシュする方法、その周辺について紹介する。
actions/setup-nodeではnode-version-fileを利用することで、利用されるNode.jsのバージョンをpackage.jsonなどに合わせることが出来る。これだけで便利だが、他にもお勧めできる不純な理由がある。
actions/setup-nodeのcacheが期待通りに動作しないことは認識していたが、改めて調べたらそもそもnode_modulesをキャッシュしないことが分かった。
Github WorkflowsでEnvironment SecretsやEnvironment Variablesを使って環境に応じて異なるSecretsやVariablesを使う方法を紹介する。
Github Actionsのpull_requestトリガーのworkflowがなぜか実行されていないという相談を受けたので、その原因と解決策についてまとめた。
RenovateがPRを作成するタイミングをnot-pendingにしている場合、Githubのブランチプロテクションでpull_requestトリガーのGithub Workflowを必須にしているとPRが作成されなくなることについて説明する。l
Github Workflowsが落ちたらIssueを作らせる方法について調査した結果をまとめた。
GithubでReviewer全員のApprovedを必須にする方法を紹介するが、おすすめしない。
Playwirght v1.49の変更によるChromiumのダウンロードコストの変化を計測した。
Next.jsを利用したサービスでPlaywrightテストをローカル実行する際に、ReactDevOverlayを非表示する方法について
Playwrightのテスト結果を動画で録画する方法について紹介する。
Playwrightのテスト改善をしてほしいという相談を受けた際の対応をまとめた。
PlaywrightでFileChooserオブジェクトを利用してファイル選択をエミュレートする方法について紹介する。
Playwrightのスクリプトを自動生成する方法について紹介する。
Playwrightを利用したE2Eテストで稀に要素が取得できなくなり失敗すると相談を受けた際の対応についてまとめた。
CI上でPlaywrightのテストが落ちた場合、どのようなことを確認すると良いか書いた。
PlaywrightでAPIのレスポンスを差し替える方法について紹介する。
Playwrightでページ内で発生したエラーを検出する方法について紹介する。
Playwrightをheadedまたはデバックモードで実行する方法について紹介する。
PlaywrightでCookieやLocal storageをstate.jsonに保存してセッションを再利用する方法について紹介する。
Playwrightでページ内で任意のスクリプトを実行する方法について紹介する。
PlaywrightでVisual Regression Testingを行う方法について紹介する。
RenovateとDependabotを併用する場合、CODEOWNERSファイルを活用することでレビュワー設定を一元管理できる。
Renovateが作成するPR数を削減しレビュー負荷を軽減する設定パターンをいくつか紹介する
Dependabot Alertを有効化するだけで、RenovateがセキュリティPRを投げてくれるようになる
RenovateのDependency DashboardからConfigを新しいスキーマに移行できるようになった。
Renovateでauto mergeを有効化した上で、Githubのブランチプロテクションでレビューを必須にした場合、適切な対応を行わなければオートマージが行われずレビュワーも設定されない。これによりRenovateのPRが見逃されるケースがあり、相談を受けた際の説明をまとめた。
Renovateでレビュワーを指定する際、Githubで設定したチームを指定することで、放置される可能性を減らしたり、チームメンバーが変わっても設定を変更する必要がなくなるなどのメリットを受けられる。
Renovateには特定のファイルやディレクトリを無視させる機能があり、デフォルトではnode_modulesなどを無視するようになっている。
Renovateは公式が設定をバリデーションする機能を提供している。
RenovateがPRを作成するタイミングをnot-pendingにしている場合、Githubのブランチプロテクションでpull_requestトリガーのGithub Workflowを必須にしているとPRが作成されなくなることについて説明する。l
Renovateにはパッケージを別のパッケージに差し替える機能がある。
Renovateでnpm.rangeStrategyをpinにするとengineもpinされてしまう問題について解決策をまとめた。
GithubでReviewer全員のApprovedを必須にする方法を紹介するが、おすすめしない。
Renovateでスケジュールが機能しないという相談を受けた際に調べたところ、技術的に分単位の制御が出来ないことが分かった。
RenovateでGolangのバージョンが上がらないと相談を受けた際に調べた内容をまとめた。
golangci-lintのソースからのインストールは動作が保証されていません。バイナリをインストールするべきです。
Go 1.24でgolangci-lintを扱うには、Go 1.24でビルドされたgolangci-lint 1.64以上である必要がある
型パラメータを持つ型と具体的な型は区別される。
Custom matcherを利用するか、Doメソッド内で検証するか
PDFを出力するツールやライブラリにはバリアブルフォントを対応していないものがあり、意図した表示にならない場合がある。
取得できるBigQueryのフィールドの型のいくつかは、クエリにそのまま利用することが出来ない。GolangのBigQueryパッケージを利用してスキーマを取得し、クエリで利用できるように変換する方法について。
exclude-dirsで、特定のディレクトリを除外することができる。
CircleCI上で特定のmoduleをインストールさせたらrequires go >= 1.22で落ちたと質問を受けた際の対応についてまとめた。
go mod tidyを実行したらruntime error: invalid memory address or nil pointer dereferenceエラーが発生した問題について解決策をまとめた。
Goのバージョンをv1.21に上げたら、golangci-lint v1.52でerrors parsing go.mod: … unknown directive: toolchainとエラーが出る問題について解決策をまとめた。
RenovateでGolangのバージョンが上がらないと相談を受けた際に調べた内容をまとめた。
Polyfillがアップデートしたライブラリに適用されておらず、古いブラウザで利用できないメソッドが呼び出されランタイムエラーが発生していた。Polyfillを適用する設定を見直すことで対応した。
macOSで開発を行っていると遭遇した「RangeError: Invalid WebSocket frame: RSV1 must be clear」エラーについて調査した際のログ。
Next.jsを利用したサービスでPlaywrightテストをローカル実行する際に、ReactDevOverlayを非表示する方法について
ページを離れた際に呼ばれるブラウザイベントについて、共有したくなったので改めて少し調査した上でまとめた。
個人的には出来る限りスコープ外の関数としてコンポーネントを切り出すべきだと考えている。パフォーマンス、コードとしての質、将来性の観点から説明を行った
ブラウザでは音声の自動再生を防ぐ目的で、音声の再生が制限されている。この記事では、特に制限が厳しいと言われるiOS Safariについて、その制限と回避策の検証を行った内容をまとめる。
Canvas APIを利用してマウスに追従するエフェクトを付与する方法を紹介する。
data-属性やaria-属性などは、型定義がJSXに含まれていなくても型エラーになりません。この理由や型エラーになるケースについて紹介します。
JWTをクライアントでデコードする際にエラーが出る場合があると相談を受けた際の調査結果をまとめた。
Day.jsのisValidメソッドの判定が緩いのは何故かと質問を受けたので、その理由についてまとめた。
Astroはstylesheetを巻き上げてしまうため、preconnectなどの指定より前にGoogle Fontsの読み込みが開始されパフォーマンスが悪化する可能性がある。
ページを離れた際に呼ばれるブラウザイベントについて、共有したくなったので改めて少し調査した上でまとめた。
ブラウザでは音声の自動再生を防ぐ目的で、音声の再生が制限されている。この記事では、特に制限が厳しいと言われるiOS Safariについて、その制限と回避策の検証を行った内容をまとめる。
無効化されたbuttonやinputなどのインタラクティブ要素にツールチップを表示したいという相談を複数回受けたので、その問題点と代替手段についてまとめた。
file-selector-buttonを利用してinput[type="file"]を装飾する方法とその是非について。
iOSでinputにフォーカスするとズームしてしまう問題について調査した結果をまとめた。
iPhoneで見るとフォーム画面が崩れる問題について調査した結果をまとめた。
フォームでsubmit buttonを押下すると上の方になぜかスクロールされるという相談を受けたので、その原因と対応についてまとめた。
autoComplete/autoFillを完全に防ぐ方法について質問を受けたので、その対処方法についてまとめた。
GitHub CLIを利用してリリースノートを生成する方法とGitHub Actionsでの使用例の紹介
Dependabot Alertを有効化するだけで、RenovateがセキュリティPRを投げてくれるようになる
Sub-issuesを利用することで、GitHubで完結したIssue管理、特に進捗管理が容易になる。
Renovateでauto mergeを有効化した上で、Githubのブランチプロテクションでレビューを必須にした場合、適切な対応を行わなければオートマージが行われずレビュワーも設定されない。これによりRenovateのPRが見逃されるケースがあり、相談を受けた際の説明をまとめた。
Renovateでレビュワーを指定する際、Githubで設定したチームを指定することで、放置される可能性を減らしたり、チームメンバーが変わっても設定を変更する必要がなくなるなどのメリットを受けられる。
Github WorkflowsでEnvironment SecretsやEnvironment Variablesを使って環境に応じて異なるSecretsやVariablesを使う方法を紹介する。
ESLint Config InspectorをGithub Pagesにデプロイする方法について紹介する。
ESLintのno-restricted-globalsルールを利用することで、グローバル変数を禁止して、意図しないグローバル変数への参照を防ぐ。
ESLintのあるプラグインを更新する際にエラーが出ているルールの一覧が欲しいという話があったので、jqを利用してエラーが出ているルールをリスト表示する方法を考えた。
ESLintで特定のpropsを禁止にしたい場合の設定方法について説明する。
ESLintで特定の要素の利用を禁止したい場合の設定方法について説明する。
ESLint Config InspectorをGithub Pagesにデプロイする方法について紹介する。
ESLint v9がリリースされたが、ESLint pluginのESLint v9対応が出来ていないpluginが複数あり、その対応状況を調査した。
ESLintをv8に上げたら特定のルールでhasSuggestionを設定していないと言われると相談があったので、その対応についてまとめた。
React v19ではグローバルなJSX名前空間が削除されたため、これを利用している場合に型の変更が必要になる。
data-属性やaria-属性などは、型定義がJSXに含まれていなくても型エラーになりません。この理由や型エラーになるケースについて紹介します。
Reactのイベント型について書いた。React.MouseEvent、React.ChangeEvent、React.SyntheticEvent、NativeのEvent型、React.XXXEventHandlerなどについて、どれを使うべきか。
ReactのFunction Componentの型は、歴史的な理由などにより様々な記述ができる。React.FunctionComponent、React.FC、React.VFC、(props: SomeComponentProps): JSX.Elementなどがある。
Reactのpropsをunion typeにする方法をいくつか紹介する。ただし、これらの利用やそもそもunion typeをpropsに使うこと自体が適切かどうかは慎重に検討する必要がある。
ReactとTypeScriptでHTML属性を拡張する方法について書いた。React.ComponentPropsWithoutRefやReact.ComponentPropsWithRef、React.ComponentProps、JSX.IntrinsicElements、React.DetailedHTMLProps、React.ButtonHTMLAttributes、React.HTMLProps、React.AllHTMLAttributes、React.HTMLAttributesなど。
VitestではFake Timer APIを利用することで時間に依存するコードを柔軟に且つ短時間でテストすることができる。
フロントエンドテスト講座を行った際の内容をまとめた。
VitestのspyOnは、Jestなどと異なり同一ファイルの別関数をモックできない。ただし、これはVitestのスコープ外の問題であり、Jestなどでも同条件であれば同様の制限が発生する。
Vitestでモックが上手く動作しないと相談されたので、その理由などについてまとめた。