MENU

【Node.js】importを使えるようにする

更新日:2022/09/16

Node.jsでモジュールを読み込むときはrequire()を使用していましたが、実はECMAScript(ES)のimport構文でも読み込めます。
しかし実際にやってみるとエラーが出るので、面倒に感じてrequire()を使い続けている人が多いのではないでしょうか。

 

そこで今回は、Node.jsでimport構文を使用する方法をお伝えします。

 

エラーの内容

 

まずはエラーの内容を確認するために、次のようなコードを作成しました。

 

test1.js


import { readFileSync } from "fs";
const data = readFileSync("test1.js");
console.log( data.toString() );

 

これをnode.jsで実行してみます。

 


>node test1.js

 

すると、次のようなエラーが表示されました。

 


(node:7624) 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)
test1.js:1
import { readFileSync } from "fs";
^^^^^^

SyntaxError: Cannot use import statement outside a module

 

「エラーだ、めんどくさい」と感じますが、読んでみると対処法が2つ書いてありますね。

対処法1:package.jsonがある場合

 

一つ目の対処法は、次のメッセージです。

 

"set "type": "module" in the package.json"

 

翻訳すると、次のようになります。

 

「package.jsonに "type": "module" をセットしてください」

 

package.jsonを作成していないケースもあるので、これは作成している時の対処法のようです。

 

npm init で package.json を作成して、"type": "module" を追加してみます。

 

package.json


{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "test1.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

 

もう一度、node.jsで実行してみます。

 


>node test1.js

 

今度は、エラーが出ませんでした。

 

実行結果


import { readFileSync } from "fs";
const data = readFileSync("test1.js");
console.log( data.toString() );

対処法2:package.jsonがない場合

 

一つ目の対処法は、次のメッセージです。

 

"use the .mjs extension"

 

翻訳すると、次のようになります。

 

「拡張子に .mjs を使用してください」

 

対処法1で作成した package.json を削除して、test1.js をコピペしてファイル名を test1.mjs に変更してみます。

 

test1.js → test1.mjs

 

test1.mjs を node.jsで実行してみます。

 


>node test1.mjs

 

エラーが表示されずに、対処法1と同じ結果になりました。

 

実行結果


import { readFileSync } from "fs";
const data = readFileSync("test1.js");
console.log( data.toString() );

 

Node.jsの古いバージョンはnode実行時に--experimental-modulesオプションが必要だったようです。

 

古いNode.jsでの実行


>node --experimental-modules test1.mjs

 

現在は必要ありません。

 

 

ここでは package.json を削除していますが、"type": "module" をセットしてある状態で、mjs拡張子を使用しても問題ありません。

スポンサーリンク

記事の内容について

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

OFUSEを設置してみました。
応援いただけると嬉しいです。

このサイトは、リンクフリーで大歓迎です。