Skip to content

Commit

Permalink
Merge pull request #1048 from asciidwango/publish1
Browse files Browse the repository at this point in the history
Publish1
  • Loading branch information
kahei authored Jan 22, 2020
2 parents f3ba358 + d011025 commit fc635a5
Show file tree
Hide file tree
Showing 9 changed files with 42 additions and 42 deletions.
58 changes: 29 additions & 29 deletions source/basic/module/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@ description: "JavaScriptのモジュール(ECMAScriptモジュール)につ

# [ES2015] ECMAScriptモジュール {#module}

ECMAScriptモジュールは[Todoアプリのユースケース][]で実際に動かしながら学ぶため、ここでは構文の説明とモジュールのイメージを掴むのが目的です
ECMAScriptモジュールは[Todoアプリのユースケース][]で実際に動かしながら学ぶため、ここでは構文の説明とモジュールのイメージをつかむのが目的です
この章のサンプルコードを実際に動かすためにはローカルサーバーなどの準備が必要です。
そのため、ユースケースの章を先に読んでから戻ってきてもかまいません。

モジュールは、保守性・名前空間・再利用性のために使われます。

* 保守性: 依存性の高いコードの集合を一箇所にまとめ、それ以外のモジュールへの依存性を減らすことができます
* 保守性: 依存性の高いコードの集合を一箇所にまとめ、それ以外のモジュールへの依存性を減らせます
* 名前空間: モジュールごとに分かれたスコープがあり、グローバルの名前空間を汚染しません
* 再利用性: 便利な変数や関数を複数の場所にコピーアンドペーストせず、モジュールとして再利用できます

ひとつのJavaScriptモジュールはひとつのJavaScriptファイルに対応します
1つのJavaScriptモジュールは1つのJavaScriptファイルに対応します
モジュールは変数や関数などを外部にエクスポートできます。また、別のモジュールで宣言された変数や関数などをインポートできます。
この章では **ECMAScriptモジュール(ESモジュール、JSモジュールとも呼ばれる)** について見ていきます。
ECMAScriptモジュールは、ES2015で導入されたJavaScriptファイルをモジュール化する言語標準の機能です。
Expand All @@ -24,54 +24,54 @@ ECMAScriptモジュールは、ES2015で導入されたJavaScriptファイルを

ECMAScriptモジュールは、[export文][]によって変数や関数などをエクスポートできます。
また、[import文][]を使って別のモジュールからエクスポートされたものをインポートできます。
インポートとエクスポートはそれぞれに **名前付き****デフォルト** という2種類の方法があります。
インポートとエクスポートはそれぞれに **名前つき****デフォルト** という2種類の方法があります。

まずは名前付きエクスポート/インポート文について見ていきましょう。
まずは名前つきエクスポート/インポート文について見ていきましょう。

### 名前付きエクスポート/インポート {#named-export-import}
### 名前つきエクスポート/インポート {#named-export-import}

**名前付きエクスポート**は、モジュールごとに複数の変数や関数などをエクスポートできます。
次の例では、`foo`変数と`bar`関数をそれぞれ名前付きエクスポートしています
`export`文のあとに続けて`{}`を書き、その中にエクスポートする変数を入れることで、宣言済みの変数を名前付きエクスポートできます
**名前つきエクスポート**は、モジュールごとに複数の変数や関数などをエクスポートできます。
次の例では、`foo`変数と`bar`関数をそれぞれ名前つきエクスポートしています
`export`文のあとに続けて`{}`を書き、その中にエクスポートする変数を入れることで、宣言済みの変数を名前つきエクスポートできます

[import, title="named-export.js"](src/named-export.js)

また、名前付きエクスポートでは`export`文を宣言の前につけると、宣言と同時に名前付きエクスポートできます
また、名前つきエクスポートでは`export`文を宣言の前につけると、宣言と同時に名前つきエクスポートできます
[import, title="named-export-declare.js"](src/named-export-declare.js)

**名前付きインポート**は、指定したモジュールから名前を指定して選択的にインポートできます。
次の例では `my-module.js`から名前付きエクスポートされたオブジェクトの名前を指定して名前付きインポートしています
`import`文のあとに続けて`{}`を書き、その中にインポートしたい名前付きエクスポートの名前を入れます
**名前つきインポート**は、指定したモジュールから名前を指定して選択的にインポートできます。
次の例では `my-module.js`から名前つきエクスポートされたオブジェクトの名前を指定して名前つきインポートしています
`import`文のあとに続けて`{}`を書き、その中にインポートしたい名前つきエクスポートの名前を入れます
複数の値をインポートしたい場合は、それぞれの名前をカンマで区切ります。

[import, title="my-module.js"](src/my-module-1.js)

