web-dev-qa-db-ja.com

require()がモジュールタイプのnodejsスクリプトで機能しない

私の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に書き換えると、すべてがエラーなしで機能します。

importrequireを同じスクリプト内で混合または使用できないことを示す兆候が見つからないようです。ここに何か不足しているのですか、それとも他のバグがありますか?同じスクリプトでこれらの2種類のステートメントを使用するにはどうすればよいですか?

なぜこれが必要になるのは、動的パスに基づいていくつかの構成ファイルをrequireしたいためであり、ファイルが存在する場合のみ、 importではできないと思います。

免責事項:私はnodejsサーバー側プログラミングにかなり慣れていないため、この状況に非常に誤って対処している可能性があります。その場合は、なぜ私は上で述べました。

注:このノードスクリプトは、ブラウザからではなく、サーバーターミナルから実行しています。

5
Adam Baranyai

しかし、_"type": "module"_を_package.json_ファイルに追加すると、_ReferenceError: require is not defined error_を取得するため、requireステートメントを使用できなくなります。

正しい。どちらかまたは両方です。 ESM(JavaScriptモジュール、タイプ= "モジュール")またはを使用するか、CJS(CommonJSのようなNode.jsネイティブモジュール、require)。

しかし、、_type="module"_を使用している場合:

  1. CJSモジュールは引き続き使用でき、importではなくrequireを介して(または、必要に応じてimport() [動的インポート]を介して)インポートするだけです。詳細は here および here を参照してください。

  2. 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");
_
5
T.J. Crowder

通常、ESモジュールを使用するNode.jsコードをトランスパイルするには、Babelが必要です。

しかし、Babelを使用したくない場合:ESモジュールは最新のNode.jsの実験的な機能です。

あなたは3つのものが必要です:

  1. 最新のNode.js
  2. "type": "module"をpackage.jsonに追加します
  3. Node.jsを実行するときに実験的なフラグを追加node --experimental-modules app.js
0
Sergii Shvager