はじめに
imagemin
をnode.jsで実行すると怒られた。
const imagemin = require('imagemin')
const imageminMozjpeg = require('imagemin-mozjpeg')
const imageminPngquant = require('imagemin-pngquant')
imagemin(...略)
const imagemin = require('imagemin')
^
Error [ERR_REQUIRE_ESM]: require() of ES Module
Instead change the require of index.js in imagemin.js to a dynamic import() which is available in all CommonJS modules.
「import
で読み込んでね」と怒られている。
import
で読み込んで実行する。
import imagemin from 'imagemin'
import imageminMozjpeg from 'imagemin-mozjpeg'
import imageminPngquant from 'imagemin-pngquant'
imagemin(...略)
(node:65499) Warning: To load an ES module,
set "type": "module" in the package.json or use the .mjs extension.
再び怒られる。
「package.json
に"type": "module"
を追加するか、拡張子を.mjs
に変更してね」と言われている。
import imagemin from 'imagemin'
import imageminMozjpeg from 'imagemin-mozjpeg'
import imageminPngquant from 'imagemin-pngquant'
imagemin(...略)
done!!
何がどうなっているのか
imagemin
のv8系からESM
のみサポートしている模様。
require
で読み込むことができないのでimport
で読み込む必要がある。
また、node.jsで実行するには拡張子を.mjs
にするか、packege.json
に"type": "module"
を追加する必要がある。
packege.json
に"type": "module"
を追加するときは注意が必要で、そのプロジェクト内のrequire
を全てimport
での読み込みに修正する必要がある。
そうすると__dirname
などが使えなくなる。
個人的にはESM
のパッケージをnode.jsで動かす場合は.mjs
にしています。
ESM?
node.js v12からESM
をデフォルトでサポートしていた。
nodeのコミュニティでもESM
に統一していこうみたいな雰囲気になっている。
ES modulesとCommonJSの話を書くと長くなるので、おすすめの書籍を貼っておきます。
この辺りはJSの歴史を遡って全体像を把握した方が幸せになります。
まとめ
node.jsで実行するライブラリは脳死でrequire
しがちだったので色々と勉強になった。
参考資料