0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【javascript】モジュール

Last updated at Posted at 2020-07-14

こちらの記事は以下の書籍を参考に執筆しました

#モジュールとは

  • 最も基本的なものは独自のスコープとルールを持つ1つのjavascriptファイル
  • モジュールはオブジェクトではない
  • モジュールにデータ型はない
  • モジュールを変数に代入できない
  • コードの分割、カプセル化、構成をするためのツール

モジュールを利用すれば必要なものをインポートし、認知不可を抑え、メンテを楽にしてくれる。

#モジュールのルール
javascriptのルールはモジュールのないでは少し違ってくる。

  • 常にScriptモードで実行されるため、use scriptを追加する必要はない。
  • thisがルートコンテキストで何を示すか

#####thisがルートコンテキストで何を示すか
ES2015のモジュールではルートレベルのthisはundefinedになる。

var obj = {
  foo() {
    return this;
  }
}

function bar() {
  return this;
}

obj.foo(); //obj
bar(); //undefined
console.log(this) //undefined

出典:入門JavaScriptプログラミング

モジュールは変数がグローバル変数として定義されることはない。
しかしモジュール内部でグローバルオブジェクトに値を割り当てることは可能。

とはいえモジュールのグローバルの設定は悪い作法。

#モジュールを作成
##デフォルトエクスポート
グローバル関数はこう書くかもしれない

window.logState = functionn(stat) {
  //処理
}

出典:入門JavaScriptプログラミング

しかしモジュールではこう書く

export default function logState(start){
  //処理
}

出典:入門JavaScriptプログラミング

関数の先頭にexportをつけるとこのモジュールがlogState関数をいエクスポートするようになる。このエクスポートのことをデフォルトエクスポートという。

##エクスポートしたくない関数があるとき
モジュールを使用せず、ヘルパー関数をエクスポートしたくないとしたらこう書くかもしれない。

{
  function statsHellper() {
    //処理
  }

  window.logState = functionn(stat) {
    //処理
  }

}

出典:入門JavaScriptプログラミング

しかしモジュールを使うならすべてのものが独自のスコープに含まれているため、値が漏れることはない。

function statsHelper() {
  //処理
}

export default function logState(start) {
  //処理
}

出典:入門JavaScriptプログラミング

##名前付きエクスポート
モジュールを関数として考えるとexport defaultはreturnに相当する。
関数から返せる値は1つであるようにモジュールのデフォルトエクスポートは1つだけ。

しかしデフォルトエクスポートが1つだけなのであって、モジュールのエクスポートが1つに制限されるわけではない。
デフォルト以外は名前付きエクスポートになる。
名前付きは単にdefaltが消えただけ。

export function logState(start) {
  //処理
}

出典:入門JavaScriptプログラミング

名前は関数名になる。
###名前付きエクスポートのもう一つの構文
名前付きエクスポートにはもう一つ構文がある。

function logState(num){
  //処理
}
export{logState}

出典:入門JavaScriptプログラミング

構文はこう

export{<バインディング1>,<バインディング2>,...}

出典:入門JavaScriptプログラミング

好きなだけ指定することもできる。
##名前を変えてエクスポート
名前を変えてエクスポートもできる
内部でformattedCurrentusernameをusernameでエクスポートするにはこうする。

export { formattedCurrentUsername as username}

##変数宣言でも関数同様
変数宣言でも件数と同じことが当てはまる。

export let one = 1//oneという名前でエクスポート
export const two = 2//twoという名前でエクスポート
export 3//無効:名前を推測できない

出典:入門JavaScriptプログラミング

##exportはトップレベルに配置する
条件付きで値をエクスポートはできない。
トップレベルとはファイル内のコードブロックの本体、if文、関数ではなく、コードブロックのルートを意味する。

//トップレベルなので有効
export const number = num => //処理
  //トップレベルでない
if () {
    export const number = num => //処理
}

//トップレベルでない
function
export () {
  export const number = num => //処理
}

出典:入門JavaScriptプログラミング

#javascriptファイルはどのタイミングでモジュールになるか
基本的に<script>のtype='module'とするとそのファイルをモジュールとして実行するようになる。
##別の方法

Node.jsには<script>タグを使用しないため上の方法では使えない。
別の方法としてこのようなものがある。

export {}
/* モジュールの残りの部分 */

これはオブジェクトのエクスポートではない。
これは本来なら{}の間にエクスポートする名前を指定する名前付きエクスポート構文。
何もエクスポートされないが、これがあることでこのファイルはモジュールと認識される。

#まとめ

  • 宣言をエクスポートするときは、名前付きエクスポートが作成される。
  • 名前付きエクスポートは別名も指定できる。
  • 名前付きはいくつでもいいが、デフォルトエクスポートは1つだけ
  • exportはトップレベルで記述
  • ルートレベルではthisはundefinedになる
  • モジュールはデフォルトでScriptモードになる
0
0
0

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?