defaultとexport defaultの違い

<h2>はじめに</h2>
最近Reactを勉強していますが、exportとexport defaultによく惑わされるので、違いを整理しました。
<br/>
※あくまでできるかできないかの整理となりますので、実際のプロジェクトでこういった書き方がされているかは存じ上げません。

<h2>概要</h2>

|No.| 項目 | 名前付きエクスポート <br/> （export） | デフォルトエクスポート <br/> （export default） |
|:-:|:-:|:-:|:-:|
|1| import時の{ }の必要性 | ○  | ×  |
|2| エイリアスの可否  | ○  |  ○ |
|3| １ファイルからの複数エクスポート可否  | ○  | △  |






<h2>1. import時の{ }の必要性</h2>

<h4>名前付きエクスポート</h4>

```FruitsBasket.jsx 
export const FruitsBasket = () => <div>FruitsBasket🧺</div>
```

```App.jsx
import { FruitsBasket } from "./FruitsBasket"; 🙆‍♀️ { } が必要

import FruitsBasket from "./FruitsBasket";  🙅‍♀️　 { } をつけていない


const App = () => <FruitsBasket />
```

<h4>デフォルトエクスポート</h4>

```FruitsBasket.jsx
const FruitsBasket = () => <div>FruitsBasket🧺</div>
export default FruitsBasket
```

```App.jsx
import FruitsBasket from "./FruitsBasket"; 🙆‍♀️ { } は不要

import { FruitsBasket } from "./FruitsBasket"; 🙅‍♀️　 { } をつけている

const App = () => <FruitsBasket />
```

なお、下記はNG🙅‍♀️

```FruitsBasket.jsx
export default const FruitsBasket = () => <div>FruitsBasket🧺</div>
``` 

【参考】

https://ocws.jp/blog/es6-the-reason-export-default-is-not-available-in-const/





<h2>2. エイリアスの可否</h2>

<h4>名前付きエクスポート</h4>

```FruitsBasket.jsx
export const FruitsBasket = () => <div>FruitsBasket🧺</div>
```

```App.jsx
import { FruitsBasket as BreadBasket } from "./FruitsBasket"; 🙆‍♀️ asでrenameできる

import BreadBasket from "./FruitsBasket"; 🙅‍♀️ ダイレクトにはrenameできない

const App = () => <BreadBasket />
```


<h4>デフォルトエクスポート</h4>

```FruitsBasket.jsx
const FruitsBasket = () => <div>FruitsBasket🧺</div>
export default FruitsBasket
```
```App.jsx
import BreadBasket from "./FruitsBasket"; 🙆‍♀️ ダイレクトにrenameできる

import FruitsBasket as BreadBasket from "./FruitsBasket"; 🙅‍♀️　　asを使用したrenameはできない

const App = () => <BreadBasket />
```





<h2>3. 1ファイルからの複数エクスポート可否</h2>

<h4>名前付きエクスポート</h4>

１つずつエクスポートする

```FruitsBasket.jsx
export const apple = 'apple🍎'
export const orange = 'orange🍊'
export const banana = 'banana🍌'
```

```App.jsx
import { apple, orange, banana } from './FruitsBasket';

const App = () => {
  return (
    <>
      <p>{apple}</p>
      <p>{orange}</p>
      <p>{banana}</p>
    </>
  )
}
```

まとめてオブジェクトでエクスポートする
```FruitsBasket.jsx
const apple = 'apple🍎';
const orange = 'orange🍊';
const banana = 'banana🍌';

export const fruits = { apple, orange, banana }
```

```App.jsx
import { fruits } from './FruitsBasket';

const App = () => {
  return (
    <>
      <p>{fruits.apple}</p>
      <p>{fruits.orange}</p>
      <p>{fruits.banana}</p>
    </>
  );
}
```

まとめて配列でエクスポートする
```FruitsBasket.jsx
const apple = 'apple🍎';
const orange = 'orange🍊';
const banana = 'banana🍌';

export const fruits = [ apple, orange, banana ]
```

```App.jsx
import { fruits } from './FruitsBasket';

const App = () => {
  return (
    <>
      <p>{fruits[0]}</p>
      <p>{fruits[1]}</p>
      <p>{fruits[2]}</p>
    </>
  );
}
```

<h4>デフォルトエクスポート</h4>
・複数をそのままエクスポートすることはできない（export defaultは１ファイルにつき１つだけ） <br />
・オブジェクト or 配列に格納すれば可能

```FruitsBasket.jsx
// エクスポートする側
const apple = 'apple🍎';
const orange = 'orange🍊';
const banana = 'banana🍌';

export default apple, orange, banana 🙅‍♀️　　複数をそのままexportはできない
```

まとめてオブジェクトでexportする 
```FruitsBasket.jsx
const apple = 'apple🍎';
const orange = 'orange🍊';
const banana = 'banana🍌';

const fruits = {apple, orange, banana}
export default fruits
```

```App.jsx
import fruits from './FruitsBasket';　👈 { } は不要

const App = () => {
  return (
    <>
      <p>{fruits.apple}</p>
      <p>{fruits.orange}</p>
      <p>{fruits.banana}</p>
    </>
  );
}
```

まとめて配列でexportする

```FruitsBasket.jsx
const apple = 'apple🍎';
const orange = 'orange🍊';
const banana = 'banana🍌';

const fruits = [apple, orange, banana]
export default fruits
```

```App.jsx
import fruits from './FruitsBasket'; 👈 { } は不要

const App = () => {
  return (
    <>
      <p>{fruits[0]}</p>
      <p>{fruits[1]}</p>
      <p>{fruits[2]}</p>
    </>
  );
}
```

<h2>両方を同時に使用する</h2>
exportとdefault exportの両方を１つのファイル内で使用することは可能

```FruitsBasket.jsx
const apple = 'apple🍎';
const orange = 'orange🍊';
const banana = 'banana🍌';
const fruits = [apple, orange, banana]

export const FruitsBasket = () => <div>FruitsBasket🧺</div>
export default fruits
```

```App.jsx
import fruits, { FruitsBasket } from './FruitsBasket'; 🙆‍♀️ { }のない方を前に書く
import { FruitsBasket }, fruits from './FruitsBasket'; 🙅‍♀️ { }のある方を先に書くのはNG

const App = () => {
  return (
    <>
      <FruitsBasket />
      <p>{fruits[0]}</p>
      <p>{fruits[1]}</p>
      <p>{fruits[2]}</p>
    </>
  );
}
```

<h3>参考</h3>

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export

https://prograshi.com/language/javascript/export-default-and-export/#:~:text=%E3%80%8Cexport%20default%E3%80%8D%E3%81%A8%E3%80%8Cexport%E3%80%8D%E3%81%AE%E5%A4%A7%E3%81%8D%E3%81%AA%E9%81%95%E3%81%84%E3%81%AF,export%3A%20%E8%A4%87%E6%95%B0%E6%B8%A1%E3%81%9B%E3%82%8B%E3%80%82

https://www.geeksforgeeks.org/what-is-export-default-in-javascript/#:~:text=The%20export%20statement%20is%20used,and%20other%20is%20Default%20Exports

https://betterprogramming.pub/understanding-the-difference-between-named-and-default-exports-in-react-2d253ca9fc22