【React】個人開発で使用したパッケージ9選(メジャーなものを除く)

# はじめに

個人開発で使用したパッケージを公開している記事をあまり見かけた気がしないので作りました。
紹介するのはReact, TypeScript, Firebaseの個人開発で使用したパッケージで、axiosのようなメジャーなものは除外しています。

# blueimp-load-image

https://github.com/blueimp/JavaScript-Load-Image

画像圧縮をしてくれるパッケージです。
Stripe管理画面に登録できる画像が2MB以下と指定されていたのでそちらの対策のために採用しました。
以前canvasを使って画像を圧縮する実装をしたのですが、一から作っていくとかなり苦労した記憶があるのでパッケージがないか探したところ`blueimp-load-image`を見つけた次第です。

```javascript
const promises = photos.map(
      async (file): Promise<string> => {
        const data = await loadImage(file, {
          maxWidth: 960,
          canvas: true,
        });
        return new Promise((resolve) => {
          (data.image as HTMLCanvasElement).toBlob(
            async (blob) => {
              const uploadPath = `photos/${user.uid}/${file.name}`;
              const img = await projectStorage.ref(uploadPath).put(blob);
              const imgUrl = await img.ref.getDownloadURL();
              resolve(imgUrl);
            },
            file.type,
            0.95
          );
        });
      }
    );

```

上記のコードで実装すると下記画像のように画像を圧縮することができました。（まだ2MB以下になっていないけど）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2175826/263c558d-abb2-1c0f-48b7-1595e5a17fac.png)

実装の手順は下記を参考にしました。

https://zenn.dev/tiwu_dev/articles/72f8d7de22b164

# date-fns

https://date-fns.org/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2175826/dd0a82fc-b139-cca5-1e89-86c3fa9dc1bf.png)

〇〇分前の表示をするために導入しました。
date-fnsは実務使ったことがあるのと、改めて日付系のライブラリを複数調査したのですが下記記事を読んでdate-fnsを採用するに至りました。

https://zenn.dev/imaginelab/articles/68de83f4948fe2


実装している中で日本語表示にする場面で引っ掛かりました。下記記事で解決。

https://qiita.com/cryptobox/items/51abb608fe18a93c911e

# react-loader-spinner / react-responsive-carousel / react-animated-burgers

下記記事で紹介されている３つのパッケージを採用しました。 

https://qiita.com/baby-degu/items/e183b20dd20b20920e00#4-react-countup

紹介されていたreact-animated-burgersはReact16までのものだったので急遽`hamburger-react`を採用。
react-animated-burgersとあまり大きな差異はないと思います。
ドキュメントが分かりやすく、アニメーションも豊富でした。

https://github.com/luukdv/hamburger-react

https://hamburger-react.netlify.app/




# react-cookie

https://github.com/reactivestack/cookies/tree/master/packages/react-cookie/#readme

使うときにちょっとクセがあります。例えばremoveCookieだけ使いたい時

```javascript
const [removeCookie] = useCookies(["products"]);
```

と書きたくなるのですが、これはうまくいきません。cookies, setCookieを使わないとしても下記の順番で呼ばないとうまく機能しないので注意してください。

```javascript
const [cookies, setCookie, removeCookie] = useCookies(["products"]);
```
実装の手順は下記を参考にしました。

https://zenn.dev/iroristudio/articles/0bc4729fefbc41


# react-lazy-load-image-component

https://github.com/Aljullu/react-lazy-load-image-component

画像が多いアプリを作っているので、UIを向上させるために採用しました。
画像の遅延ロードを実装することができます。
パッケージなだけあって様々なオプションを使用することができるのでお勧めです。
widthやobject-fitなどのCSSは直接コンポーネントに当てれば効きます。

```javascript
import { FC } from "react";
import {
  ScrollPosition,
  LazyLoadImage,
  trackWindowScroll,
} from "react-lazy-load-image-component";

type Prop = {
  src: string;
  scrollPosition: ScrollPosition;
};

const Image: FC<Prop> = ({ src, scrollPosition }) => {
  return (
    <LazyLoadImage
      src={src}
      className="image"
      scrollPosition={scrollPosition}
    />
  );
};
export default trackWindowScroll(Image);

```

実装の手順は下記を参考にしました。

https://techblg.app/articles/react-lazy-image-load/

`Lazy loding`にあまり明るくない方はこちらを見ると良いと思います。図解ありで非常にわかりやすいです。

https://techblog.yahoo.co.jp/entry/2020090830016393/

# react-select

https://react-select.com/home

オーバースペックかなと思いましたがReactのキャッチアップ過程で採用。
そのまま個人開発でも使用しています。

```javascript

import Select from "react-select";

  const categories = [
    { value: "development", label: "Development" },
    { value: "design", label: "Design" },
    { value: "sales", label: "Sales" },
    { value: "marketing", label: "Marketing" },
  ];

  type CategoryOp = {
    value: string;
  };

  const Create: FC = () => {
    const [category, setCategory] = useState<CategoryOp | null>(null);
    return (
      <label>
        <span>Category</span>
        <Select
          onChange={(option) => setCategory(option)}
          options={categories}
        />
      </label>
    );
  };

export default Create;
```

下記画像のようなセレクトを簡単に作ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2175826/06118f02-e87d-5158-1c88-90ad02b8268c.png)

# react-tinder-card

https://github.com/3DJakob/react-tinder-card-demo

Tinderみたいなスワイプ機能を実装をするのにドンピシャだったので採用。
あまり実装記事を見なかったので記事を作成しました。
デモ動画、実際に実装しての感想、コードの解説（日本語化）をまとめたものになります。

https://qiita.com/1zushun/items/1e7a833be4a4402f2b74


# 未実装のパッケージ

https://www.npmjs.com/package/react-visibility-observer

先にも述べたように画像の多いアプリを作っているので無限スクロールは入れたいけれどまだ未実装なので紹介だけ。
vue-visibility-observerのreact版（であっているはず）

# さいごに

いかがだったでしょうか。
駆け足になりましたが、以上が個人開発で使用したパッケージです。
もしこれらよりも優れているパッケージ、お勧めのパッケージなどありましたらご教示頂けると幸いです。