DanLevy.net

ESMエクスポート:名前付き vs デフォルト?

名付けるべきか、名付けざるべきか?

Hero image for ESMエクスポート:名前付き vs デフォルト?

JavaScriptでnamedエクスポートとdefaultエクスポート、どちらを使うべきか?

このトピックについて、強い言葉で書かれた記事に事欠くことはない。

大多数はdefault exportを「ひどい」と断じる。一方、defaultこそ選ぶべきだと主張する人もいる(AirBnbスタイルガイドなど)。

彼らがしばしば槍玉に挙げるのは、完全に一時的な問題だ。IDEの自動インポートのバグ、特定のバンドラーのツリーシェーキング性能、果てはインポート名を付けるときにタイプミスするかもしれないというだけの話までだ。

そもそもexportすることの本質を見落としていないか?

コードはコミュニケーションである。✨

importする側に、それをどう使うかというシグナルを送っているのだ。

じゃあ、何を伝えているのか?

大まかに言えば、モダンJavaScriptでものをエクスポートする方法は2つある:

もちろん両方を組み合わせたり、コードベースの部分ごとに異なるアプローチを使ったりすることもできる。記事の最後でさらに例を紹介。

弱い主張だな、おい

よくある「一時的な問題」を片付けていこう。

// You can alias using both!
import { Knife as Handle } from "./knife.js"; // 🔪
import { default as Handle } from "./knife.js"; // 🔪
import Handle from "./knife.js"; // 🔪

まとめ

ものをエクスポートする方法には実はたくさんの組み合わせがあり、それぞれが異なる物語を語る:

デフォルト(エクスポート)名前付き(エクスポート)プライベート関数パターン意味
✅❌❌デフォルトエクスポート1つ。「単一の目的を持つ関数を、ただ一つお届け!」
❌✅❌名前付きエクスポート1つ。「リネームしないでください。」
✅✅✅デフォルトエクスポート + 複数のエクスポートされていない「プライベート」関数「関連ロジックはこちら。ついでに、クラスっぽい振る舞いを期待して。」
❌❌✅複数の名前付きエクスポート、汎用的なファイル名。「緩く関連したものたちの詰め合わせ。階層関係は暗示しない。」
✅✅❌単一の名前付きエクスポートをデフォルトとしてもエクスポート。「どうインポートしても、しくじりようがない。」

考えてみてほしい:ファイル名がエクスポートの一つと一致するかどうかで、何を伝えているのだろうか?(例えば、多くの関数を持つutils.jsなど。)

結論

コードがコミュニケーションだというなら、頼むからexportはクソ本気でやってくれ。💞