React モジュールのエクスポート/インポート解説
React.js で複数のモジュールをエクスポートする
React.js では、複数のモジュールをひとつのファイルからエクスポートすることができます。これは、コードの再利用性と組織性を高めるために非常に便利です。
複数のモジュールをエクスポートする基本的な方法
-
オブジェクトのエクスポート
// components.js export const Button = () => { // ... }; export const Input = () => { // ... }; export const Card = () => { // ... };
この方法では、各モジュールをオブジェクトのプロパティとしてエクスポートします。インポートする際には、オブジェクトのキーを使用してモジュールにアクセスします。
-
デフォルトエクスポート
// Button.js export default () => { // ... };
デフォルトエクスポートは、ファイルからエクスポートされる唯一のモジュールです。インポートする際に、モジュール名を指定する必要はありません。
複数のモジュールをインポートする
インポートする際には、必要なモジュールを指定します。
import { Button, Input, Card } from './components';
import Button from './Button'; // デフォルトエクスポートの場合
- モジュール間の依存関係管理
モジュールを適切にエクスポート・インポートすることで、モジュール間の依存関係を管理しやすくなります。 - 組織性
モジュールを適切に分類することで、プロジェクトの構造を整理することができます。
注意
- モジュール間の循環参照は、エラーが発生する可能性があります。
- 同じファイルから複数のデフォルトエクスポートを行うことはできません。
// components.js
export const Button = () => {
return <button>クリック</button>;
};
export const Input = () => {
return <input type="text" />;
};
export const Card = ({ children }) => {
return <div className="card">{children}</div>;
};
- Card コンポーネント
children
プロップを受け取り、その子要素をレンダリングすることで、柔軟なカードコンポーネントを実現しています。 - 再利用可能なコンポーネント
各コンポーネントは、他のコンポーネントから再利用できる独立した単位となります。 - 名前付きエクスポート
export const
を使用して、Button
,Input
,Card
という名前でそれぞれエクスポートしています。
他のファイルからインポートする
// App.js
import { Button, Input, Card } from './components';
function App() {
return (
<div>
<Button />
<Input />
<Card>
<h1>こんにちは、世界!</h1>
</Card>
</div>
);
}
- コンポーネントの利用
インポートしたコンポーネントを JSX で使用しています。 - 名前付きインポート
components.js
からButton
,Input
,Card
をインポートしています。
// Button.js
export default () => {
return <button>クリック</button>;
};
// App.js
import Button from './Button';
- インポート
インポートする際に、モジュール名を省略できます。 - デフォルトエクスポート
export default
を使用して、デフォルトでエクスポートします。
- 再利用性
作成したコンポーネントを他のファイルで再利用することで、コードの重複を減らし、保守性を向上させます。 - デフォルトエクスポート
1つのモジュールをデフォルトでエクスポートし、インポート時にモジュール名を省略できます。 - 名前付きエクスポート
複数のモジュールを特定の名前でエクスポートし、インポート時に同じ名前で指定します。
さらに詳しく
- TypeScript
TypeScript を使用すると、静的型付けによる安全性と生産性の向上を図ることができます。 - 再エクスポート
他のモジュールからエクスポートされたものを、自らのモジュールから再びエクスポートすることができます。 - モジュールの分割
大規模なアプリケーションでは、モジュールをさらに細かく分割することで、コードの管理を容易にすることができます。
- ライブラリ
React Router や Redux などのライブラリは、React アプリケーション開発を支援するための機能を提供します。
重要なポイント
- 型
TypeScript を使用することで、型の安全性を確保し、バグを減らすことができます。 - 名前付け
モジュールや変数には、分かりやすい名前を付けましょう。 - モジュールの分割
コードを整理し、再利用性を高めるために、モジュールを適切に分割しましょう。
名前付きエクスポートとデフォルトエクスポートの組み合わせ
- 例
// Button.js
export default () => {
// ...
};
// OtherComponents.js
export const Input = () => {
// ...
};
export const Card = () => {
// ...
};
// App.js
import Button from './Button';
import { Input, Card } from './OtherComponents';
再エクスポート
// index.js
export * from './Button';
export * from './Input';
export * from './Card';
- 注意点
*
を使用すると、そのモジュールからエクスポートされたすべてのものが再エクスポートされます。
モジュールバンドラーの設定
- Parcel
相対パスや絶対パスでモジュールをインポートできます。 - Webpack
alias
やresolve
オプションを使用して、モジュールの検索パスやエイリアスを設定できます。
TypeScript の名前空間
- メリット
TypeScript の名前空間を使用することで、モジュールをネスト化し、名前の衝突を防ぐことができます。
// components/index.ts
namespace Components {
export const Button = () => {
// ...
};
export const Input = () => {
// ...
};
}
export default Components;
// App.tsx
import Components from './components';
const App = () => {
return <Components.Button />;
};
Barrel ファイル
// components/index.js
export { Button } from './Button';
export { Input } from './Input';
export { Card } from './Card';
どの方法を選ぶべきか?
- モジュールの依存関係
モジュール間の依存関係が複雑な場合は、再エクスポートや名前空間を利用することで、依存関係を明確にすることができます。 - チームの慣習
チーム内で共通の規約やスタイルガイドがある場合は、それに従う必要があります。 - プロジェクトの規模
小規模なプロジェクトであれば、シンプルな方法で十分です。大規模なプロジェクトでは、モジュールを細かく分割し、名前空間やバレルファイルを利用することで、管理しやすくなります。
reactjs