ウェブフロント
- angular
- corewebvitals
- editorconfig
- gatsby
- hls
- html
- javascript
querySelectorAllで取得した要素は配列ではないらしい
JavaScript 配列内のオブジェクトの更新ってどうする?
デバッグ関数とかnullチェック関数をutil/index.tsにおいとけば楽なことに今頃気づいた。
ブラウザからジャイロセンサーを使ってみる
JS 画像のアップロード、プレビュー機能を実装
「数値から各桁の値を取り出す処理」って言われたら数学的な処理が一番に思い浮かぶけど、JSならそんなことなかった。
Callback時代の関数をPromise化する
個人的実装されてほしいECMA Script Proposal
JavaScriptのprototypeを使う
音声をなみなみさせる
AudioWorkletとAudioWorkletProcessorを使って音声のビジュアライゼーション
- next
- nuxt
- playwright
- prettier
- react
- reactnative
- tensorflowjs
- tools
- typescript
- wasm
- websocket
- ポエム
- 開発環境
サーバー
その他
最近のコンポーネント設計
最近、Graphql の組み合わさったフロントエンドの案件を担当しています。
そのときに考えた、良い感じのコンポーネント設計について話します。
Book という型が GraphqlCodegen などのツールによって生成されているとき、
その型を最大限利用しながらコンポーネントを組むのがよいです。
以下がその例です。
type Book = {
title: string;
author: User;
publishedAt: number;
ISBN: string;
genre: string[];
summary: string;
coverImageKey?: string;
publisher?: string;
price?: number;
};
// 必要なものだけをPick する
type BookCardProps = {
book: Pick<
Book,
'title' | 'author' | 'publishedAt' | 'coverImageKey' | 'genre'
>;
};
const BookCard = ({ book }: BookCardProps) => {};
TypeScript の Pick を使って必要な型だけを取り出します。
この設計の良いところは、必要十分なドメイン知識のみをコンポーネントに露出できるところです。
Storybook を利用しているプロジェクトでは 必要以上の型をProps に渡しているとで、無駄なプロパティを渡す必要がでてきます。
type BookCardProps = {
book: Book;
}
// 実際は title と coverImageKey しかつかわない
const BookCard = ({ book }: Book) => {}
--- storybook ---
<BookCard book={{
title: 'エンジニアの知的生産術',
coverImageKey: '/cover/hoge.jpg',
// ↓ 不要なプロパティを渡す必要がある
ISBN: '',
summary: '',
}}
またBookCardProps で個別で命名をすることによる、チーム開発時表記揺れを防げます。
// チーム開発時あるある
type BookCardProps = {
name: string; // Book.title のこと
thumbnail: string; // Book.coverImageKey のこと
};
以上、最近のコンポーネント設計で考えていることでした。
公開日 2023/08/11
Thanks you for reading.