0
0

export defaultって何が嬉しいの:開発の困難を解決する具体例

Posted at

便利なexport default:開発の困難を解決する具体例

1. 名前の衝突を防ぐ

  • 問題: あるプロジェクトで、異なるライブラリからButtonという名前のコンポーネントをインポートしたい場合、名前が重複してしまうとどちらのButtonかわかりにくくなります。
  • 解決策: export defaultを使用して、インポート時に名前をボタン1ボタン2に変更します。
    // Button1.js
    export default function Button() {
      return <button style={{ backgroundColor: 'blue' }}>ボタン1</button>;
    }
    
    // Button2.js
    export default function Button() {
      return <button style={{ backgroundColor: 'gray' }}>ボタン2</button>;
    }
    
    // App.js
    import PrimaryButton from './Button1';
    import SecondaryButton from './Button2';
    
    function App() {
      return (
        <div>
          <PrimaryButton />
          <SecondaryButton />
        </div>
      );
    }
    
  • 結果: 名前の衝突を避けつつ、コンポーネントの目的が明確になり、どちらのButtonか一目でわかるようになりました。

2. より読みやすいコード

  • 問題: あるプロジェクトで、同じ機能のfetchData関数が異なるモジュールに存在するが、どこからインポートされたかが不明確。

  • 解決策: 各モジュールからデフォルトエクスポートを使って、関数に具体的な名前をつけてインポートします。

    // userAPI.js
    export default function fetchData() {
      return fetch('api/user');
    }
    
    // productAPI.js
    export default function fetchData() {
      return fetch('api/product');
    }
    
    // App.js
    import fetchUserData from './userAPI';
    import fetchProductData from './productAPI';
    
    async function displayData() {
      const user = await fetchUserData();
      const product = await fetchProductData();
      console.log(user, product);
    }
    
  • 結果: 関数の用途がはっきりとし、どのAPIからデータを取得しているかが明確になりました。

3. コードのリファクタリングが容易

  • 問題: UserListコンポーネントがデフォルトエクスポートでなく、多くのファイルで名前付きエクスポートとして使われているが、UserTableに置き換えたい場合、多くの変更が必要。
  • 解決策: 元のUserListexport defaultでエクスポートし、新しいUserTableに置き換える時もデフォルトエクスポートを使用。
    // UserList.js
    export default function UserList() {
      return <div>User List Component</div>;
    }
    
    // UserTable.js
    export default function UserTable() {
      return <div>User Table Component</div>;
    }
    
    // App.js
    import UserComponent from './UserTable';
    
    function App() {
      return <UserComponent />;
    }
    
  • 結果: UserListUserTableに置き換える際、インポートしているすべてのファイルでのみ名前を変更するだけで済みました。

4. モジュールの再利用性を向上

  • 問題: 別のプロジェクトで使用するためにLoggerモジュールをエクスポートしたいが、プロジェクトごとに異なるロギングの要件がある。
  • 解決策: Loggerexport defaultでエクスポートし、各プロ

ジェクトでインポートする際に、プロジェクト固有の名前を付ける。

// Logger.js
export default function log(message) {
  console.log(message);
}

// ProjectA.js
import ProjectALogger from './Logger';

ProjectALogger('Starting project A.');

// ProjectB.js
import ProjectBLogger from './Logger';

ProjectBLogger('Starting project B.');
  • 結果: Loggerモジュールを異なるプロジェクトで再利用し、プロジェクトごとに適切なロギング機能を提供することが可能になりました。

このようにexport defaultの使用は、名前の衝突の回避、コードの読みやすさの向上、リファクタリングの容易さ、モジュールの再利用性の向上という観点から、開発プロセスに大きな利点をもたらします。

初めからわかりやすい関数名つけとけば?

確かにそうかもしれませんが、そこまで後のこと考えてないよ!というのが正直なところかもしれません。

関数やコンポーネントを定義する際に、初めから適切な名前を付けることは非常に重要です。良い名前はコードの可読性と保守性を大幅に向上させるの。たとえば、fetchUserData や fetchProductData といった名前は、それぞれが何を行うのかを明確に示しており、コードを読む際にその機能をすぐに理解できます。

ただし、実際の開発プロセスでは、異なるモジュール間で同様の機能が必要な場合があり、モジュールごとに異なる文脈で同じ機能を使用したい場合があります。そのため、export defaultを使用してデフォルトエクスポートされたモジュールは、インポート時に任意の名前を付けることができ、これにより異なるプロジェクトや文脈で柔軟に対応できるようになります。

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0