TypeScriptを書いていて、たまにimport
出来なかったりして、そしたらrequire
したりとか、モジュールのインポートはふんいきでやっていたんですが、TypeScriptで古いJSのライブラリの型定義を書いていて気持ち悪かったので、調べました。
2つのモジュールインポート方法
CommonJS (Node.js)
インポート方法
require
エクスポート方法
module.export
export
exportとmodule.exportの違い
例えば、require("some-module")
とすると、id="some-module"
で以下のようなコードが呼ばれる
const module = new Module(id)
(function(export, module) {
/* モジュール本体のコードがここに差し込まれる */
return module.export
}(module.export, module)
export
と、module.export
はモジュールが評価される関数への引数で、export
は、module.export
オブジェクトへのポインタ、関数が返しているmodule.export
は、引数で渡されているmodule
のexport
プロパティなので、モジュール内でexport
を上書きすると、export
が元のオブジェクトを指さなくなるので、期待通りに動かない。同じ理由で、moduleを上書きしてしまってもダメ。
ES6
インポート方法
個別
import { x } from "module"
import * as x from "module"
export default
されたもの
import x from "module"
エクスポート方法
個別
export x
なにか1つだけexport
したい場合
export default x
TypeScriptとJavaScriptでの違い
ない
どちらを使うか
インポートしたいモジュールが使っているやり方に合わせる。
まとめ
適当にimport
やらrequire
していたのを、webpack
がきれいにしてくれていたんですね。わかってよかった。