[import, title="named-import.js"](src/named-import.js)

#### 名前付きエクスポート/インポートのエイリアス {#named-export-import-alias}
#### 名前つきエクスポート/インポートのエイリアス {#named-export-import-alias}

名前付きエクスポート/インポートには**エイリアス**の仕組みがあります。
エイリアスを使うと、宣言済みの変数を違う名前で名前付きエクスポートできます
名前つきエクスポート/インポートには**エイリアス**の仕組みがあります。
エイリアスを使うと、宣言済みの変数を違う名前で名前つきエクスポートできます
エイリアスをつけるには、次のように`as`のあとにエクスポートしたい名前を記述します。

[import, title="named-export-alias.js"](src/named-export-alias.js)

また、名前付きインポートしたオブジェクトにも別名をつけることができます
また、名前つきインポートしたオブジェクトにも別名をつけることができます
インポートでも同様に、`as`のあとに別名を記述します。

[import, title="named-import-alias.js"](src/named-import-alias.js)

### デフォルトエクスポート/インポート {#default-export-import}

次に、デフォルトエクスポート/インポートについて見ていきましょう。
**デフォルトエクスポート**は、モジュールごとにひとつしかエクスポートできない特殊なエクスポートです
**デフォルトエクスポート**は、モジュールごとに1つしかエクスポートできない特殊なエクスポートです
次の例は、すでに宣言されている変数をデフォルトエクスポートしています。
`export default`文で、後に続く式の評価結果をデフォルトエクスポートします。

[import, title="default-export.js"](src/default-export.js)

また、`export`文を宣言の前につけると、宣言と同時にデフォルトエクスポートできます。
このとき関数やクラスは名前を省略できます
このとき関数やクラスの名前を省略できます

<!-- exportがないため -->
<!-- doctest:disable -->
Expand All @@ -88,41 +88,41 @@ export default function() {}
[import, default-export-variables-invalid.js](src/default-export-variables-invalid.js)

**デフォルトインポート**は、指定したモジュールのデフォルトエクスポートに名前をつけてインポートします。
次の例では `my-module.js`のデフォルトエクスポートに`myModule`というという名前をつけてインポートしています
次の例では `my-module.js`のデフォルトエクスポートに`myModule`という名前をつけてインポートしています
`import`文のあとに任意の名前をつけることで、デフォルトエクスポートをインポートできます。

[import, title="my-module.js"](src/my-module-2.js)

[import, title="default-import.js"](src/default-import.js)

実はデフォルトエクスポートは、`default`という固有の名前による名前付きエクスポートと同じものです
そのため、名前付きエクスポートで`as default`とエイリアスをつけることでデフォルトエクスポートすることもできます。
実はデフォルトエクスポートは、`default`という固有の名前による名前つきエクスポートと同じものです
そのため、名前つきエクスポートで`as default`とエイリアスをつけることでデフォルトエクスポートすることもできます。

[import, title="default-export-alias.js"](src/default-export-alias.js)

同様に、名前付きインポートにおいても`default`という名前がデフォルトインポートに対応しています。
次のように、名前付きインポートで`default`を指定するとデフォルトインポートできます。
同様に、名前つきインポートにおいても`default`という名前がデフォルトインポートに対応しています。
次のように、名前つきインポートで`default`を指定するとデフォルトインポートできます。
ただし、`default`は予約語なので、この方法では必ず`as`構文を使ってエイリアスをつける必要があります。

[import, title="default-import-alias.js"](src/default-import-alias.js)

また、名前付きインポートとデフォルトインポートの構文は同時に記述できます
また、名前つきインポートとデフォルトインポートの構文は同時に記述できます
次のように2つの構文をカンマでつなげます。

[import, title="default-import-with-named.js"](src/default-import-with-named.js)

ECMAScriptモジュールでは、エクスポートされていないものはインポートできません。
なぜならECMAScriptモジュールはJavaScriptのパース段階で依存関係が解決され、インポートする対象が存在しない場合はパースエラーとなるためです。
デフォルトインポートは、インポート先のモジュールがデフォルトエクスポートをしている必要があります。
同様に名前付きインポートは、インポート先のモジュールが指定した名前付きエクスポートをしている必要があります
同様に名前つきインポートは、インポート先のモジュールが指定した名前つきエクスポートをしている必要があります

### その他の構文 {#other-syntax}

ECMAScriptモジュールには名前付きとデフォルト以外にもいくつかの構文があります
ECMAScriptモジュールには名前つきとデフォルト以外にもいくつかの構文があります

#### 再エクスポート {#re-export}

