node.JS에서 내가로드 한 모듈의 경로를 어떻게 얻을 수 있습니까? (예 : 일부 node_module에서)
npm을 통해 설치된 모듈이 필요합니다. 해당 모듈에 종속 된 .js 파일에 액세스하고 싶습니다 (그래서 생성자 메서드를 하위 클래스로 만들 수 있습니다). 모듈의 코드를 수정할 수 없습니다 (글쎄요, 원하지 않음). 따라서 __dirname을 추출 할 장소가 없습니다.
다음 질문을 알고 있지만 코드 제어 권한이있는 모듈의 경로를 얻는 것입니다 (따라서 __dirname이 해결책입니다). Node.js에서`this` 모듈의 경로를 어떻게 알 수 있습니까?
~~~
모듈의로드 된 모듈 정보를 얻는 것이 더 좋습니다.
질문을 올바르게 이해했다면 require.resolve () 를 사용해야합니다 .
내부 require () 기계를 사용하여 모듈의 위치를 찾되 모듈을로드하는 대신 확인 된 파일 이름을 반환하십시오.
예: var pathToModule = require.resolve('module');
require.resolve () 는 부분적인 대답입니다. 허용되는 답변은 많은 노드 모듈에서 작동 할 수 있지만 모두 작동하지는 않습니다.
require.resolve("moduleName")
모듈이 설치된 디렉토리를 제공하지 않습니다. main
모듈의 속성에 정의 된 파일의 위치를 제공합니다 package.json
.
그럴 수도 있고 moduleName/index.js
그럴 수도 있습니다 moduleName/lib/moduleName.js
. 후자의 경우 path.dirname(require.resolve("moduleName"))
원하지 않거나 기대하지 않는 디렉토리를 반환합니다.node_modules/moduleName/lib
특정 모듈에 대한 전체 경로를 얻는 올바른 방법은 파일 이름을 확인하는 것입니다.
let readmePath = require.resolve("moduleName/README.md");
모듈에 대한 디렉토리 만 원하면 (아마도 많은 path.join()
호출 을하게 될 것입니다. ) package.json
항상 프로젝트의 루트에 있어야하는를 해결하고 다음으로 전달합니다 path.dirname()
.
let packagePath = path.dirname(require.resolve("moduleName/package.json"));
나는 당신의 요구를 올바르게 이해하기를 바랍니다 : 일부 모듈의 진입 점 파일을 얻으려면. 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
@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
et voilà, 그것은 내 프로젝트의 상위 폴더, 즉 내 프로젝트 루트 폴더 외부에 있음을 알 수 있습니다.
$pwd
/Users/admin/Projects/Node/myProject
$ ls ../../node_modules/myModule/
그래서 당신은 피할 수없고 rm -rf ../../node_modules/myModule/
신선한 npm install
.
npm
실행해야 할 프로젝트 루트 폴더 또는 기본 모듈 검색 경로 이외의 모듈을 검색 할 때 컴퓨터를 검색 하도록 지시 한 사람은 아무도 없다고 주장 할 수 있습니다 .
이것은 아마도 당신이 찾고있는 것일 수 있습니다.
require.main.filename
FYI, require.resolve
returns the module identifier according to CommonJS. In node.js this is the filename. In webpack this is a number.
In webpack situation, here is my solution to find out the module path:
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]);
Then from __webpack_modules__[pathToModule]
I got information like this:
(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?");
/***/
})
Turned out I required old scripts from previous dll build file(for faster build speed), so that my updated module file didn't work as I expected. Finally I rebuilt my dll file and solved my problem.
'programing tip' 카테고리의 다른 글
대문자 대 소문자 (0) | 2020.10.10 |
---|---|
C의 함수에서 여러 값을 반환하려면 어떻게해야합니까? (0) | 2020.10.10 |
관리 방식으로 .NET에서 부모 프로세스를 얻는 방법 (0) | 2020.10.09 |
SD 카드에 쓰기 권한 (0) | 2020.10.09 |
MVC3 ModelState 오류 제거 (0) | 2020.10.09 |