Node.js開発で以下のようなエラーが発生しました
(node:21253) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/Users/xxxxxx/Development/TestProject/javacript/nodejs/index.js:1
import dayjs from 'dayjs'
^^^^^^
SyntaxError: Cannot use import statement outside a module
at wrapSafe (internal/modules/cjs/loader.js:1001:16)
at Module._compile (internal/modules/cjs/loader.js:1049:27)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
at Module.load (internal/modules/cjs/loader.js:950:32)
at Function.Module._load (internal/modules/cjs/loader.js:790:12)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
at internal/main/run_main_module.js:17:47
上記エラーは、importを使用した際に発生しました。
import dayjs from 'dayjs'
dayjs().format('YYYY-MM-DD HH:mm')
let odate = dayjs('2022-11-23 10:06').toDate()
console.log(odate)
これは、ES moduleを使用する場合には package.jsonファイルに「”type”: “module”」追記するか、もしくは拡張子を「.mjs」しなければ、動作しませんよ。というメッセージです。
package.jsonにtypeキーを追加
では早速、package.jsonに追加していきます。
{
"name": "nodejs",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"dayjs": "^1.11.4"
},
"type": "module"
}
一番最後の行に追加しました。
再度実行してみます。
$ node index.js
2022-11-23T01:06:00.000Z
エラーが発生せず、正常に動作しました。
.mjs拡張子をつけて実行する
次は 「.mjs」拡張子 をつけて実行してみます。
node index.mjs
2022-11-23T01:06:00.000Z
こちらも問題なく動作しましたね。
Node.jsのバージョンが14未満の場合
Node.jsのバージョンが13.2未満の場合は、「–experimental-modules」引数をつけて実行する必要があります。
実際に試してみます
$ nodebrew use 13.1.0
use v13.1.0
$ node -v
v13.1.0
$ node index.mjs
node index.mjs
internal/modules/cjs/loader.js:912
throw new ERR_REQUIRE_ESM(filename);
^
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /Users/xxxxxxxx/Development/TestProject/javacript/nodejs/index.mjs
at Module.load (internal/modules/cjs/loader.js:912:11)
at Function.Module._load (internal/modules/cjs/loader.js:822:14)
at Function.Module.runMain (internal/modules/cjs/loader.js:1143:12)
at internal/main/run_main_module.js:16:11 {
code: 'ERR_REQUIRE_ESM'
}
普通に実行すると 例外エラーが発生します
では、先程説明した引数をつけて実行してみます。
node --experimental-modules index.mjs
(node:25696) ExperimentalWarning: The ESM module loader is experimental.
2022-11-23T01:06:00.000Z
とりあえず、実行はされました。しかしExperimentalWaringが発生していますね。(13.2以上14未満の場合は引数なしで実行できますがWarningが発生します。)
このWarningですが、バージョン14以上にしないと消えません。もし気になる場合はNode.jsのバージョンを14以上で利用することを推奨します。
\自身のスキルを向上するには技術書で!!/
月額¥980で技術書が読み放題!!
- ビジネススキルとマインド向上したい!!
- 決断や行動を先送りにしてしまう方!!
最後に
今回はjavascriptコードにimportにてライブラリを利用するコードを利用した場合に発生するエラーについて記載しました。一番簡単な解決策はpackage.jsonファイルを編集する方法かと思いますので、是非ご参考までに。