🧠

パフォーマンスだけを理由に意味論や可読性を捨てるべきではない理由

に公開
3
GitHubで編集を提案

Discussion

Honey32Honey32
  • ui/ : 「パッケージ」的じゃないので、index.ts 不要
    • card/ : 「パッケージ」的なので、index.ts を使って良い
      • index.ts
      • card.ts
    // 🔴 DON'T
    import { Button, Card, Modal } from "#/ui";
    
    // ✅️ DO
    import { Card } from "#/ui/card";
    
  • features/books/details : 書籍詳細ページ。「パッケージ的」index.ts が適している。
    • index.ts : バレル
    #/app/books/[bookId]/page.tsx
    import { BookDetailsPage } from "#/features/books/details"
    

個人的に、barrel export は、「カプセル化のためのパッケージ」としてのディレクトリに用意するのは問題ないですが、

そうでないようなディレクトリについては、用意する必要がない、むしろ、以下のような パフォーマンスではなく可読性の観点での デメリットがあるから避けたほうが良いと思います。

  • 無駄にコードジャンプが増える
  • ツリーシェイキングが失敗するかどうか気にするのが億劫

このように、ファイル間の依存関係を無用に複雑することは、バンドル時の依存解決のしくみに則っている RSC とは相性が悪く、保守性を著しく下げる原因になると思います。

実際に、それによってトラブルシューティングしあぐねている方に出会ったことがあります。 https://qiita.com/kay-adamof/items/8d7324810dd1b051d373

じょうげんじょうげん

ご意見ありがとうございます。
本論の意図としては、パフォーマンス面を理由にやらないのは間違いというものであり、barrel exportを全面的に採用すべきかどうかは議論の余地があると考えていました。

パッケージ的か、そうでないかでやるべきか判断が分かれるというのはその通りで、その都度判断するのが難しいという理由でしないというのは意味のある判断だと私も思います。

RSCを採用しているプロジェクトにおいても、clientとserverが入り乱れるようなモジュールがあるとしたら、それはbarrel exportを避けた方が良さそうですね。

Honey32Honey32

たしかに、本文を見返しましたが、そうですね!

(関係ないですが、「パッケージ的じゃないならバレルを使わない」ことについても、どこかにまとめておかないと…)