115

npm 経由でインストールされたモジュールが必要です。そのモジュールに従属する .js ファイルにアクセスしたい (その中でコンストラクター メソッドをサブクラス化できるようにするため)。モジュールのコードを変更することはできません (したくありません)。そのため、その __dirname を抽出する場所がありません。

次の質問は承知していますが、それは、コードを制御できるモジュールのパスを取得することに関するものです (したがって、__dirname が解決策です): Node.js では、このモジュールのパスをどのように伝えることができますか?

~~~

さらに良いのは、モジュールのロードされたモジュール情報を取得することです

4

7 に答える 7

152

あなたの質問を正しく理解できたら、require.resolve()を使用する必要があります。

内部の require() 機構を使用してモジュールの場所を検索しますが、モジュールをロードするのではなく、解決されたファイル名を返すだけです。

例:var pathToModule = require.resolve('module');

于 2012-04-12T10:06:00.143 に答える
4

参考までrequire.resolveに、CommonJS に従ってモジュール識別子を返します。node.js では、これはファイル名です。webpack では、これは数字です。

webpackの状況では、モジュールパスを見つけるための私の解決策は次のとおりです:

const pathToModule = require.resolve('module/to/require');
console.log('pathToModule is', pathToModule); // a number, eg. 8
console.log('__webpack_modules__[pathToModule] is', __webpack_modules__[pathToModule]);

すると、__webpack_modules__[pathToModule]以下のような情報が得られました。

(function(module, exports, __webpack_require__) {

    eval("module.exports = (__webpack_require__(6))(85);\n\n//////////////////\n// 
    WEBPACK FOOTER\n// delegated ./node_modules/echarts/lib/echarts.js from dll-reference vendor_da75d351571a5de37e2e\n// module id = 8\n// module chunks = 0\n\n//# sourceURL=webpack:///delegated_./node_modules/echarts/lib/echarts.js_from_dll-reference_vendor_da75d351571a5de37e2e?");

    /***/
})

更新されたモジュール ファイルが期待どおりに動作しないように、以前の dll ビルド ファイルからの古いスクリプトが必要であることが判明しました (ビルド速度を向上させるため)。最後に、dll ファイルを再構築し、問題を解決しました。

参照:解決されたファイル パス (ノード) を取得するために使用require.resolve

于 2018-05-22T08:52:55.363 に答える
2

@anatoliy ソリューションによると、MacOS XI ではルックアップ パスが実行されていることがわかりました。

require('module')._resolveLookupPaths('myModule')

だから私は解決されたルックアップパスを取得します

[ 'myModule',
  [ '/Users/admin/.node_modules',
    '/Users/admin/.node_libraries',
    '/usr/local/lib/node' ] ]

一方、

require('module')._resolveFilename('myModule')

とにかく探していたモジュールを解決しません。実際、クレイジーなことは_load、モジュールが解決されないことです:

> require('module')._load('myModule')
Error: Cannot find module 'myModule'
    at Function.Module._resolveFilename (module.js:440:15)
    at Function.Module._load (module.js:388:25)
    at repl:1:19
    at sigintHandlersWrap (vm.js:32:31)
    at sigintHandlersWrap (vm.js:96:12)
    at ContextifyScript.Script.runInContext (vm.js:31:12)
    at REPLServer.defaultEval (repl.js:308:29)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.<anonymous> (repl.js:489:10)

一方、require意志:

> require('myModule')

しかし、私はこのモジュールを持っていません

myProject/node_modules/
myProject/node_modules/@scope/
/usr/local/lib/node_modules/
/usr/local/lib/node_modules/@scope
/usr/local/lib/node_modules/npm/node_modules/
/usr/local/lib/node_modules/npm/node_modules/@scope
$HOME/.npm/
$HOME/.npm/@scope/

このモジュールはどこですか?

最初に私はやらなければならなかった$ sudo /usr/libexec/locate.updatedb それからコーヒーを飲んだ後、私はやったlocate myModuleかそれ以上locate myModule/someFile.js

ほら、それは私のプロジェクトの親フォルダー、つまりプロジェクトのルートフォルダーの外にあることがわかりました。

$pwd
/Users/admin/Projects/Node/myProject
$ ls ../../node_modules/myModule/

だからあなたは避けられないrm -rf ../../node_modules/myModule/と 新鮮なnpm install.

npm私のコンピューターをスキャンして、実行するはずだったプロジェクトのルートフォルダー以外の場所、またはデフォルトのモジュール検索パスでモジュールを検索するように指示された人は誰もいなかったと主張できます。

于 2016-08-04T10:47:53.113 に答える
2

モジュールのエントリ ポイント ファイルを取得するという、あなたのニーズを正しく理解していることを願っています。jugglingdbモジュールのエントリポイントを取得したいとしましょう:

node
> require('module')._resolveFilename('jugglingdb')
'/usr/local/lib/node_modules/jugglingdb/index.js'

ご覧のとおり、これはモジュールに関するこの種の情報を取得する「公式」の方法ではないため、この関数の動作はバージョンごとに異なる場合があります。ノードソースで見つけました: https://github.com/joyent/node/blob/master/lib/module.js#L280

于 2012-04-11T19:48:09.783 に答える
2

これはおそらくあなたが探しているものです、チェックしてください:

require.main.filename

于 2018-04-15T05:27:37.960 に答える