ES6のexport/import構文をScalaと比べながら解説


ES6ではexport
とimport
が追加されてモジュール化が明示的にできるようになりました。
自分はサーバサイドをScalaで書いているのですが、
Scalaのimport
などと比べると、ES6は結構違ったので、
気づいた点をまとめてみました。
> ファイル名が明示的ファイル名が明示的
ScalaやGoにはコンパイルがあるので、importを宣言する場合ファイル名を指定する必要がないが、ES6ではimportするときファイル名を明示する必要になる。
つまり、Scalaのimport Foo
はES6ではimport Foo from "./Foo"
となる。これはどうしようもない。同じスクリプト言語のPHPですらオートローダーがあるのに…。
> ES6は"public"であることを明示する派ES6は"public"であることを明示する派
ScalaにもES6にもパッケージのプライバシーがあるが、公開・非公開どちらを明示的にするかの戦略が異なる。Scalaはデフォルトでpublicになり、非公開をprivate
キーワードで明示する。一方、ES6はデフォルトがprivateで、公開するものをexport
キーワードで明示する。
> privateprivate
Scalaでは公開がデフォルトなので、非公開は明示する。
private class Foo
ES6では非公開がデフォルト。
class Foo {}
> publicpublic
Scalaでは公開がデフォルト。
class Foo
ES6は非公開がデフォルトなので、公開はexport
で明示する。
export class Foo {}
> exportのバリエーションexportのバリエーション
exportのしかたにもバリエーションがある。
> export defaultexport default
ある変数をモジュールとして公開する。1ファイル、1クラス向き?
export default class Hello {
greeting() {
console.log("hello!");
}
}
import Hello from "./Hello";
new Hello().greeting();
> exportexport
変数をモジュールのメンバとして公開する。クラスに名前をつけてexportするとき。
export class Hello {
greeting() {
console.log("hello!");
}
}
export class GutenTag {
greeting() {
console.log("Guten Tag!");
}
}
import {Hello, GutenTag} from "./Hello";
new Hello().greeting();
new GutenTag().greeting();
> export {...}export {...}
変数をモジュールのメンバとして公開する。クラスに名前をつけて、あとでまとめてexportするとき。
class Hello {
greeting() {
console.log("hello!");
}
}
class GutenTag {
greeting() {
console.log("Guten Tag!");
}
}
export {Hello, GutenTag};
import {Hello, GutenTag} from "./Hello";
new Hello().greeting();
new GutenTag().greeting();
> export { ... as ... }export { ... as ... }
変数をモジュールのメンバとして公開する。名前を変えて公開する場合に使う。
class GreetingInEnglish {
greeting() {
console.log("hello!");
}
}
export {GreetingInEnglish as Hello};
import {Hello} from "./Hello"
new Hello().greeting();
> importのバリエーションimportのバリエーション
> import ... from "..."import ... from "..."
最も典型的なimport宣言。
import Hello from "./Hello";
Hello.jsがHello
をexport default
している場合にだけ使える。
> import { ... } from "..."import { ... } from "..."
これも典型的なimport宣言。
import { Hello } from "./Hello";
Hello.jsがHello
を単にexport
している場合にだけ使える。
> import { ..., ... } from "..."import { ..., ... } from "..."
同じファイルから、いくつか一度にimportする宣言。
import {Hello, GutenTag} from "./Hello";
上のコードは下と同じ。
import {Hello} from "./Hello";
import {GutenTag} from "./Hello";
> import { ... as ... } from "..."import { ... as ... } from "..."
名前を変えてimportする宣言。
import {Hello as EnglishGreeting} from "./Hello";
new EnglishGreeting().greeting();
Scalaのimport {Foo => Bar}
のようなもの。
> import * as ... from "..."import * as ... from "..."
モジュールまるごと名前を変えてimportするケース。
import * as Greetings from "./Hello";
new Greetings.Hello().greeting();
new Greetings.GutenTag().greeting();
> まとめまとめ
- ES6の
import
はファイル名を明示する必要あり - ES6は"public"であることを明示する(デフォルトはprivate)
- ScalaとES6でだいぶ書き方が違う
解説に間違っている部分があれば教えて下さい!