DanLevy.net

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

名前をつけるか、つけないか?

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

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

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

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

彼らが問題視するのは、完全に一時的なことだ:IDEの自動インポートバグ、特定のバンドラーのツリーシェーキング能力、あるいはインポート命名時のタイポの可能性。

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

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

importする側に対して、_ものの使い方_を示すシグナルを送っているのだ。

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

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

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

弱い引数だな、おい

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

// どちらもエイリアス可能!
import { Knife as Handle } from "./knife.js"; // 🔪
import { default as Handle } from "./knife.js"; // 🔪
import Handle from "./knife.js"; // 🔪

まとめ

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

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

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

結論

コードがコミュニケーションであるなら、どうかexportは本気でやってほしい。💞