module(import/export)ってなんなん?
はじめに
Reactで開発を進めているとimport
とかexport
とか、まるで息をするかのように頻繁に使用すると思います。初心者だとしても、参考にするコードが至る所にありますし「なんとなくノリで・・・」import
していませんか?「多分こう書けばいいんでしょ?」ってexport
していませんか?...僕はしてました。
きちんと理解した上で使用するべきなのは間違い無いので、ここにメモを残します。
Module機能とは
モジュール機能ってなんでしょうか?実はこれReactの機能ではなくJavaScriptの機能です。
- 何のためのファイルなのかはっきりさせるため。
- コードの保守性を高め、管理しやすくするため。
- ファイルを再利用しやすくするため。
という理由から、1ファイル1モジュール(コンポーネント)に分割して、
使いたい時に使いたいものだけ持ってきて利用するために、import
export
を使います。
大体以下のような感じで使用していきます。
// つくったコンポーネントを export(他のファイルからよびだせるように)して・・・・
export const Card = ({title}) => {
return <h1>{title}</h1>
}
// import(このファイルで受け取って)して、Cardコンポーネントを使えるようにして....
import Card from './components/Card'
const CardList = () => {
return (
<>
<Card title={1つ目} /> {/* つかう! */}
<Card title={2つ目} /> {/* つかう! */}
<Card title={3つ目} /> {/* つかう! */}
</>
)
};
// CardListも別ファイルで使用できるようにexport
export default CardList;
Default export/import
名前なしexport
、import
と呼ばれることもあり、default言うだけあってJSが推奨している方法。
Default export
default export
は1モジュールにつき、1つしかつくれません。
ファイルの末尾に、以下のように記載してエクスポートします。
export default コンポーネント名;
注意しておくべきことは、default
という名前をつけてエクスポートをしていると言う点です。
以下のCardを例にとり、ものすごく長ったらしく説明をすると・・・
「Card
コンポーネントをCard
という名前ではなく、default
という名前でexport
しますね!default
という名前が気に入らないなら、import
するときに勝手に別名つけていいよ!!」です。
const Card = ({title}) => {
return <h1>{title}</h1>
}
export default Card; // ココ!!!
Default import
default import
は、1モジュールにいくつまで。という制限はありません。(あたりまえですね)
ファイルの先頭で、以下のようにしてインポートを行います。
import コンポーネント名(自由) from 'ファイルパス'
ここで注意すべきことは、コンポーネント名
はつけたい名前をつけることができる。という点です。
(慣習としては、そのコンポーネントの元々の名前をつけます。)
以下のCardを例に、(実際はしないでしょうが)こんな風にもできます・・・・
「import
したCard
コンポーネントはdefault
という名前でexport
されているから、自由に名前が変更できる。そうだTom
として使おう。」です。
import Tom from './components/Card'
const CardList = () => {
return (
<>
<Tom title={1つ目} />
<Tom title={2つ目} />
<Tom title={3つ目} />
</>
)
};
名前付き export/import
デフォルトの名前なしとは違い、その名の通り、名前をつけた状態でexport
import
します。
1ファイル内にエクスポートしたいコンポーネント
や関数
、型
等が複数あった時は名前付きを使ってエクスポートします。
名前付き export
名前付き export
は1モジュールにつき1つ。の制限はありません。好きなだけエクスポートしてください。名前付き export
の方法は大きく2つあります。
- エクスポートしたい
関数
等の先頭にひとつづつexport
とつける。 - エクスポートしたい
関数
をファイル末尾でまとめてexport
する。
です。もちろん「この関数はexport
しなくていいや。」みたいなこともできます・・・
export const hello = () => console.log('hello!!')
export const bonjour = () => console.log('bonjour!!')
export const ciao = () => console.log('ciao!!')
const ohayo = () => console.log('ohayo!!') // ohayoだけexportされていない
const hello = () => console.log('hello!!')
const bonjour = () => console.log('bonjour!!')
const ciao = () => console.log('ciao!!')
const ohayo = () => console.log('ohayo!!')
export { hello, bonjour, ciao }; // ohayoだけexportされていない
名前付き import
名前付き import
ではexport
の際に決めた関数名
を記載してインポートする必要があります。
ファイルの先頭で、以下のようにしてインポートを行います。( { }
を忘れずに...)
import { 関数名(固定) } from 'ファイルパス'
コンマで繋げば、複数一気にimport
することができます。
import { hello, bonjour, ciao } from './greetings'
// インポートしたものをつかう
hello(); // hello!!
bonjour(); // bonjour!!
ciao(); // ciao!!
名前の変更
名前付き import
名前付き export
では関数宣言時とは異なる名前を指定してインポート・エクスポートすることができます。いずれも as
を用いて別名を指定できます。
// インポート時
import { 元の名前 as 別の名前 } from 'ファイルパス';
// エクスポート時
export { 元の名前 as 別の名前 };
インポートが大量になってくると、汎用的な名称のコンポーネントや関数、型などは名前が被りがちになってしまいます。そんなときにas
を利用してください・・・
import {
hello as english,
bonjour as french,
ciao as italian
} from './greeting'
// 名称を変更してインポートしたものをつかう
english(); // hello!!
french(); // bonjour!!
italian(); // ciao!!
モジュールオブジェクト
上記のようにインポートしても全く問題ないのですが、対象ファイルの中にある全てのエクスポートを取得して、モジュールオブジェクトを作成することで、より簡潔に複数の機能を利用することができます。
// インポート時
import * as モジュールオブジェクト名(自由) from 'ファイルパス'
// 使用時
モジュールオブジェクト名.関数名();
たとえば先ほどまでのgreeting
達をモジュールオブジェクトにすると・・・
import * as greeting from './greeting';
greeting.hello(); // hello!!
greeting.bonjour(); // bonjour!!
greeting.ciao(); // ciao!!
さいごに
とても基本的なことだとは思いますが冒頭でも言った通り「ノリでやってた」感がいなめませんでした。あやふやな基礎はしっかり固めてがんばりましょう!!!(....がんばります!!!!)
参考
Discussion