私のpackage.jsonファイルでは、私のnodejs
アプリのタイプがmodule
であることを指定しました。これを行わないと、私はできないようですimport
ステートメントを使用します。これは今のように見える:
{
"name": "...",
"version": "1.0.0",
"description": "....",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "...."
},
"author": "",
"license": "ISC",
"devDependencies": {
"lodash": "^4.17.15"
},
"type": "module"
}
しかし、"type": "module"
をpackage.jsonファイルに追加すると、ReferenceError: require is not defined
エラーが発生するため、require
ステートメントを使用できなくなります。
package.jsonから"type": "module"
行を削除し、すべてのインポートをrequireに書き換えると、すべてがエラーなしで機能します。
import
とrequire
を同じスクリプト内で混合または使用できないことを示す兆候が見つからないようです。ここに何か不足しているのですか、それとも他のバグがありますか?同じスクリプトでこれらの2種類のステートメントを使用するにはどうすればよいですか?
なぜこれが必要になるのは、動的パスに基づいていくつかの構成ファイルをrequire
したいためであり、ファイルが存在する場合のみ、 import
ではできないと思います。
免責事項:私はnodejsサーバー側プログラミングにかなり慣れていないため、この状況に非常に誤って対処している可能性があります。その場合は、なぜ私は上で述べました。
注:このノードスクリプトは、ブラウザからではなく、サーバーターミナルから実行しています。
しかし、_
"type": "module"
_を_package.json
_ファイルに追加すると、_ReferenceError: require is not defined error
_を取得するため、require
ステートメントを使用できなくなります。
正しい。どちらかまたは両方です。 ESM(JavaScriptモジュール、タイプ= "モジュール")またはを使用するか、CJS(CommonJSのようなNode.jsネイティブモジュール、require
)。
しかし、、_type="module"
_を使用している場合:
CJSモジュールは引き続き使用でき、import
ではなくrequire
を介して(または、必要に応じてimport()
[動的インポート]を介して)インポートするだけです。詳細は here および here を参照してください。
createRequire
を使用して、ESMモジュールで使用できるrequire
関数を効果的に取得できます。これにより、...
これが必要になるのは、動的パスに基づいて一部の構成ファイルを
require
したいためであり、ファイルが存在する場合に限り、import
では実行できないと思います。
そのとおり。代わりにcreateRequire
を使用する必要があります(またはreadFile
および_JSON.parse
_)、さらに ここ 。
createRequire
バージョン:
_import { createRequire } from "module";
const require = createRequire(import.meta.url);
const yourData = require("./your.json");
_
通常、ESモジュールを使用するNode.jsコードをトランスパイルするには、Babelが必要です。
しかし、Babelを使用したくない場合:ESモジュールは最新のNode.jsの実験的な機能です。
あなたは3つのものが必要です:
node --experimental-modules app.js