再エクスポートとは、別のモジュールからインポートしたものを、改めて自分自身からエクスポートしなおすことです
再エクスポートとは、別のモジュールからインポートしたものを、改めて自分自身からエクスポートし直すことです
複数のモジュールからエクスポートされたものをまとめたモジュールを作るときなどに使われます。

再エクスポートは次のように`export`文のあとに`from`を続けて、別のモジュール名を指定します。
Expand All @@ -131,7 +131,7 @@ ECMAScriptモジュールには名前付きとデフォルト以外にもいく

#### すべてをインポート {#namespace-import}

`import * as`構文は、すべての名前付きエクスポートをまとめてインポートします
`import * as`構文は、すべての名前つきエクスポートをまとめてインポートします
この方法では、モジュールごとの **名前空間** となるオブジェクトを宣言します。
エクスポートされた変数や関数などにアクセスするには、その名前空間オブジェクトのプロパティを使います。
また、先ほどのとおり、`default` という固有名を使うとデフォルトエクスポートにもアクセスできます。
Expand Down
2 changes: 1 addition & 1 deletion source/basic/module/src/default-import-with-named.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// myModuleとしてデフォルトインポートし、
// fooを名前付きインポートする
// fooを名前つきインポートする
import myModule, { foo } from "./my-module.js";
console.log(foo); // => "foo"
console.log(myModule); // => { baz: "baz" }
2 changes: 1 addition & 1 deletion source/basic/module/src/named-export-alias.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const internalFoo = "foo";
// internalFoo変数をfooとして名前付きエクスポートする
// internalFoo変数をfooとして名前つきエクスポートする
export { internalFoo as foo };

2 changes: 1 addition & 1 deletion source/basic/module/src/named-export-declare.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// 宣言と同時に名前付きエクスポートする
// 宣言と同時に名前つきエクスポートする
export function bar() { };
2 changes: 1 addition & 1 deletion source/basic/module/src/named-export.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
const foo = "foo";
// 宣言済みのオブジェクトを名前付きエクスポートする
// 宣言済みのオブジェクトを名前つきエクスポートする
export { foo };
2 changes: 1 addition & 1 deletion source/basic/module/src/named-import-alias.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
// fooとして名前付きエクスポートされた変数をmyFooとしてインポートする
// fooとして名前つきエクスポートされた変数をmyFooとしてインポートする
import { foo as myFoo } from "./named-export-alias.js";
console.log(myFoo); // => "foo"
2 changes: 1 addition & 1 deletion source/basic/module/src/named-import.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// 名前付きエクスポートされたfooとbarをインポートする
// 名前つきエクスポートされたfooとbarをインポートする
import { foo, bar } from "./my-module.js";
console.log(foo); // => "foo"
console.log(bar); // => "bar"
4 changes: 2 additions & 2 deletions source/basic/module/src/namespace-import.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// すべての名前付きエクスポートをmyModuleオブジェクトとしてまとめてインポートする
// すべての名前つきエクスポートをmyModuleオブジェクトとしてまとめてインポートする
import * as myModule from "./my-module.js";
// fooとして名前付きエクスポートされた値にアクセスする
// fooとして名前つきエクスポートされた値にアクセスする
console.log(myModule.foo); // => "foo"
// defaultとしてデフォルトエクスポートされた値にアクセスする
console.log(myModule.default); // => { baz: "baz" }
10 changes: 5 additions & 5 deletions source/basic/module/src/re-export-invalid.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
// ./my-module.jsのすべての名前付きエクスポートを再エクスポートする
// ./my-module.jsのすべての名前つきエクスポートを再エクスポートする
export * from "./my-module.js";
// ./my-module.jsの名前付きエクスポートを選んで再エクスポートする
// ./my-module.jsの名前つきエクスポートを選んで再エクスポートする
export { foo, bar } from "./my-module.js";
// ./my-module.jsの名前付きエクスポートにエイリアスをつけて再エクスポートする
// ./my-module.jsの名前つきエクスポートにエイリアスをつけて再エクスポートする
export { foo as myModuleFoo, bar as myModuleBar } from "./my-module.js";
// ./my-module.jsのデフォルトエクスポートをデフォルトエクスポートとして再エクスポートする
export { default } from "./my-module.js";
// ./my-module.jsのデフォルトエクスポートを名前付きエクスポートとして再エクスポートする
// ./my-module.jsのデフォルトエクスポートを名前つきエクスポートとして再エクスポートする
export { default as myModuleDefault } from "./my-module.js";
// ./my-module.jsの名前付きエクスポートをデフォルトエクスポートとして再エクスポートする
// ./my-module.jsの名前つきエクスポートをデフォルトエクスポートとして再エクスポートする
export { foo as default } from "./my-module.js";

0 comments on commit fc635a5

Please sign in to comment.