TypeScript Deep Diveを読みながら、学んだことを軽くまとめていく。
import
の使い方について見てみる。
まずCommonJSとES Modulesって何?
JavaScriptをモジュールとして扱うために、定められたモジュールの仕様のこと。
-
CommonJS
はNode.jsで用いられていて、サーバーサイドなどブラウザ外を中心に扱われる仕様。 -
ES Modules
は主なブラウザで対応している。最近の主流になっていくらしい。
TypeScriptにおいてはmodule
オプションに応じて異なるJavaScriptが生成される。
どちらも使える環境が異なるため、CommonJSをブラウザで使う場合やES ModulesをNodeで使う場合などはひと手間挟む必要がある。
importとrequireって何が違う?
CommonJS
の仕様か、ES Modules
の仕様かの違い。
-
CommonJS
においてはrequire()を用いてモジュールを読み込む。
const a = require("./testModule");
-
ES Modules
においてはimportを用いてモジュールを読み込む。
// importを用いてモジュールを読み込む。
import {b} from "./testModule";
この際、import
では何らかの型情報を持って読み込むが、require()
ではany
型の変数を定義することになるため、VScodeの補完などが効きづらくなる。TypeScriptを扱う上ではできるだけimport
を使うべき。
ESモジュールの書き方
エクスポートを行う際は変数、型の定義をexportを前において行う。
export let a = 1;
export let b = 2;
export let testfunc = () => {
console.log("hello world!");
}
こう書いても同じ。
let a = 1;
let b = 2;
let testfunc = () => {
console.log("hello world!");
}
export{
a,
b,
testfunc
}
名前を指定してexportもできる。
export{
a as a_,
b as b_,
testfunc as testfunc_
}
インポートを行う際はimport
を使用する。
import {a, b, testfunc} from "./module";
console.log(a); // 1
console.log(b); // 2
testfunc(); // hello world!
名前を変更してimportすることもできる。
import {a as a_, b as b_, testfunc as testfunc_} from "./module";
*
を用いて全てのモジュールをimport
することもできる。
import * as m from "./module";
console.log(m.a);
m.testfunc();
ちなみにrequire
でも同じような使い方ができる。
const m = require("./module");
console.log(m.a);
m.testfunc();
ここから再度エクスポートなどもできる。
export * from './foo';
デフォルトエクスポート
defaultを指定してエクスポートができる。
let a;
export default a = 1
import a from "./module";
console.log(a); // 1
ただしdeep dive内ではexport default
は有害、使うなと様々な理由で言われている。
残り
↑記事内では、指定するパスの解決方法についての記述や、import foo = require('foo');
といった型だけをimportする手法も紹介されているが、ここに書くのは省略する。