Open7
TypeScript 4.7 変更点 (WIP)
を読んでいく。
ECMAScript Module Support in Node.js
ついに来たという感じ。TS 4.5で入りそうになったけどもうちょっと揉むわ的な感じになりnightlyでのみ利用できたあの機能がついにやってくる。
新しい module
設定の node12
nodenext
を付けると有効化される。
{
"compilerOptions": {
"module": "nodenext",
}
}
type
in package.json
and New Extensions
package.jsonで type
は "module"
"commonjs"
のどちらかをとり、Node.jsが .js
ファイルをどちらのモジュールで解釈するかを決定づける。TSもこれに乗っかり、.ts
.tsx
ファイルがどちらであるかを type
を読んで決定する。
なお、ESMではインポート時に拡張子が必須なため、TSファイルであっても import x from "x.js"
というインポートが必要になる。
New File Extensions
CommonJS Interop
package.json
Exports, Imports, and Self-Referencing
Control over Module Detection
ECMAScriptにモジュールを追加するうえで問題だったのが既存のscriptと新しいmoduleをどう区別するかだった。Node.jsでは .mjs
ファイルをESMと解釈し、またpackage.jsonの type
を見て .js
ファイルの扱いを決める。TypeScriptではimport
export
宣言のあるファイルはmodule、それ以外はscriptとして扱ってきたが、検出方法をNode.jsに合わせる。
そのため、コンパイラオプションに moduleDetection
が追加される。デフォルト値の "auto"
、legacy
、force
の3つの値をとる。
auto
では import/export を見ることはなく、
-
compilerOptions.module
がnode12
nodenext
で、package.jsonのtype
がmodule
のとき -
compilerOptions.jsx
がreact-jsx
で、JSX/TSXファイルのとき
に[1] moduleとして解釈される。
legacy
はTS 4.6以前の挙動に戻す。
force
は .d.ts
以外全部をモジュールとして扱う。
-
andかorかよくわかってないがたぶんorだよな…? ↩︎