技術選定しよう！~ dnd編 ~

# 技術選定しよう！
技術選定は、重要で大変な作業ですよね。
適切な技術を選ぶためには、候補をしっかりとリストアップし、それらを比較し根拠を持って判断することが欠かせません。
そこでこの記事では、技術選定を行う際のポイントや役立つ情報について紹介しています。
それにより、担当システムに最適な選択肢を見つける手助けとなるでしょう。
ぜひこの記事を参考にして、より適切な技術選定ができるようにしてください！

# 今回選定する技術
今回選定するのは

「<font color="DarkOrange">**dndライブラリ**</font>」　です！

所謂ドラッグ&ドロップ機能の実装になります。
AppleMusicやAsanaなどにも使われている主要な機能です。

# 候補一覧
ダウンロード数が多い下記4つのライブラリをピックアップしました！
- [dnd-kit](https://dndkit.com/)
- [react-beatiful-dnd](https://github.com/atlassian/react-beautiful-dnd)
- [react-dnd](https://react-dnd.github.io/react-dnd/about)
- [react-draggable](https://www.npmjs.com/package/react-draggable)

# 比較しよう！
### ダウンロード数
![スクリーンショット 2024-07-23 21.36.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115968/0442bccc-3cef-61cc-eca2-7139e3b064ae.png)
[npm trends](https://npmtrends.com/@dnd-kit/core-vs-react-beautiful-dnd-vs-react-dnd-vs-react-draggable)によると、
現時点（2024年7月現在）でのダウンロード数は下記の順番となっています。
ただし近年 `dnd-kit` の人気が高まっており、2024年5月には `react-beatiful-dnd` を抜いています。しかし2024年6月をピークに下降している現状です。
<table>
  <thead>
    <tr>
      <th></th> <th>ライブラリ名</th>
    </tr>
  </thead>
  <tr>
    <td> 1 </td> <td>react-draggable</td>
  </tr>
  <tr>
    <td> 2 </td> <td>react-dnd</td>
  </tr>
  <tr>
    <td> 3 </td> <td>react-beatiful-dnd</td>
  </tr>
  <tr>
    <td> 4 </td> <td>dnd-kit</td>
  </tr>
</table>

### スター数
![スクリーンショット 2024-07-23 23.09.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115968/32b3a336-e27b-e3a9-8f19-764ad476b860.png)
同じく[npm trends](https://npmtrends.com/@dnd-kit/core-vs-react-beautiful-dnd-vs-react-dnd-vs-react-draggable)によると、スター数は下記の順番となっています。
<table>
  <thead>
    <tr>
      <th></th> <th>ライブラリ名</th>
    </tr>
  </thead>
  <tr>
    <td> 1 </td> <td>react-beatiful-dnd</td>
  </tr>
  <tr>
    <td> 2 </td> <td>react-dnd</td>
  </tr>
  <tr>
    <td> 3 </td> <td>dnd-kit</td>
  </tr>
  <tr>
    <td> 4 </td> <td>react-draggable</td>
  </tr>
</table>

### バージョン更新
`react-beautiful-dnd` と `react-dnd` の最終更新は2年前と久しく更新されておりません。`react-beautiful-dnd` については下記のようにgithubでアナウンスしています。
> we are focused on other priorities right now and have no current plans for further feature development or improvements.
（和訳）現在は他の優先事項に注力しており、さらなる機能開発や改善の計画はありません。

一方で`dnd-kit` と `react-draggable` は比較的最近更新されております。

# 特徴を知ろう！
### dnd-kit
**ゼロ依存のうえ** <font color="DarkOrange">**超軽量**</font> **!**
- ライブラリのコアは縮小すると約 10 KB になり、外部依存性はなし

<font color="DarkOrange">**幅広いユースケース**</font> **をサポート !**
- リスト、グリッド、複数のコンテナー、ネストされたコンテキスト、可変サイズのアイテム、仮想化されたリスト、2D ゲームなどサポート

### react-beautiful-dnd
<font color="DarkOrange">**美しく、自然な**</font> **ドラッグ＆ドロップ !**
- 物理法則に基づいてアイテムの動きをアニメーション化しているので自然な動き実現

https://medium.com/@alexandereardon/rethinking-drag-and-drop-d9f5770b4e6b


### react-dnd
<font color="DarkOrange">**HTML5**</font> **のドラッグ&ドロップサポート !**
- デスクトップからのドラッグ&ドロップ、ウィンドウ間でドラッグ&ドロップなどが可能
※ 別の専用のバックエンドを指定することでタッチデバイスも対応可能

### react-draggable
**実装が** <font color="DarkOrange">**超シンプル**</font> **!**
- `<Draggable>` で要素をラップするだけでドラッグ&ドロップ可能
    ```jsx
    <Draggable>
      <div>これで移動可能！</div>
    </Draggable>
    ```

# まとめ
各ライブラリの特性を把握していただけましたでしょうか。
さらに、それぞれの公式Webページにはサンプルもご用意されていますので、実際に手を動かしてUI/UXを評価することもおすすめします！
要件やユースケースによって最適な選択肢は異なるかもしれませんが、この記事が技術選定の参考になれば幸いです。

最後に私が選定したライブラリを紹介し、ここで本記事を締めくくります。

## <font color="DarkSeaGreen">筆者が選定したライブラリ</font>
### ライブラリ
- **dnd-kit**
### ユースケース
- ドラッグ＆ドロップリスト型フォームを実装する
![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115968/ba7b0b77-28d4-927f-d56a-f318e94b732a.gif)

### 選定理由
- アニメーションや操作感の観点から、`dnd-kit` と `react-beautiful-dnd` が優れている印象
    - `react-beautiful-dnd` は職場で使用しているため比較してみたい
- 人気が高まっており、日本語の記事やドキュメントが豊富
- 幅広いユースケースに対応しているため、今後リスト以外の用途でドラッグ＆ドロップ機能が必要になった時にも対応できそう
- バージョン更新頻度も比較的多いので改善が期待できる

### 所感
- `react-beautiful-dnd` に劣らないストレスフリーな操作感
    - ドラッグ＆ドロップする際、カクツキなどのパフォーマンス問題も特に気になりませんでした
- Material UIとの相性もよく、問題なく実装可能
    - Material UIと組み合わせた記事は少ない印象でしたが、問題なく実装できました