generated at
CJSのprojectをESMに移行する
CJSのprojectをES Modulesに移行する


移行する理由
使用したいpackageがPure ESM packageだと、自身のプロジェクトもESMでないと使用できない
CommonJSからES Modulesを参照できないから
require(ESM)を使えばできるようになった



参考





どこを見れば分かる?一箇所見るだけで分かる?
コード内部の import / require だけ見ても判断できない
例えば、コード上はimportのみを使っていても、babelとかがrequireに変換しているかもしれない
>以下のどちらかに該当すればおそらくNative ESMです。
> package.jsonに "type": "module" の記述があり、拡張子に .js を使っている。
> 拡張子に .mjs を使っている。
Next.js等を使っているときにどうすればよいのかわからない
普通に考えると、下記の手順のようにやれば良い気がしているが、
bundlerを使っているのだから、tsconfigのmoduleResolution node16 より bundler を指定すべき?という気もしてくる
type: module をつけるとライブラリをimportできなくなることがある #??
そんなことあるんだろうか
一部のライブラリを読み込めなくなったけどなんで?
ESMは、ESMもCJSも読み込めるはずだが



手順 ref ref2
TypeScript v4.7以降を使う
package.json での変更
type: "module"を追加する
package.jsonのmain "index.js" を、package.jsonのexports "./index.js" に変える
これは直接的にはESM云々と関係ないはずmrsekut
ただ、mainは機能が限定的だし、exportsは環境の分岐とかもできるからやっとき、
ぐらいのものだと思う
package.jsonのenginesをNode.js v16以降にする
tsconfig.json での変更
tsconfigのmoduleResolution "node16" を指定する
その他のファイルでの変更
拡張子も含めたimpot文に置き換える
例えば
import x from '.';
import x from './index.js'; に変更する
全ての require()/module.export import/export に置き換える
namespace の使用をやめ、 export を使用する





ts-nodeなどのtsを直接実行するやつは個別に対応が必要?
ひえー、だるすぎ