Warning: To load an ES module, set “type”: “module” in the package.json or use the .mjs extension. が発生した時の対処法

javascript

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以上で利用することを推奨します。

\プログラミングを学びたい方におすすめ/


Udemy公式サイト

最後に

今回はjavascriptコードにimportにてライブラリを利用するコードを利用した場合に発生するエラーについて記載しました。一番簡単な解決策はpackage.jsonファイルを編集する方法かと思いますので、是非ご参考までに。

タイトルとURLをコピーしました